Làm cách nào để tìm các điểm gần nhất (từ đó hình thành một đa giác) kèm theo một điểm cụ thể? (Xem hình)


8

Tôi đang làm việc với một công cụ trò chơi, và nhiệm vụ của tôi là thêm mã để mô phỏng sự đứt gãy của các lưới cứng.

Ngay bây giờ tôi chỉ làm việc để phá vỡ một khối.

Tôi đang sử dụng thuật toán của Voronoi để tạo ra một mảnh vỡ (thực tế) và tôi đang sử dụng phương pháp nửa mặt phẳng để tạo ra một tế bào Voronoi.

để tìm điểm gần nhất (bao quanh màu đỏ) xung quanh Voronoi (điểm màu tím)

Bây giờ cách tôi làm điều này là cho mọi điểm hạt giống, tôi tạo các mặt phẳng là các mặt phẳng chia vuông góc (các đường thẳng màu đen trong ảnh) với phần còn lại của các điểm giống và tôi tính các giao điểm của tất cả các mặt phẳng này để cho tôi các điểm khác biệt ( tất cả các chấm màu cam).

Tôi đã nhận được điều này đến nay.

Trong số tất cả các điểm giao nhau được tính toán này, tôi chỉ cần những điểm gần nhất và bao quanh điểm giống (các điểm được bao quanh bằng màu đỏ) và tôi cần loại bỏ tất cả phần còn lại.

Thông tin mà tôi có:

1) Phương trình mặt phẳng của tất cả các mặt phẳng (được xác định bởi các vectơ chuẩn hóa và khoảng cách từ gốc)

2) Điểm giao nhau (mà tôi đã tính)

Ai có thể giúp tôi tìm hiểu làm thế nào tôi có thể tìm thấy các điểm được bao quanh trong màu đỏ?


Không có câu trả lời, nhưng đó là một vấn đề thú vị!
Tim Holt

Câu trả lời:


4

Theo phương pháp nửa mặt phẳng , bạn sẽ tìm thấy các đoạn đường tới mọi điểm khác và đường phân giác vuông góc của mỗi điểm đó

bước 1: phân đoạn dòng bước 2: chia đôi vuông góc

mà sau đó bạn giao nhau để tìm các đỉnh tiềm năng của ô Voronoi.

Bây giờ, bạn muốn loại trừ những cái giao nhau với bất kỳ nửa mặt phẳng "xa" nào được hình thành bởi các bộ chia.

Hai giao điểm phù hợp, một không thể so sánh

Tôi tô màu xanh nửa mặt phẳng "xa" cho rõ ràng.

Ở đây, hai điểm đỏ được khoanh tròn vượt qua bài kiểm tra: Chúng không nằm trong bất kỳ nửa mặt phẳng nào. Điểm đỏ không được khoanh tròn không đi qua, vì nó nằm trong nửa mặt phẳng hình thành về phía điểm trên bên phải.

Điều này có nghĩa là kiểm tra xem mỗi điểm có ở phía bên kia của mỗi đường kẻ bisector (liên quan đến trang Voronoi) hay không và loại bỏ những điểm đó. (Coi chừng lỗi làm tròn.)


Câu trả lời này rất hữu ích. Để kiểm tra xem cả hai điểm có nằm cùng một phía của mặt phẳng không, tôi đã thay thế các vectơ trong phương trình mặt phẳng và xem xét các dấu hiệu của chúng. Nếu cả hai đều tích cực / tiêu cực, thì họ ở cùng một phía. Khác họ ở phía đối diện. Những công việc này! Mã của tôi dường như đang tạo ra các đỉnh chính xác cho các mảnh Voronoi cuối cùng!
nilspin

bạn đã sử dụng chương trình nào để tạo ra những hình ảnh đó trong câu trả lời của bạn?
nilspin

@nilspin Inkscape .
Anko

3

Bạn có thể chỉ cần lặp đi lặp lại trên các cạnh và lọc ra tất cả các đỉnh không nằm trong cùng nửa mặt phẳng với điểm ưa thích.

Khi tối ưu hóa, lặp từ các cạnh gần nhất đến xa nhất. Tôi nghĩ bạn thậm chí có thể lọc các đỉnh trong khi tạo các lát.

Nó giống như cắt bánh với con dao vô tận, cho đến khi chỉ còn lại miếng nhỏ với quả anh đào trên đó. Nếu bạn thích tương tự. Chỉ cần cắt và xem phần nào sẽ được thực hiện và phần nào sẽ bị loại bỏ.

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.