2010-09-28 39 views
18

Tôi muốn biết một đoạn mã thực sự có thể cho tôi biết nếu 3 điểm trong không gian 2D nằm trên cùng một dòng hay không. Một mã giả cũng đủ nhưng Python thì tốt hơn.Kiểm tra xem 3 điểm trên cùng một dòng

+0

Dòng của bạn được xác định như thế nào? Chức năng trên mặt phẳng 2d? – Daenyth

+0

Chính xác những gì bạn được cung cấp? Ba điểm? hoặc ba điểm và một dòng? –

Trả lời

49

Bạn có thể kiểm tra xem diện tích của tam giác ABC là 0:

[ Ax * (By - Cy) + Bx * (Cy - Ay) + Cx * (Ay - By) ]/2 

Tất nhiên, bạn không thực sự cần phải chia cho 2.

+2

Điều này tốt hơn nhiều vì không có nguy cơ chia cho 0. –

+2

Chỉ cần chỉ ra điều gì đó ... Đây là câu trả lời toán học tương đương với @ dcp ở trên (nếu bạn bỏ qua '/ 2'), nhưng kiểm tra xem khu vực có 0 làm cho nó dễ dàng hơn để thêm một sự khoan dung ... (tức là 'stuff

+1

+1 toán học là giống nhau nhưng khái niệm đơn giản hơn/trực quan/straighforward (tôi thích nó). – joaquin

0

y - y0 = a(x-x0) (1) trong khi a = (y1 - y0)/(x1 - x0)A(x0, y0)B(x1, y1)C(x2, y2). Xem liệu C statisfies (1). Bạn chỉ cần thay thế các giá trị thích hợp.

Details

44

Đây là C++, nhưng bạn có thể thích ứng với nó để trăn:

bool collinear(int x1, int y1, int x2, int y2, int x3, int y3) { 
    return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2); 
} 

Về cơ bản, chúng tôi đang kiểm tra rằng các sườn núi giữa điểm 1 và điểm 2 và điểm 1 và điểm 3 trận đấu. Độ dốc thay đổi theo y chia cho thay đổi trong x, vì vậy chúng tôi có:

y1 - y2  y1 - y3 
------- = -------- 
x1 - x2  x1 - x3 

Nhân chéo cung cấp (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);

Lưu ý, nếu bạn đang sử dụng đôi, bạn có thể kiểm tra đối với một epsilon:

bool collinear(double x1, double y1, double x2, double y2, double x3, double y3) { 
    return fabs((y1 - y2) * (x1 - x3) - (y1 - y3) * (x1 - x2)) <= 1e-9; 
} 
+1

Nó làm gì? – dtb

+0

@dtb - Tôi đã thêm giải thích, cho tôi biết nếu bạn vẫn còn câu hỏi. – dcp

+2

mẹo hay. Tuy nhiên, việc kiểm tra các số dấu chấm động cho sự bình đẳng không an toàn. Bạn có thể kiểm tra sự khác biệt tuyệt đối so với ngưỡng được xác định trước phụ thuộc vào độ phân giải (độ nhạy) mà bạn muốn đạt được –

0

đọc this, và sử dụng nó để tìm ra phương trình của một đường qua hai điểm đầu tiên. Làm theo hướng dẫn để tìm số mb. Sau đó, cho điểm thứ ba của bạn, tính toán mx + b - y. Nếu kết quả bằng không, điểm thứ ba là trên cùng một dòng như hai đầu tiên.

0

Quy tắc 1: Trong bất kỳ 2d tuyến tính không gian, hai điểm luôn trên cùng một dòng.

Lấy 2 điểm và xây dựng một phương trình đại diện cho một đường thẳng qua chúng. Sau đó kiểm tra xem điểm thứ ba cũng nằm trên dòng đó hay không.

Chúc may mắn.

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