2012-01-23 19 views
11

Một Computational Geometry vấn đề:
Điểm P0 được chọn một cách ngẫu nhiên trên một cạnh (ví dụ, EB) của một đa giác (ví dụ, BCDE), để tìm ra những điểm có thể (ví dụ, P1,P2,P3,...) trên khác các cạnh dựa trên khoảng cách nhất định (ví dụ: r). Các cuộc biểu tình sau đây cho thấy một giải pháp bằng cách tìm các nút giao giữa các vòng tròn tập trung vào các điểm P0 và các cạnh của đa giác. Vì vậy, vấn đề cơ bản có thể được giải quyết bằng cách phân tích giao lộ Circle--Line-Segment.nút giao thông Circle-Polygon

Tôi tự hỏi có phương pháp nào hiệu quả hơn cho vấn đề rất đơn giản này về chi phí tính toán không? Quá trình này sẽ được đánh giá một số million times vì vậy bất kỳ cải tiến nào đều được quan tâm.

  • giải pháp cuối cùng sẽ được hưởng lợi từ Python điện;
  • tính toán lõi sẽ là Fortran nếu được yêu cầu.

enter image description here

Cập nhật:
Cảm ơn ý kiến ​​của bạn. Vui lòng xem xét nhận xét của tôi về các nhận xét giúp làm rõ câu hỏi hơn. Không sẵn sàng lặp lại chúng ở đây, khuyến khích để xem xét tất cả các ý kiến ​​và câu trả lời;).

Tôi vừa triển khai phương pháp Circle--Line-Segment Intersection dựa trên thuật toán được tìm thấy [here]. Trên thực tế tôi đã điều chỉnh nó để làm việc với các phân đoạn dòng. Điểm chuẩn của thuật toán thực hiện trong Python là như sau:
enter image description here
enter image description here
Số đoạn thẳng là: 100,000 và hệ thống là máy tính để bàn thông thường. Thời gian trôi qua là: 15 seconds. Hy vọng đây là hữu ích để cung cấp cho một số ý tưởng về chi phí tính toán. Việc triển khai lõi trong Fortan có thể cải thiện hiệu suất đáng kể.
Tuy nhiên bản dịch là bước cuối cùng.

+0

Khoảng cách 'r' của tất cả triệu truy vấn giống nhau không? Chúng ta có thể đếm trên đa giác được lồi không? –

+0

@BorisStrandjev Đối với vấn đề của chúng tôi, tất cả các đa giác đều lồi. 'r' có thể thay đổi cho mỗi lần lặp lại vì vậy nó có thể thay đổi nhưng là hằng số cho mỗi đa giác riêng lẻ. – Developer

+0

Và có hàng triệu truy vấn được thực hiện trong một đa giác đơn hay khác nhau không? –

Trả lời

2

Đối với giao nhau giữa line (hoặc line-segment) và một circle (sphere trong 3D) có nhiều hơn một chút giải thích, chi tiết thực hiện và cũng Python, C vv mã mẫu trong [this link]. Bạn có thể thử chúng cho vấn đề của bạn.
Ý tưởng về cơ bản giống như bạn đã tìm thấy trong [here].

+1

liên kết đã chết – Alnitak

0

Giả sử circle--line-intersection được tối ưu hóa, bạn có thể có thể đạt được một cái gì đó bằng cách phân biệt giữa các trường hợp khác nhau:

cho điểm A, B:

  • Nếu d (P0, A) < r và d (P0, B) < r: Không giao

  • nếu d (P0, A) == r: Intersection tại A

  • nếu d (P 0, B) == r: Intersection tại B
  • Nếu d (P0, A) < r và d (P0, B)> r: 1 ngã tư, thực hiện circle--line-intersection
  • Nếu d (P0, A)> r và d (P0, B) < r: 1 ngã tư, thực hiện circle--line-intersection

  • Nếu d (P0, A)> r và d (P0, B)> r: có hoặc là 0, 1 hoặc 2 nút giao thông -> Nếu số minimum distance đến dòng (A, B)> r: Không có nút giao -> Nếu minimum distance đến đường thẳng (A, B) == r: 1 giao lộ -> Nếu minimum distance tới dòng (A, B) < r: 2 giao nhau ns

+0

Trong trường hợp cuối cùng, tôi tin rằng bạn có nghĩa là d (P0, P2)> r. –

+0

Lưu ý rằng vòng tròn được đặt ở giữa 'P0', vì vậy tất cả các giao lộ nằm trên hình tròn và vì vậy khoảng cách của chúng bằng với' r'. Đó là 'd (P0, *) = r'. Tôi có thiếu một cái gì đó từ câu trả lời của bạn? – Developer

+0

Xin lỗi tôi đã nhầm lẫn các giao lộ với các điểm thực tế .. Tôi sẽ sửa câu trả lời, hy vọng nó có ý nghĩa hơn sau đó – Wesley

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