Làm thế nào tôi có thể thực hiện một tam giác bên trong thử nghiệm trong các lưới đa giác?


10

nhập mô tả hình ảnh ở đây Tôi có 3 đỉnh (V1, V2, V3)được chọn ngẫu nhiên trên một lưới tam giác thông thường. Đối với 3 đỉnh này, tôi đã tính khoảng cách trắc địa và đường đi (bằng cách sử dụng Dijkstra) trong số chúng và tạo thành một bề mặt giống như hình tam giác như trong hình trên.

Bây giờ, tôi có các đỉnh nằm trong mỗi đường dẫn và có thể tính khoảng cách trắc địa từ một đỉnh đã cho.

Những gì tôi muốn làm là để có được các đỉnh hoặc hình tam giác nằm trong khu vực giống như hình tam giác. Tôi có thể làm cái này như thế nào?


2
Giả sử rằng cách tiếp cận barycentric làm những gì tôi nghĩ nó sẽ khá chậm với các tập lớn. Hãy tưởng tượng một bộ gồm 9 triệu đỉnh chỉ có 9 đỉnh trong bộ mong muốn. Tại sao lặp lại toàn bộ tập hợp khi v1, v2 và v3 cung cấp cho bạn tất cả thông tin bạn cần. Câu trả lời lấp đầy lũ sẽ là giải pháp linh hoạt nhanh nhất. Mặc dù không linh hoạt, nhưng nếu bạn có thể giả sử bạn có các dòng như bạn hiện tại trong hình học thì quét đường sẽ là cách tiếp cận nhanh nhất.
Andrew Wilson

Bạn hoàn toàn đúng về các vấn đề hiệu suất. Tôi muốn sử dụng phương pháp này trong các mắt lưới lớn, vì vậy điều tôi đang tìm kiếm là một phương pháp hiệu quả. Trên thực tế tôi không quen thuộc với các thuật toán lấp đầy cũng không quét quét, tôi sẽ xem xét chúng. Cảm ơn.
mkocabas

3
Lấp đầy với một biểu đồ sẽ bắt đầu tại một nút, truy cập vào mọi nút lân cận nếu điều kiện biên được đáp ứng và không được truy cập, đánh dấu nó là đã truy cập và lặp lại (đệ quy). Thay đổi: đánh dấu mọi nút trên đường dẫn là đã truy cập và bắt đầu từ một nút bên trong tập hợp. Sau đó, chỉ cần sử dụng kiểm tra truy cập như điều kiện biên.
Andrew Wilson

Cảm ơn vì lời giải thích chi tiết. Tôi thấy algo lấp lũ hợp lý hơn, nhưng tôi muốn thực hiện cả quét lũ và quét dòng, sau đó so sánh các màn trình diễn.
mkocabas

Câu trả lời:


4

Có một phương pháp thay thế dựa vào việc lấp lũ. Đầu tiên sắp xếp dữ liệu cạnh của bạn thành một vòng lặp trong đó các cạnh đang tạo thành một vòng lặp ngược chiều kim đồng hồ. Sau đó bắt đầu tại một điểm tùy ý trên vòng lặp và chọn các cạnh nối điểm đó. Sử dụng cạnh biên ngoài và vượt qua nó với cạnh ngoài khác, nếu nó chỉ theo hướng của mặt bình thường thì đó là một cạnh được bao gồm, nếu không loại bỏ nó. Từ cạnh này tiếp tục cho đến khi bạn chạm vào một cạnh biên, tại thời điểm đó bạn chấm dứt điền. Tiếp tục tại một đỉnh biên giới chưa được truy cập.


Tôi không quen với thuật toán lấp lũ. Giải thích của bạn có vẻ hơi phức tạp với tôi. Bạn có thể vui lòng cung cấp một tài liệu tham khảo phong nha để xem xét? Cảm ơn.
mkocabas

Tôi có giải pháp bằng cách đọc một số. Cảm ơn.
mkocabas

3

Tôi đã nhận xét về việc sử dụng lũ lụt và làm thế nào nó sẽ tốt hơn vì nó linh hoạt hơn nhưng một giải pháp khả thi khác là quét tuyến. (Tôi nói có thể bởi vì nó đưa ra rất nhiều giả định về hình học của bạn nhưng đối với bộ cụ thể được hiển thị và nhiều bộ tương tự thì nó sẽ hoạt động.)

Ví dụ của bạn với 3 điểm: Tìm đỉnh giao nhau từ đoạn v1, v2 và đường mà v3 nằm trên. (Đỉnh ở phía trên bên trái của v2) Chúng ta sẽ gọi đỉnh này là v4.

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

nhập mô tả hình ảnh ở đây

Nó được gọi là scanline bởi vì (trong hình trên) bạn đi xuống các đường màu đỏ và xanh lục đồng thời rồi các đường màu đỏ và xanh lam đồng thời quét các đường kẻ khi bạn đi.

Giải pháp này sẽ rất nhanh nếu có một mẫu chỉ số, thường là như vậy. Nếu không, một phép tính sẽ là cần thiết để xác định đỉnh lân cận nào nằm trên đường thẳng.

Điều thú vị là scanline, kiểm tra barycentric (trong hộp giới hạn hình tam giác) và fill fill là tất cả các cách vẽ hình tam giác trong kết xuất 3d.


2

Tôi nghĩ rằng bạn có thể tính toán một số tọa độ barycentric liên kết bề mặt cho từng điểm trên bề mặt, sau đó sử dụng chúng để kiểm tra bên trong hoặc bên ngoài tam giác.

Tôi không có một thuật toán chính xác trong tay nhưng tôi đã tìm thấy bài báo sau đây dường như xử lý chính xác loại tọa độ này.

Tọa độ Barycentric trên bề mặt


Cảm ơn câu trả lời và giấy tham khảo. Tôi sẽ cố gắng thực hiện phương pháp đề xuất.
mkocabas
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.