Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 26.03.2015, 14:32
fresh.flash вне форума Посмотреть профиль Отправить личное сообщение для fresh.flash Посетить домашнюю страницу fresh.flash Найти все сообщения от fresh.flash
  № 1  
Ответить с цитированием
fresh.flash

Регистрация: Sep 2009
Адрес: Николаев
Сообщений: 26
Записей в блоге: 1
По умолчанию Направление обхода точек многоугольника, перспектива помещения(вид сверху)

Добрый день! Есть массив точек, который образует непересекающийся многоугольник. Точки даны по порядку(добавляет пользователь), т.е. первая и вторая точки образуют сторону многоугольника. Это пол помещения. Нужно нарисовать вид сверху с перспективами стен:


Это пример для прямоугольника.
Рабочий код, который определяет точки со сдвигом в зависимости от высоты помещения:
Код AS3:
for (var j:uint = 0; j < length; j++) {
	//находим текущую, прошлую и следующую точку
	_currPoint = points[j];
	if (j < points.length - 1)
		_nextPoint = points[j + 1];
	else
		_nextPoint = points[0];
	if (j == 0)
		_prevPoint = points[points.length - 1];
	else
		_prevPoint = points[j - 1];
	//находим отрезки, биссектрису
	norm1 = _currPoint.subtract(_prevPoint);
	norm1.normalize(1);
	norm2 = _currPoint.subtract(_nextPoint);
	norm2.normalize(1);
	bisectrix = norm1.add(norm2);
	//направление обхода
	cw = (_currPoint.x - _prevPoint.x) * (_nextPoint.y - _currPoint.y) - (_currPoint.y - _prevPoint.y) * (_nextPoint.x - _currPoint.x) > 0;
	if (!cw)
		bisectrix.normalize(h);
	else
		bisectrix.normalize( -h);
	//умножаем вектор биссектрисы на высоту стен
	normRatio = h / Math.abs(bisectrix.x * norm1.y - bisectrix.y * norm1.x);
	bisectrix.x *= normRatio;
	bisectrix.y *= normRatio;
	_pointsOffset.push(_currPoint.add(bisectrix));
}
Работает исправно и для сложных многоугольников (хотя такие вряд ли встретятся):


НО! Проблема 1: точки должны добавляться против часовой стрелки, если по часовой добавляешь - стены рисуются внутрь помещения и получается каламбур:


Проблема 2: если точки лежат на одной прямой - неправильно определяется биссектриса(на картинке ниже верхний отрезок многоугольника состоит из двух):


Буду благодарен за любую помощь как решить эти проблемы.

Код родился из этой темы.


Последний раз редактировалось fresh.flash; 26.03.2015 в 14:35. Причина: изменил название
Создать новую тему   Часовой пояс GMT +4, время: 15:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
AS3 , вектор , многоугольник , точка

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:58.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.