Bạn có thể tìm điểm đó bằng cách xem xét đầu tiên một điểm chung (x, y)
dọc theo đường từ (x1, y1)
để (x2, y2)
:
x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
và tính toán các (bình phương) khoảng cách từ điểm này từ (xp, yp)
E = (x - xp)**2 + (y - yp)**2
thay thế định nghĩa của x
và y
cho
E = (x1 + t*(x2 - x1) - xp)**2 +
(y1 + t*(y2 - y1) - yp)**2
sau đó để tìm ra tối thiểu của khoảng cách này khác nhau t
chúng tôi lấy được E
liên quan đến t
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
rằng sau khi một số tính toán cho
dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
t*((x2 - x1)**2 + (y1 - y2)**2))
tìm kiếm khi phái sinh này là zero chúng tôi nhận một phương trình rõ ràng cho t
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1))/
((x2 - x1)**2 + (y2 - y1)**2)
để điểm cuối cùng có thể được tính bằng cách sử dụng giá trị đó cho t
trong định nghĩa (x, y)
.
Sử dụng ký hiệu véc tơ này là chính xác cùng một công thức được đề xuất bởi Gareth ...
t = <p - p1, p2 - p1>/<p2 - p1, p2 - p1>
nơi các ký hiệu <a, b>
đại diện cho hoạt động chấm sản phẩm ax*bx + ay*by
.
Cũng lưu ý rằng cùng một công thức hoạt động trong không gian n chiều.
Cảm ơn vì điều này. Cung cấp cho bạn câu trả lời được chấp nhận như bạn là người duy nhất có những gì tôi biết (coords Descartes) và cho tôi một công thức thực tế để cắm chúng vào. (Tôi thích ý tưởng vector nhưng điều đó đặt ra nhiều câu hỏi hơn câu trả lời cho bộ nhớ hình học của tôi.) –
Đó là một nỗ lực anh hùng từ @ 6502, nhưng câu trả lời này cho thấy tại sao tôi có quy tắc ngón tay cái về vectơ! –
@gareth: Khi đối diện với một vấn đề hình học, tôi luôn nghĩ về các vectơ (đó là lý do tại sao tôi upvoted câu trả lời của bạn), nhưng tôi biết rằng hầu hết các lập trình viên không cảm thấy thoải mái với chúng. – 6502