Идея с острым треугольником ABC
не работает.Например, точка C
находится непосредственно рядом с линией AB
, угол в C
станет почти 180 °.С другой стороны, угол в B
может быть очень маленьким, если высота прямоугольника довольно мала, но C
тогда лежит за пределами прямоугольника.
Тем не менее, ваш другой подход является одним из основных способов реализации этого.
Точка D
находится где-то на линии через A
и B
, таким образом,
D = A + t * (B-A)
(заглавные буквы обозначают векторы в пространстве, строчные буквы - цифры).В то же время соединение от D
до C
перпендикулярно соединению A
к B
и, таким образом,
(C-D) . (B-A) == 0
, т. Е. Скалярное произведение двух разностных векторов равно нулю.Если сложить оба вместе, получится
(C-A-t*(B-A)) . (B-A) = (C-A) . (B-A) - t * (B-A) . (B-A) == 0
или при решении для t
:
t = (C-A).(B-A) / (B-A).(B-A)
(или, другими словами, относительная длина проекции вектора AC
на линиюAB
).
Точка D
находится внутри прямоугольника, если 0 <= t <= 1
, и, таким образом, это ваше первое условие.
После этого вы можете вычислить расстояние от C
доD
(просто вставьте t
в самое первое выражение, чтобы получить D
) и сравните это с h/2
, то есть последнее условие будет
(C-D).(C-D) <= (h/2)^2