Как вычислить конечные точки перпендикулярных линейных сегментов?

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

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

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

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

11
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

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

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

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

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

[ 0  -1 ]
[ 1   0 ]
17
ответ дан 3 December 2019 в 03:18
поделиться

Самый простой способ обойти это - думать не в терминах наклона 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

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

8
ответ дан 3 December 2019 в 03:18
поделиться

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

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

3
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: