2012-02-28 30 views
8

Câu hỏi về điểm cộng tuyến khác không. Xoắn của một người là, tôi đang sử dụng số học số nguyên, và tôi đang tìm kiếm chính xác collinearity, không phải là một thử nghiệm dựa trên epsilon mờ.Cách xác định xem 3 điểm có chính xác trong Z^2

Với lắp ráp nội tuyến, tôi có thể nhận được một câu trả lời chính xác: các lệnh x86 nhân cho phép truy cập đến cả những phần cao và thấp của sản phẩm, cả hai đều quan trọng trong việc tính toán các sản phẩm chéo (X - Một) x (B - A); Tôi có thể chỉ đơn giản là HOẶC hai nửa với nhau và kiểm tra không. Nhưng tôi hy vọng có một cách để làm điều đó trong C, đó là:

  1. Overflow chống
  2. xách tay
  3. Elegant

trong khoảng thứ tự đó. Và cùng lúc đó, một cách để làm điều đó có nghĩa là/không:

  1. tham gia casting để double
  2. liên quan đến sử dụng một loại số nguyên lớn hơn - cho rằng tôi đã sử dụng các loại nguyên lớn nhất có sẵn cho loại thành phần tọa độ của tôi
  3. mang lại dương tính giả hoặc âm tính giả.

Tôi không quan tâm đến câu hỏi này về việc liệu X nằm ngoài phân khúc AB; đó chỉ là bốn so sánh không thú vị.

Kịch bản ác mộng của tôi là tôi sẽ phải chia từng thành phần tọa độ thành hai nửa và thực hiện phép nhân một cách rõ ràng, chỉ để tôi có thể theo dõi tất cả các nửa cao trong các sản phẩm một phần. (Và sau đó phải làm thêm-với-carry một cách rõ ràng.)

+0

Sản phẩm chéo có tổng hợp thành thứ nguyên không? –

+0

Tiêu đề của bạn đề cập đến Z^n, nhưng văn bản câu hỏi của bạn đề cập đến sản phẩm chéo mà tôi tin chỉ được xác định khi n = 3 (hoặc n = 2, bằng cách coi nó là n = 3 với z = 0). Bạn có thể làm rõ liệu bạn đang tìm kiếm một giải pháp chung hay chỉ là một giải pháp n = 3? Tôi hỏi vì, mặc dù cách tiếp cận n = 2 hoặc n = 3 có thể dễ dàng được khái quát hóa thành các tham số tùy ý (bằng cách kiểm tra collinearity cùng với các tập con thứ nguyên ba hoặc ba phần tử chồng chéo), nó có thể kém thanh lịch hơn. – ruakh

+0

@OliCharlesworth - [Có, nhưng đó là một hoạt động ('n-1') -ary] (http://en.wikipedia.org/wiki/Cross_product#Multilinear_algebra). –

Trả lời

2

Sau một số so sánh và kiểm tra đơn giản, bạn có thể nhận được 2 cặp số dương (x1,y1), (x2,y2), mà bạn muốn kiểm tra xem x1*y2==x2*y1.

Bạn có thể sử dụng thuật toán Euclide để tìm GCD của x1y1 và chia cả hai theo GCM. Làm tương tự cho (x2,y2).Nếu bạn có cùng một cặp vợ chồng trong cả hai trường hợp, thì cả hai vectơ đều có cùng hướng.

+1

Nhưng nếu tất cả các số là đồng nguyên tố và lớn thì sao? –

+1

@OliCharlesworth Sau đó, GCD là 1 và 'x1 * y2 == x2 * y1' iff' x1 == x2 && y1 == y2' – asaelr

+0

Ồ, tôi thấy những gì bạn đang nhận được. –

0

Nếu ba điểm (a, b, c) là chính xác colinear sau đó bản sắc sau giữ:

c = a + (a - b) * scalar 

ví dụ:

c - a = scalar * (a - b) 

Vì vậy, hãy lấy thành phần đầu tiên của (c-a), chia thành phần đầu tiên của (a-b), hãy lưu giá trị đó. Sau đó lặp lại cho mỗi thành phần tiếp theo, và nếu bất kỳ thành phần nào khác nhau, các điểm không phải là colinear.

Nếu bạn muốn tránh hoàn toàn bằng cách sử dụng phân chia dấu phẩy động (đó sẽ là cách dễ nhất để thực hiện), thì bạn sẽ phải lưu trữ tỷ lệ và so sánh thay vào đó.

+0

Điều đó không thành công trong yêu cầu "tránh truyền đến gấp đôi". Nếu bạn sử dụng hợp lý thay vì tăng gấp đôi, có thể có sự cố tràn. –

+0

Điều đó tương đương về mặt logic với những gì tôi sắp trả lời, nhưng vấn đề là bạn có thể dễ dàng kết thúc với phao khi chia một thành phần khác, và có vẻ như OP muốn tránh số học dấu phẩy động. –

+0

@Osi, Jack; xem chỉnh sửa. Ngoài ra, kiểm tra tỷ lệ là như nhau mà không giảm đến hình thức cơ bản nhất có thể khá dễ dàng với sự phân chia số nguyên. – James

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