2009-08-07 28 views
139

Giả sử tôi có đoạn đường đi từ (x1, y1) đến (x2, y2). Làm thế nào để tính toán vector bình thường vuông góc với đường thẳng?Làm cách nào để tính toán vectơ bình thường của một đoạn đường?

Tôi có thể tìm thấy rất nhiều thứ về việc này cho máy bay ở chế độ 3D nhưng không có nội dung 2D.

hãy đi dễ dàng trên các toán học (liên kết đến các ví dụ làm việc, sơ đồ hoặc các thuật toán được hoan nghênh), tôi là một lập trình viên hơn tôi là một nhà toán học;)

+2

Và nếu bạn muốn biết về "toán học" đằng sau điều này, bạn có thể tra cứu câu trả lời của tôi tại http://stackoverflow.com/a/7470098/189767. Về cơ bản nó giống nhau, nhưng phức tạp hơn. – Andreas

+1

Câu hỏi này là về toán học chứ không phải lập trình. – Charlie

+0

Tôi đang bỏ phiếu để đóng câu hỏi này là không có chủ đề vì đó là về toán học, chứ không phải lập trình. – Pang

Trả lời

194

nếu chúng tôi xác định dx = x2-x1 và dy = y2-y1, thì các chuẩn là (-dy, dx) và (dy, -dx).

Lưu ý rằng không cần phân chia và do đó bạn không có nguy cơ chia cho số không.

+10

Đó là khá tinh tế và đã cho tôi một thời gian để thực hiện normal.x = -dy và normal.y = dx.Tôi đã có họ theo cách khác xung quanh bởi vì nó trông giống như một lỗi đánh máy phân chia phần x với giá trị y ... – Piku

+1

http://stackoverflow.com/a/7470098/183120 để biết thêm về toán học này. – legends2k

+0

@OrenTrutner Tôi vẫn không hiểu điều này; '(x ', y') = (-y, x)' và '(x ', y') = (y, -x)' có vẻ đúng, nhưng tại sao người ta sử dụng 'dx' và' dy' đây. Hơn nữa, dựa trên các sườn, 'm1 * m2 = -1' cho các đường thẳng góc, do đó' dy '= dx' * (-dx/dy) 'và' dx '= dy' * (-dy/dx) ', làm thế nào đến trong phương trình của bạn 'normal.x = x '= -dy'? – legends2k

6
m1 = (y2 - y1)/(x2 - x1) 

nếu vuông góc với hai dòng:

m1*m2 = -1 

sau đó

m2 = -1/m1 //if (m1 == 0, then your line should have an equation like x = b) 

y = m2*x + b //b is offset of new perpendicular line.. 

b là một cái gì đó nếu bạn muốn vượt qua nó từ một điểm bạn def ined

76

Một cách khác để suy nghĩ về nó là tính toán vector đơn vị cho một hướng nhất định và sau đó áp dụng xoay 90 độ ngược chiều kim đồng hồ để có được vectơ bình thường.

Các đại diện ma trận của việc chuyển đổi 2D nói chung trông như thế này:

x' = x cos(t) - y sin(t) 
y' = x sin(t) + y cos(t) 

nơi (x, y) là các thành phần của vector gốc và (x 'y') đều được các thành phần biến đổi.

Nếu t = 90 độ, sau đó cos (90) = 0 và sin (90) = 1. Thay và nhân nó ra cho:

x' = -y 
y' = +x 

kết quả tương tự như được đưa ra trước đó, nhưng với nhiều hơn một chút giải thích về nó đến từ đâu.

+1

Cảm ơn một tấn, đã phá vỡ đầu của tôi về cách nó đã được bắt nguồn. – legends2k

+0

Mặc dù tôi đã biết công thức xoay vòng trước đó, nhưng thứ này được đặt trong đầu tôi, bởi câu trả lời này, là góc là hằng số (+/- 90), đơn giản hóa nó thành một phép phủ định đơn giản và đảo ngược của x và y. – legends2k

+0

@duffymo có kết quả có chiều dài không? –

7

Câu hỏi này đã được đăng từ lâu rồi, nhưng tôi đã tìm thấy một cách khác để trả lời câu hỏi đó. Vì vậy, tôi quyết định chia sẻ nó ở đây.
Thứ nhất, người ta phải biết rằng: nếu hai vectơ vuông góc, thì dấu chấm của chúng bằng 0.
Vector bình thường (x',y') vuông góc với đường nối (x1,y1)(x2,y2). Dòng này có hướng (x2-x1,y2-y1) hoặc (dx,dy).
Vì vậy,

(x',y').(dx,dy) = 0 
x'.dx + y'.dy = 0 

Các rất nhiều các cặp (x 'y') thỏa mãn phương trình trên. Nhưng cặp tốt nhất mà LUÔN LUÔN thỏa mãn là (dy,-dx) hoặc (-dy,dx)

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