2015-09-21 3 views
0

Я создаю массив вершин для сетки с заданными точками. До сих пор мне удалось создать сплошную сетку с толщиной. Однако на пересечении двух сегментов линии возникает проблема , векторы между размерами этого сегмента должны быть больше или меньше в зависимости от ситуации, чтобы иметь постоянный вид.Найти длину вектора на основе правила

Что я сейчас:

What I have now


с заданными углами theta1 и theta2, как я могу вычислить длину красных векторов?

Что я хочу: What I want


Как я структурировал свою сетку: How I structured my mesh

+0

Это похоже на математический вопрос, а не на вопрос программирования. – khelwood

+0

Хорошо, спасибо, теперь я разместил его на math stackexchange, но я думаю, что люди все равно могут предоставить мне некоторые алгоритмы или предложения по правильному пути на SO. Я пытаюсь решить это уже более недели, и я прямо сейчас. – user3246822

+0

В чем проблема с тем, что у вас есть сейчас? Что бы вы хотели иметь в итоге? Мне кажется, что вы еще не полностью ответили на эти вопросы. – hdl

ответ

1

Вы, вероятно, что делает его более сложным, чем это должно быть.

Начнем с расчета красных стрелок. Для любого отрезка (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) , т. е. результирующая толщина линии одинакова для обеих линий в любом случае.

Смежные вопросы