Похоже, быстрый и простой вопрос, но я не смог найти именно то, что я ищу, так:
Как рассчитать вектор единичной длины, который указывает вдоль линии, которая составляет точно 50% угла двух соединенных отрезков линии?
Картинка говорит тысячи слов (что также лучше, чем моё объяснение!).
Поэтому в основном я хочу вычислить синий единичный вектор с учетом двух отрезков красной линии (которые на самом деле представляют собой 3 точки и поэтому гарантированно будут соединены)
Красные сегменты имеют произвольную длину, и результат не должен быть единицей, мне было бы проще.
Также было бы удобно иметь способ заставить результирующий вектор указывать в определенном направлении (относительно входных сегментов), это не является существенным, так как я думаю, что я могу решить это - поскольку сегменты входных линий в конечном итоге образуются н-гон.
Любые примеры были бы идеальными в C ++, но другие языки приветствуются.
Большое спасибо за любые указатели.
источник
Я думаю, что вы можете получить направление, чтобы быть последовательным, рассматривая это, как будто вы генерируете 2D нормаль вершины. Это:
Возьмите каждый из красных векторов, поменяйте местами компоненты x и y и отрицайте один из них, чтобы создать нормали.
Нормализуй их.
Суммируйте эти два вектора и перенормируйте.
Вы, вероятно, также захотите проверить случай, когда две красные линии перекрывают друг друга - окончательная перенормировка попытается разделить на ноль.
источник
Пусть A и B будут вашими векторами:
Векторы суммирования не обязательно должны быть единичными векторами, а просто равными по длине, поэтому, если | A | > = | B |, вы можете:
который является более численно устойчивым, так как у вас есть только дробь и больший знаменатель
Тот же результат можно получить вычитанием, еще раз векторы должны быть равны по длине
Это работает только для невыпуклых углов; Вы можете просто проверить, является ли ваш угол выпуклым, и умножить H на -1
источник