Xác định nếu loại bỏ một voxel sẽ chia tay một nhóm


8

Tôi có một tình huống sau: Tôi có một lưới voxels 3d (bật / tắt, kích thước tối đa có lẽ là 128x128x128). Tôi biết trước rằng bên trong lưới điện, tất cả các voxels được bật đều được kết nối với nhau, tạo thành một nhóm duy nhất.

Bây giờ tôi cần xác định: khi tôi loại bỏ một voxel (tắt nó đi), nó có phá vỡ nhóm không?

Ý tưởng ban đầu của tôi là xem xét các hàng xóm của voxel đã bị loại bỏ và xác định xem chúng có còn liên kết với các voxels khác không (xem câu hỏi khác của tôi: Thuật toán để xem hai voxels có được kết nối với nhau không ). Nhưng có thể có những cách tốt hơn / khác để làm điều này.

Vì vậy, điều gì sẽ là một cách tốt để xác định xem việc loại bỏ một voxel sẽ phá vỡ nhóm mà nó là một phần của?

Câu trả lời:


4

Tôi đã đề cập đến điều này trong phần bình luận khác của tôi, nhưng tôi nghĩ ở đây bạn đang nghĩ về phân loại bên ngoài / bên trong. Bằng cách loại bỏ một voxel, bạn đang thay đổi các voxel xung quanh nó thành các voxels 'edge' (nếu chúng chưa có). Điều này sẽ rút gọn thành 3 trường hợp thực tế (tính đối xứng giúp bạn phần còn lại của chúng) - trong ví dụ bên dưới các số là ID nhóm, - là voxel bị xóa

11      2    
1-     1-     1-2
  • Trường hợp đầu tiên là tầm thường - đó là một góc, nhưng các voxels ở trên và bên trái vẫn được kết nối đầy đủ thông qua các voxel khác.

  • Trường hợp thứ hai: đó là một góc và voxel bị loại bỏ đã ngắt kết nối các voxel bên trên và bên trái đã được kết nối trước đó

  • Trường hợp thứ ba: đó là một dòng và voxel bị loại bỏ đã ngắt kết nối các voxels trái và phải được kết nối trước đó.

Nếu bạn xác định rằng trường hợp thứ 2 hoặc thứ 3 đã xảy ra, bạn cần thực hiện một số tìm kiếm đường dẫn để xem liệu 1 và 2 có còn được kết nối thông qua các voxels liền kề khác của chúng không.

Bạn có thể nhận được một số hiệu quả ở đây mặc dù. Nếu một voxel hoàn toàn nội bộ trong một nhóm (tức là tất cả 8 hàng xóm của nó là một phần của cùng một nhóm), thì nó có thể được giảm giá. Tại sao? Đó là một điều cấu trúc liên kết. Hãy tưởng tượng trường hợp 2D - chỉ có hai khả năng. Hoặc có một cạnh duy nhất, bất kể nó xoắn và xoay như thế nào, vẫn tạo thành một vòng voxels. Hoặc, có hai vòng, một vòng chứa một voxel và một vòng chứa vòng kia. Ví dụ:

 xxx xxx
 x x-x x
 xxx xxx

hoặc là

 xxxxxxx
 x     x
 xxx xxx
   x-x 
 xxx xxx

Điều đó cũng sẽ mở rộng sang 3D, ngoại trừ thay vì vòng biên, bạn sẽ có bề mặt ranh giới. Vì vậy, khi bạn đang cố gắng xác định xem hai voxel bị ngắt kết nối gần đây có còn được kết nối hay không, bạn có thể loại trừ tất cả các voxel bên trong khỏi giao dịch của mình, bởi vì theo định nghĩa, nếu một voxel được kết nối với bất kỳ một trong các voxel ranh giới của một nhóm, thì đó cũng là kết nối với tất cả các voxels nội bộ trong nhóm đó.

Đó là loại tác dụng ngược của các voxel trung tâm mà tôi đã nói trong câu trả lời của mình cho câu hỏi khác - bạn không phải tìm đường từ mọi voxel đến mọi voxel khác, bạn chỉ phải tìm đường đến những voxel thú vị .


Cảm ơn bạn, chỉ sử dụng các voxels ở bề mặt của âm lượng có vẻ như là một tối ưu hóa rất tốt.
Bram Vaessen

3

Nếu bạn đang sử dụng A *, bạn có thể sử dụng nó ở đây.

Bắt đầu với một danh sách các voxel được kết nối với voxel bị loại bỏ. Bắt đầu với cái đầu tiên trong danh sách, sử dụng A * để tìm đường dẫn đến cái thứ hai trong danh sách. Nếu một đường dẫn tồn tại, hãy tìm một đường dẫn từ thứ hai đến thứ ba, thứ ba đến thứ tư, v.v.

Hầu hết các tìm kiếm đó sẽ rất nhanh, vì các voxels sẽ ở ngay cạnh nhau. Nếu có bất kỳ đường dẫn nào không thành công, điều đó có nghĩa là sự gián đoạn đã được tạo.

Điều này sẽ khá dễ thực hiện nếu bạn đã thực hiện chức năng A *.

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.