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

У меня есть строка, которую я рисую в окне, и я позволяю пользователю перетаскивать ее. Итак, моя строка определяется двумя точками: (x1, y1) и (x2, y2). Но теперь я хотел бы нарисовать «шапки» в конце моей строки, то есть короткие перпендикулярные линии в каждой из моих конечных точек. Колпачки должны иметь длину N пикселей.

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

Итак, как вы вычисляете точку (x3, y3), учитывая, что она должна находиться на перпендикулярном расстоянии N / 2 от конечной точки (x1, y1) известной линии, то есть линии, определяемой (x1, y1) и (х2, у2)?

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

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 

Вы просто оцениваете ортогональный вариант и умножаетесь на 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 

Поскольку векторы от 2 до 1 и от 1 до 3 перпендикулярны, их точечный продукт равен 0.

Это оставляет вас с двумя неизвестными: x от 1 до 3 (x13) и y от 1 до 3 (y13)

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

Решите для каждого неизвестного путем замены …

Это требует возведения в квадрат и unsquaring, поэтому вы теряете знак, связанный с вашими уравнениями.

Чтобы определить знак, рассмотрим:

 while x21 is negative, y13 will be positive while x21 is positive, y13 will be negative while y21 is positive, x13 will be positive while y21 is negative, x13 will be negative 

Известно: точка 1: x1, y1

Известно: точка 2: x2, y2

 x21 = x1 - x2 y21 = y1 - y2 

Известно: расстояние | 1-> 3 | : N / 2

уравнение a: теорема Пифагора

 x13^2 + y13^2 = |1->3|^2 x13^2 + y13^2 = (N/2)^2 

Известно: угол 2-1-3: правый угол

векторы 2-> 1 и 1-> 3 перпендикулярны

2-> 1 точка 1-> 3 равно 0

уравнение b: dot product = 0

 x21*x13 + y21*y13 = 2->1 dot 1->3 x21*x13 + y21*y13 = 0 

отношение b / w x13 и y13:

 x21*x13 = -y21*y13 x13 = -(y21/x21)y13 x13 = -phi*y13 

уравнение a: решение для y13 с отношением

  plug x13 into a phi^2*y13^2 + y13^2 = |1->3|^2 factor out y13 y13^2 * (phi^2 + 1) = plug in phi y13^2 * (y21^2/x21^2 + 1) = multiply both sides by x21^2 y13^2 * (y21^2 + x21^2) = |1->3|^2 * x21^2 plug in Pythagorean theorem of 2->1 y13^2 * |2->1|^2 = |1->3|^2 * x21^2 take square root of both sides y13 * |2->1| = |1->3| * x21 divide both sides by the length of 1->2 y13 = (|1->3|/|2->1|) *x21 lets call the ratio of 1->3 to 2->1 lengths psi y13 = psi * x21 check the signs when x21 is negative, y13 will be positive when x21 is positive, y13 will be negative y13 = -psi * x21 

уравнение a: решение для x13 с отношением

  plug y13 into a x13^2 + x13^2/phi^2 = |1->3|^2 factor out x13 x13^2 * (1 + 1/phi^2) = plug in phi x13^2 * (1 + x21^2/y21^2) = multiply both sides by y21^2 x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2 plug in Pythagorean theorem of 2->1 x13^2 * |2->1|^2 = |1->3|^2 * y21^2 take square root of both sides x13 * |2->1| = |1->3| * y21 divide both sides by the length of 2->1 x13 = (|1->3|/|2->1|) *y21 lets call the ratio of |1->3| to |2->1| psi x13 = psi * y21 check the signs when y21 is negative, x13 will be negative when y21 is positive, x13 will be negative x13 = psi * y21 на  plug y13 into a x13^2 + x13^2/phi^2 = |1->3|^2 factor out x13 x13^2 * (1 + 1/phi^2) = plug in phi x13^2 * (1 + x21^2/y21^2) = multiply both sides by y21^2 x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2 plug in Pythagorean theorem of 2->1 x13^2 * |2->1|^2 = |1->3|^2 * y21^2 take square root of both sides x13 * |2->1| = |1->3| * y21 divide both sides by the length of 2->1 x13 = (|1->3|/|2->1|) *y21 lets call the ratio of |1->3| to |2->1| psi x13 = psi * y21 check the signs when y21 is negative, x13 will be negative when y21 is positive, x13 will be negative x13 = psi * y21 

конденсироваться

 x21 = x1 - x2 y21 = y1 - y2 |2->1| = sqrt( x21^2 + y^21^2 ) |1->3| = N/2 psi = |1->3|/|2->1| y13 = -psi * x21 x13 = psi * y21 

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

Если вы хотите избежать 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) 
  • Изучение теории сбора мусора
  • Существует ли алгоритм сортировки по целому числу O (n)?
  • Как проверить, пересекает ли сегмент линии прямоугольник?
  • Что такое непрозрачное значение в C ++?
  • Вычислить наибольший прямоугольник во вращающемся прямоугольнике
  • Как работает переопределение переменных XOR?
  • Что такое инъекция зависимости?
  • Как измерить сходство между двумя изображениями?
  • Что такое lambda (функция)?
  • Алгоритм для выделения перекрывающихся прямоугольников?
  • Что такое оптимизация хвостового звонка?
  • Давайте будем гением компьютера.