Как рассчитать конечные точки перпендикулярных отрезков? - PullRequest
10 голосов
/ 17 декабря 2009

Я знаю конечные точки отрезка и расстояние / размер перпендикулярных заглушек, которые я хотел бы создать, но мне нужно рассчитать конечные точки перпендикулярной линии. Я бился головой о стену, используя 45-45-90 треугольников и точечные продукты, но я просто не могу заставить ее сойтись.

Я знаю точки в синем и расстояние до точек в красном, мне нужно найти точки в красном.

Прежде чем пометить как дубликат, я попытался ответить на вопрос в на этот вопрос , но это привело к тому, что заглушки всегда были вертикальными.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

Ответы [ 3 ]

16 голосов
/ 17 декабря 2009

Если B1 - синяя точка между 2 красными точками, а B2 - другая синяя точка, то способ сделать это:

  • Найти B1 - B2
  • Нормализовать этот вектор
  • Затем масштабируйте этот вектор на половину расстояния между красными точками
  • Поворот на 90 градусов
  • Добавить этот вектор в B1 (это R1)
  • Вычтите этот вектор из B1 (это R2)

Все вышеперечисленное довольно просто - самым хитрым было бы выяснение, как записать это в тексте!

Хотя это может быть полезно - матрица поворачивается на 90 градусов:

[ 0  -1 ]
[ 1   0 ]
8 голосов
/ 17 декабря 2009

Самый простой способ обойти это - не думать о наклоне m, а об изменении x и y, которое я называю dx, dy (из обозначений исчисления). Причина в том, что работа с уклоном для вертикальной линии бесконечна, и в любом случае вам не нужно использовать функции триггера, этот код будет быстрее и проще.

dx = x2 - x1;
dy = y2 - y1;

Я предполагаю, что точка 2 является пересечением желаемой линии.

Итак, перпендикулярная линия имеет наклон с отрицательной обратной величиной первой. Есть два способа сделать это:

dx2 = -dy
dy2 = dx

или

dx2 = dy
dy2 = -dx

это соответствует двум направлениям: одно поворачивает направо, а другое налево.

Однако dx и dy масштабируются до длины исходного отрезка. Ваш перпендикуляр имеет другую длину.

Вот длина между двумя точками:

double length(double x1, double y1, double x2, double y2) {
 return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}

Делай, что хочешь, чтобы перейти на ту или иную сторону:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy);
double dx2 = -dy * scale;
double dy2 = dx * scale

и снова то же самое для другой стороны. Я только что понял, что мой пример немного с ++, так как я использовал sqrt, но различия тривиальны. Обратите внимание, что вы можете написать код более эффективно, комбинируя квадратные корни.

3 голосов
/ 17 декабря 2009

Вы знаете наклон синей линии, назовем его m. А линия, перпендикулярная синей линии, будет иметь наклон -1/m.

для нахождения координаты x вам понадобится триггер, sine \theta = d / delta_x, где \ theta - угол синей линии для оси x, а d - расстояние до одной из красных точек от синей точки. Затем добавьте / вычтите delta_x к x-координате синей точки, к которой вы хотите, чтобы линия была перпендикулярна. Теперь вы можете использовать формулу точка-наклон, чтобы вычислить координату y.

...