Проведите параллельную линию

У меня есть x1, y1 и x2, y2, который формирует линейный сегмент. Как я могу получить другую строку x3, y3 - x4, y4, который параллелен первой строке как в изображении. Я могу просто добавить n к x1 и x2 для получения параллельной строки, но это не то, что я хотел. Я хочу, чтобы строки были как параллель в изображении.

enter image description here

24
задан Krumelur 8 September 2015 в 21:37
поделиться

2 ответа

Что вы хотите сделать, так это сместить координаты в ортогональном направлении. Если вы знаете векторную математику, умножьте вектор, образованный расстоянием между конечными точками линии, на следующую матрицу:

[ 0 -1 ]
[ 1  0 ]

Скажем, первая линия имеет точки (x1,y1), (x2,y2), с x=x2-x1, y=y2-y1.
Также имеем L = sqrt(x*x+y*y), длину строки (простите за обозначения). Тогда следующая строка должна быть смещена на

[ 0 -1 ] [x]
[ 1  0 ] [y]

=> dx = -y / L, dy = x / L , что является нормализованным смещением для новой строки.

В C#-подобном псевдокоде:

var x1 = ..., x2 = ..., y1 = ..., y2 = ... // The original line
var L = Math.Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

var offsetPixels = 10.0

// This is the second line
var x1p = x1 + offsetPixels * (y2-y1) / L
var x2p = x2 + offsetPixels * (y2-y1) / L
var y1p = y1 + offsetPixels * (x1-x2) / L
var y2p = y2 + offsetPixels * (x1-x2) / L

g.MoveTo(x1p,y1p) // I don't remember if this is the way
g.LineTo(x2p,y2p) // to draw a line in GDI+ but you get the idea
50
ответ дан 28 November 2019 в 23:12
поделиться

Вы пытались вычесть n из y1 и y2 вместе с добавлением n к x1 и x2? Думаю, это может сработать

0
ответ дан 28 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

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