2009-08-09 21 views
18

Tôi có một câu hỏi tôi biết một dòng tôi chỉ biết độ dốc của nó (m) và một điểm trên nó A (x, y) Làm cách nào tôi có thể tính điểm) trên dòng này với khoảng cách (d) từ điểm A ??? Tôi yêu cầu điều này để tìm cường độ điểm ảnh trên một đường đi qua A (x, y) với khoảng cách. Khoảng cách trong trường hợp này sẽ là số pixel.Tìm các điểm trên một đường thẳng với một khoảng cách nhất định

Trả lời

15

Tôi khuyên bạn nên chuyển đổi dòng sang định dạng tham số thay vì độ dốc của điểm. Nghĩa là, một hàm tham số cho dòng trả về các điểm dọc theo dòng đó cho giá trị của một số tham số t. Bạn có thể biểu diễn đường như là một điểm tham chiếu và một vectơ biểu thị hướng của đường đi qua điểm đó. Bằng cách đó, bạn chỉ cần di chuyển các đơn vị d về phía trước và lùi từ điểm A để lấy các điểm khác của bạn.

Vì dòng của bạn có độ dốc m, vector hướng của nó là < 1, m>. Vì nó di chuyển m pixel trong y cho mỗi 1 pixel trong x. Bạn muốn bình thường hóa vector hướng đó là độ dài đơn vị, do đó bạn chia cho độ lớn của vectơ.

 
    magnitude = (1^2 + m^2)^(1/2) 

    N = <1, m>/magnitude = <1/magnitude, m/magnitude> 

Vectơ hướng chuẩn hóa là N. Bây giờ bạn sắp hoàn tất. Bạn chỉ cần viết phương trình cho dòng của mình theo định dạng được tham số hóa:

 
    f(t) = A + t*N 

Điều này sử dụng vector math. Cụ thể, scalar vector multiplication (tham số t và vectơ N) và vector addition (của A và t * N). Kết quả của hàm f là một điểm dọc theo dòng. 2 điểm bạn đang tìm kiếm là f (d) và f (-d). Thực hiện điều đó bằng ngôn ngữ bạn chọn.

Lợi thế khi sử dụng phương pháp này, trái ngược với tất cả các câu trả lời khác cho đến nay, là bạn có thể dễ dàng mở rộng phương pháp này để hỗ trợ một đường có độ dốc "vô hạn". Đó là, một đường thẳng đứng như x = 3. Bạn không thực sự cần độ dốc, tất cả những gì bạn cần là vector hướng chuẩn hóa. Đối với một đường thẳng đứng, nó là < 0, 1>. Đây là lý do tại sao các hoạt động đồ họa thường sử dụng toán học vectơ, bởi vì các phép tính là thẳng tiến và ít dễ bị kỳ dị hơn. Lúc đầu có vẻ hơi phức tạp, nhưng một khi bạn nhận được các hoạt động vector, rất nhiều tác vụ đồ họa máy tính trở nên dễ dàng hơn rất nhiều.

+0

cảm ơn vì trợ giúp hoạt động – Emre

+0

@ALevy Bạn giới thiệu biến, 'A', nhưng tôi không thấy định nghĩa 'A'. 'A' là gì? –

+0

@TomAuger Tôi đã giới thiệu A trong đoạn giới thiệu của câu trả lời này. A là một điểm trên dòng. Không quan trọng điểm nào. Bất kỳ điểm nào trên tuyến sẽ thực hiện. –

0

Hãy gọi điểm mà bạn đang cố gắng tìm P, với tọa độ px, py và điểm bắt đầu của A là tọa độ ax và ay. Độ dốc m chỉ là tỷ số của thay đổi trong Y so với thay đổi trong X, vì vậy nếu điểm P của bạn là khoảng cách từ A, thì tọa độ của nó là px = ax + s và py = ay + m * s. Bây giờ sử dụng Pythagoras, khoảng cách d từ A đến P sẽ là d = sqrt (s * s + (m * s) * (m * s)). Để làm cho P là một đơn vị D cụ thể từ A, tìm s là s = ​​D/sqrt (1 + m * m).

2

Let me explain the answer in a simple way.

Bắt đầu điểm - (x0, y0)

điểm End - (x1, y1)

Chúng tôi cần phải tìm một điểm (xt, yt) tại một dt khoảng cách từ điểm bắt đầu về phía điểm cuối.

Point on a line at a distance

Khoảng cách giữa Start và điểm cuối được cho bởi d = sqrt((x1 - x0)^2 + (y1 - y0)^2)

Hãy để cho tỉ lệ khoảng cách, t = dt/d

Sau đó điểm (xt, yt) = (((1 - t) * x0 + t * x1), ((1 - t) * y0 + t * y1))

Khi 0 < t < 1, điểm mấu chốt là trên dòng.

Khi t < 0, điểm nằm ngoài đường gần (x0, y0).

Khi t > 1, điểm nằm ngoài đường gần (x1, y1).