2013-07-27 32 views
5

Tôi đang chạy thuật toán marching squares (tương đối của các hình khối diễu hành) trên một mặt phẳng iso, sau đó dịch dữ liệu thành lưới tam giác.Làm thế nào để đơn giản hóa một lưới vuông diễu hành?

Công trình này, nhưng tạo ra dữ liệu lưới rất phức tạp. Tôi muốn đơn giản hóa này đến tam giác tối thiểu cần thiết, như đã thấy minh họa dưới đây:

enter image description here

Tôi đã cố gắng lặp xung quanh đường viền (điểm -> phân khúc -> điểm -> ...), nhưng các đường viền có thể bị đảo ngược nếu một điểm có nhiều hơn 2 đoạn đính kèm.

Lý tưởng nhất là giải pháp nên khá nhanh để có thể thực hiện được khi chạy. Ngôn ngữ tôi đang sử dụng là C#, nhưng có thể chuyển ngôn ngữ đó từ hầu hết các ngôn ngữ khác của C.

+0

Vì vậy, bạn đã chạy thuật toán isoline được mô tả trên trang wiki bạn đã liên kết, nó đã cung cấp cho bạn một mạng lưới và bạn muốn dịch điều này thành một biểu diễn hình tam giác tối thiểu? – JSQuareD

+0

Dữ liệu bạn đang cố gắng dịch như thế nào? – JSQuareD

+0

Tại sao nó phải là hình tam giác "tối thiểu"? Không thể bạn chỉ cần khắc ra các ô vuông bên trong? –

Trả lời

0

Thực hiện bước này ngay lập tức, chuyển từ biểu diễn âm lượng sang biểu diễn lưới.

Sau đó, bạn có thể nhóm các khu vực với trường hợp 3,6,9,12 thành các phiên bản lớn hơn/dài hơn.

Bạn cũng có thể thử nhóm hình vuông thành hình vuông lớn hơn, nhưng vấn đề NP của nó để tối ưu hóa lý tưởng có thể mất nhiều thời gian.

Sau đó, bạn có thể chuyển đổi nó thành phiên bản đa giác.

Sau khi chuyển đổi thành đa giác, bạn có thể hợp nhất các cạnh.

-1

Sử dụng tai Clipping không diễu hành ô vuông cho loại vấn đề:

http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf

+0

Tai Clipping là một thuật toán tam giác. Nó không có nghĩa là để tạo ra các đường nét từ các trường vô hướng. – user2599140

+0

Tai Clipping có thể điền vào một đa giác với số lượng tam giác tối thiểu. – abenci

+0

Chắc chắn, nhưng điều đó tự nó không trả lời câu hỏi của OP. Anh ta cần một cách hiệu quả để tạo ra một đường viền và hình tam giác, không chỉ tam giác. – user2599140

5

Đây là vấn đề rất phổ biến trong đồ họa máy tính 3D. Các thuật toán giải quyết vấn đề này được gọi là thuật toán đơn giản hóa lưới. Tuy nhiên, vấn đề là đơn giản hơn nhiều trong việc giải quyết trong trường hợp 2D, vì không cần phải xem xét các tiêu chuẩn bề mặt.

Điều quan trọng đầu tiên là phải có cấu trúc dữ liệu lưới đáng tin cậy, cung cấp các hoạt động để sửa đổi lưới. Một tập hợp các hoạt động, có thể sản xuất và sửa đổi bất kỳ lưới nào chẳng hạn như tập hợp các "toán tử Euler".

Để đơn giản hóa lưới 2D cung cấp một phiên bản dày đặc của lưới 2D. Bạn chỉ cần chuyển đổi lưới tứ giác thành lưới tam giác bằng cách tách từng quad tại đường chéo của nó.

tam giác rậm lưới:

enter image description here

Sau đó lặp đi lặp lại sụp đổ các cạnh ngắn nhất, mà không phải là ở ranh giới. "Cạnh sụp đổ" là một hoạt động lưới điển hình, được miêu tả ở đây: The edge collapse operation

Sau một số bước lưới của bạn sẽ trông như thế: enter image description here

+0

Câu trả lời tuyệt vời theo như tôi có thể nói. Tôi tự hỏi tại sao không ai có bất kỳ phiếu nào – zehelvion

2

Đơn giản hóa một lưới được tạo ra bởi hành quân hình vuông (như gợi ý trong câu trả lời ở trên) rất kém hiệu quả.Để lấy một đa giác ra khỏi trường vô hướng (ví dụ bitmap), trước tiên bạn nên chạy một phiên bản sửa đổi của hình vuông diễu hành chỉ tạo đường bao đa giác (ví dụ: trong 16 trường hợp hình vuông hành bạn không tạo hình, bạn chỉ cần thêm điểm đến một đa giác), và sau đó bạn chạy một thuật toán tam giác (ví dụ: Delaunay hoặc Ear Clipping).

+0

OP cũng có thể nhìn vào Triangle.Net cho sự thống nhất (có sẵn trong github) cho triangulation. Hoạt động tốt cho các điểm 2D trên một đường bao. – Vignesh

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