Вы, вероятно, что делает его более сложным, чем это должно быть.
Начнем с расчета красных стрелок. Для любого отрезка (p_i, p_j)
, мы можем вычислить сегмент нормаль с:
dir = normalize(p_j - p_i)
normal = (-dir.y, dir.x) //negate if you want the other direction
В точке соединения между двумя сегментами, мы можем только в среднем (и повторно нормализует) падающие нормали. Это дает нам красные стрелки.
Единственный оставшийся вопрос заключается в том, сколько нужно сдвинуть. Получаемое смещение для сегмента линии o_l
заданного смещения вершины o_v
является:
o_l = o_v * dot(normal_l, normal_v)
Это означает следующее: Оба нормалей единичные векторы. Следовательно, их точечный продукт не более одного. Это тот случай, когда оба сегмента линии параллельны. Затем все смещение вершины переносится в линию. Чем меньше угол становится, тем меньше становится переданным смещением. Например. если угол между двумя последовательными отрезками линии равен 120 °, то точечный продукт нормалей равен 0,5. Если вы переместите вершину на 1 единицу вдоль ее нормали, оба сегмента линии будут иметь толщину 0,5.
Итак, для того, чтобы произвести толщину определенной линии (o_l
), нам нужно сместить вершину, o_v
:
o_v = o_l/dot(normal_l, normal_v)
Конструкция с усреднением нормальных Гарантирует сегментов линии нормальной для вершины, что dot(normal_l1, normal_ v) = dot(normal_l2, normal_v)
, т. е. результирующая толщина линии одинакова для обеих линий в любом случае.
Это похоже на математический вопрос, а не на вопрос программирования. – khelwood
Хорошо, спасибо, теперь я разместил его на math stackexchange, но я думаю, что люди все равно могут предоставить мне некоторые алгоритмы или предложения по правильному пути на SO. Я пытаюсь решить это уже более недели, и я прямо сейчас. – user3246822
В чем проблема с тем, что у вас есть сейчас? Что бы вы хотели иметь в итоге? Мне кажется, что вы еще не полностью ответили на эти вопросы. – hdl