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

У меня есть линия, которую я провожу в окне, и я позволяю пользователю перетащить его вокруг. Так, моя строка определяется двумя точками: (x1, y1) и (x2, y2). Но теперь я хотел бы потянуть "ограничения" в конце своей строки, то есть, коротких перпендикулярных строк в каждой из моих конечных точек. Ограничения должны быть пикселями N в длине.

Таким образом, для рисования моей линии "ограничения" в конечной точке (x1, y1), я должен найти две точки, которые формируют перпендикулярную строку и где каждая из ее точек является пикселями N/2 далеко от точки (x1, y1).

Таким образом, как Вы вычисляете точку (x3, y3), учитывая его должен быть на перпендикулярном расстоянии N/2 далеко от конечной точки (x1, y1) известной строки, т.е. строки, определенной (x1, y1) и (x2, y2)?

44
задан David Nehme 16 November 2019 в 18:33
поделиться

3 ответа

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

dx = x1-x2
dy = y1-y2
dist = sqrt(dx*dx + dy*dy)
dx /= dist
dy /= dist
x3 = x1 + (N/2)*dy
y3 = y1 - (N/2)*dx
x4 = x1 - (N/2)*dy
y4 = y1 + (N/2)*dx
80
ответ дан David Nehme 26 November 2019 в 22:02
поделиться

Вы просто оцениваете ортогональный versor и умножаетесь N/2

vx = x2-x1
vy = y2-y1
len = sqrt( vx*vx + vy*vy )
ux = -vy/len
uy = vx/len

x3 = x1 + N/2 * ux
Y3 = y1 + N/2 * uy

x4 = x1 - N/2 * ux
Y4 = y1 - N/2 * uy
5
ответ дан Giacomo Degli Esposti 26 November 2019 в 22:02
поделиться

Если Вы хотите избежать sqrt, сделайте следующее:

in: line_length, cap_length, rotation, position of line centre

define points:
  tl (-line_length/2, cap_length)
  tr (line_length/2, cap_length)
  bl (-line_length/2, -cap_length)
  br (line_length/2, -cap_length)

rotate the four points by 'rotation'
offset four points by 'position'

drawline (midpoint tl,bl to midpoint tr,br)
drawline (tl to bl)
drawline (tr to br)
1
ответ дан Tim Cooper 26 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

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