fresh.flash
26.03.2015, 14:32
Добрый день! Есть массив точек, который образует непересекающийся многоугольник. Точки даны по порядку(добавляет пользователь), т.е. первая и вторая точки образуют сторону многоугольника. Это пол помещения. Нужно нарисовать вид сверху с перспективами стен:
http://img.sc/img/7fa38eb4c5559263f332b4b232e24f74.jpg
Это пример для прямоугольника.
Рабочий код, который определяет точки со сдвигом в зависимости от высоты помещения:
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));
}
Работает исправно и для сложных многоугольников (хотя такие вряд ли встретятся):
http://img.sc/img/ebef9450dc7f95a80b543e1e7ac92858.jpg
НО! Проблема 1: точки должны добавляться против часовой стрелки, если по часовой добавляешь - стены рисуются внутрь помещения и получается каламбур:
http://img.sc/img/28d8f5c383dce46adf9ee427918bdb32.jpg
Проблема 2: если точки лежат на одной прямой - неправильно определяется биссектриса(на картинке ниже верхний отрезок многоугольника состоит из двух):
http://img.sc/img/9de1a7977b2663faaad1d960503e3fd7.jpg
Буду благодарен за любую помощь как решить эти проблемы.
Код родился из этой темы. (http://www.flasher.ru/forum/showthread.php?t=203076&page=6)
http://img.sc/img/7fa38eb4c5559263f332b4b232e24f74.jpg
Это пример для прямоугольника.
Рабочий код, который определяет точки со сдвигом в зависимости от высоты помещения:
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));
}
Работает исправно и для сложных многоугольников (хотя такие вряд ли встретятся):
http://img.sc/img/ebef9450dc7f95a80b543e1e7ac92858.jpg
НО! Проблема 1: точки должны добавляться против часовой стрелки, если по часовой добавляешь - стены рисуются внутрь помещения и получается каламбур:
http://img.sc/img/28d8f5c383dce46adf9ee427918bdb32.jpg
Проблема 2: если точки лежат на одной прямой - неправильно определяется биссектриса(на картинке ниже верхний отрезок многоугольника состоит из двух):
http://img.sc/img/9de1a7977b2663faaad1d960503e3fd7.jpg
Буду благодарен за любую помощь как решить эти проблемы.
Код родился из этой темы. (http://www.flasher.ru/forum/showthread.php?t=203076&page=6)