Как рассчитать конечные точки перпендикулярных отрезков?
Я знаю конечные точки сегмента линии и расстояние/размер перпендикулярных торцевых крышек, которые я хотел бы создать, но мне нужно вычислить конечные точки перпендикулярной линии. Я ударился головой о стену, используя 45-45-90 треугольников и точечных продуктов, но я просто не могу заставить их собраться вместе.
Я знаю точки в синем и расстояние до красных точек, мне нужно найти красные точки.
Прежде чем отмечать как дубликат, я попробовал ответить в этом вопросе, но это привело к тому, что конечные кепки были всегда вертикальными.
http://rauros.net/files/caps.png http://rauros.net/files/caps.png
Ответы
Ответ 1
Если B1 - синяя точка между двумя красными точками, а B2 - другая синяя точка, то способ сделать это:
- Найти B1 - B2
- Нормализовать этот вектор
- Затем масштабируйте этот вектор на половину расстояния между красными точками
- Повернуть на 90 градусов
- Добавьте этот вектор в B1 (это R1)
- Вычтите этот вектор из B1 (это R2)
Все вышесказанное довольно просто - самый сложный бит будет определять, как записать его в тексте!
Это может быть полезно, хотя - матрица для поворота на 90 градусов:
[ 0 -1 ]
[ 1 0 ]
Ответ 2
Легкий путь вокруг этого - не думать в терминах наклона 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
Вы знаете наклон синей линии, назовите ее m
. Линия, перпендикулярная синей линии, будет иметь наклон -1/m
.
чтобы найти координату x, вам нужен какой-то триггер, sine \theta = d / delta_x
, где \theta - угол синей линии для оси x, а d - расстояние до одной из красных точек от синей точки. Затем добавьте/вычтите delta_x
в координату x синей точки, в которой вы хотите, чтобы линия была перпендикулярна. Теперь вы можете использовать формулу наклона точки, чтобы определить координату y.