2011-07-08 38 views
5

Đây là hình học đồ họa cơ bản và/hoặc trig, và tôi cảm thấy câm khi hỏi nó, nhưng tôi không thể nhớ nó như thế nào. Vì vậy:Tìm một đường giao nhau với một đường thẳng đã biết ở góc bên phải, với một điểm

  1. Tôi có một dòng được xác định bởi hai điểm (x1, y1) và (x2, y2).
  2. Tôi có điểm thứ ba (xp, yp) nằm ở một nơi khác.

Tôi muốn tính điểm (x ', y') nằm đâu đó dọc theo dòng trong # 1, như vậy, khi được nối với điểm từ # 2, tạo đường thẳng vuông góc mới cho dòng đầu tiên . enter image description here

Cảm ơn.

Trả lời

5

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 xy 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.

+0

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.) –

+0

Đó 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ơ! –

+0

@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

0

Bạn có thể giải quyết độ dốc của đường nối (x1, y1)(x2, y2). Sau đó bạn biết đường vuông góc có độ nghịch đảo âm của độ dốc đó.

Để tìm điểm chặn chữ Y, hãy sử dụng độ dốc để xem đường đi bao xa trong y từ x=0 đến x1.

b + (x1 - x0) * m = y1 
b + (x1 - 0) * m = y1 
b + (x1 * m)  = y1 
b = y1 - x1 * m 

Sau đó, bạn có thể lấy công thức cho đường thẳng giữa hai điểm và đường của bạn từ (xp, yp) với độ dốc trên. Đối với một x nhất định, chúng có số y bằng nhau, do đó bạn có thể giải quyết cho số x đó, sau đó cắm công thức đó vào công thức của một trong hai số y.

m = slope_from_1_to_2 = (y2 - y1)/(x2 - x1) 
n = slopePerpendicular = (-1)/m 

b = intercept_for_1_to_2 = y1 - x1 * m 
c = intercept_for_p  = yp - xp * n 

Do đó, phương trình cho các dòng có dạng y = mx + b

điểm 1 và 2:

y(x) = mx + b

Point p:

y(x) = nx + c

Đặt họ 's tương đương để tìm x' y

mx' + b = nx' + c 
(m-n)x' = c - b 
    x' = (c - b)/(m - n) 

Và do đó sử dụng một trong hai công thức để tính y'

y' = mx' + b

+0

Cảm ơn. Trong phương trình 'y (x) = mx + y2' - tại sao bạn sử dụng' y2' để đứng trong 'b'? –

+0

Điểm tốt, 'b' phải là điểm đánh dấu y, nơi đường thẳng chạm vào trục y. 'y2' không nhất thiết phải như vậy, hãy để tôi xem xét toán học của tôi. –

+1

Sử dụng công thức 'y = m * x + q' cho một vấn đề giá trị thực sự có nghĩa là tìm kiếm các sự cố. Bạn không thể xử lý các đường thẳng đứng với kiểu tiếp cận này; tốt hơn để sử dụng phương trình tham số 'x = x (t), y = y (t)' thay thế. – 6502

1

Dòng Câu trả lời là:

y=ax+b 
where a=(x1-x2)/(y2-y1) 
     b=yp-(x1-x2)*xp/(y2-y1) 

như thế nào kết quả thu được:

1) slope for the original line: (y2-y1)/(x2-x1) 

2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1) 

3) Plug this into (xp,yp) we can have the result line. 

Chỉ cần tính câu trả lời từ các dòng sau này (điều này quá dài ... Tôi đói).

+0

Điều này không hoạt động đối với 'y1 = y2' (chia cho số không). Trên thực tế, người ta không nên sử dụng công thức dựa trên "độ dốc" khi xử lý các vấn đề về giá thầu thực sự. Công thức 'y = mx + q' chỉ hoạt động tốt khi bạn xử lý các vấn đề 1,5 chiều (tức là với đồ thị' y = y (x) '). – 6502

+0

@ 6502 Hmm. Cảm ơn vì đã cứu tôi những lỗi trong tương lai bởi vì tôi sẽ không thể quên nó một lần nữa. –

5

Một nguyên tắc hữu ích của ngón tay cái trong loại hình học tính toán này là bạn nên làm việc với vectơ miễn là bạn có thể, chuyển sang tọa độ Descartes chỉ là phương sách cuối cùng. Vì vậy, hãy giải quyết điều này bằng cách sử dụng đại số vector.Giả sử dòng của bạn đi từ p đến p + r và điểm khác là q.

Bây giờ, bất kỳ điểm nào trên đường, trong đó có điểm bạn đang cố gắng để tìm (gọi nó là s), có thể được thể hiện dưới dạng s = p + λ r cho một λ tham số vô hướng.

Bây giờ vector từ q để s phải vuông góc với r. Do đó

(q - (p + λ r)) · r = 0

đâu · là dot product operator. Mở rộng các sản phẩm:

(q - p) · r = λ (r · r)

Và chia:

λ = (q - p) · r/r · r

Khi bạn đến để thực hiện nó, bạn cần phải kiểm tra xem r · r = 0, để tránh phép chia cho không.

+0

Cảm ơn sự suy nghĩ giác ngộ trong vectơ. –

Các vấn đề liên quan