Làm cách nào để tính toán vectơ bình thường của một đoạn đường?


177

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

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

Xin vui lòng đi vào toán học (liên kết đến các ví dụ, sơ đồ hoặc thuật toán đã được chào đón), tôi là một lập trình viên nhiều 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 stackoverflow.com/a/7470098/189767 . Về cơ bản là giống nhau, nhưng công phu hơn.
Andreas

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

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

Câu trả lời:


237

nếu chúng ta định nghĩa dx = x2-x1 và dy = y2-y1, thì các quy tắc là (-dy, dx) và (dy, -dx).

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


14
Nó khá tinh tế và khiến tôi mất một lúc để nhận ra normal.x = -dy và normal.y = dx. Tôi đã có chúng theo cách khác bởi vì nó trông giống như một lỗi đánh máy gán phần x cho giá trị y ...
Piku

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

1
Bạn có thể vui lòng nói ngắn gọn hơn về cách đồng bằng đóng vai trò ở đây? Tôi chắc chắn tôi đang thiếu một cái gì đó ở đây.
huyền thoại2k

7
@ legends2k: Đồng bằng là vectơ tiếp tuyến. Bình thường là hướng vuông góc với tiếp tuyến. Việc lật các giá trị x / y và phủ định một giá trị sẽ trở nên rõ ràng nếu bạn nhìn vào ma trận 2D để xoay 90 độ: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon 24/213

@geon: Aah! Hiểu rồi, tôi đã nhầm lẫn delta với độ dốc trong khi trong hình học affine, sự khác biệt giữa hai điểm là một vectơ, tanget ở đây :)
legends2k

95

Một cách khác để nghĩ về nó là tính toán vectơ đơ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.

Biểu diễn ma trận của phép biế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)

trong đó (x, y) là các thành phần của vectơ gốc và (x ', y') là các thành phần được chuyển đổi.

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

x' = -y
y' = +x

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


2
Cảm ơn rất nhiều, đã phá vỡ đầu của tôi về cách nó được bắt nguồn.
huyền thoại2k

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

@duffymo kết quả có độ dài bằng một?
Martin Meeser

Nếu vectơ được chuẩn hóa trước khi chuyển đổi, nó sẽ vẫn như vậy sau. Bạn phải bình thường hóa trước hoặc sau khi bạn thực hiện chuyển đổi xoay.
duffymo

11

Câu hỏi này đã được đăng từ lâu, nhưng tôi đã tìm thấy một cách khác để trả lời nó. Vì vậy, tôi quyết định chia sẻ nó ở đây.
Đầu tiên, người ta phải biết rằng: nếu hai vectơ vuông góc thì tích của chúng bằng 0.
Vectơ 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ì thế,

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

Có rất nhiều 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)


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

nếu vuông góc hai đường thẳ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 đã xác định

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.