How to fill a 3d volume with non-overlapping structures?

조회 수: 8 (최근 30일)
Carson Purnell
Carson Purnell 2022년 2월 28일
편집: Carson Purnell 2022년 3월 25일
I have a problem that I haven't seem any general solution for in other answers. I need to randomly place arbitrary, irregular shapes (macromolecules, if it matters) into a 3d array volume without overlapping. I don't need packing, but ideally being ale to hit high density is good.
I have a few hamfisted ideas of how to do this, all of which seem inelegant, slow, and error-prone:
  1. add a uniform high value to all prospective inputs, check for overlap via finding excessively high values after placement and reverting if an overlap value is generated in the array. Seems the most ideal, as it works well with irregular shapes.
  2. randomly choose a centroid, and exhaustively check hundreds-thousands of points within the prospective object's radius to find if anything else is present. place only if nothing is found.
  3. generate centroids as plot points, finding the nearest points and checking that the combined radius doesn't overstep the distance
Is there any more simple and reliable way to do this? A function that could do a basic overlap check? something on the file exchange that already accumulates shapes into a 3d volume without overlap? Or just a better strategy?
  댓글 수: 3
Matt J
Matt J 2022년 3월 1일
Are the instances of the shapes all the same size and geometry?
Carson Purnell
Carson Purnell 2022년 3월 1일
The shapes are a mixed collection with high variance.

댓글을 달려면 로그인하십시오.

채택된 답변

Carson Purnell
Carson Purnell 2022년 3월 3일
편집: Carson Purnell 2022년 3월 25일
To answer my own question, I went with #1. it ended up being very efficient, combined with a refactoring of the function I was using to write into the destination array it ended up being a dramatic increase in speed.
Binarize the relevant areas, sum and check for overlap (>1), only write if there is no overlap.
case 'nonoverlap'
dbin = single(imbinarize(dest(dx,dy,dz))); sbin = single(imbinarize(source(sx,sy,sz)));
overlap = dbin + sbin;
if max(max(max(overlap)))>1 %if overlap, record and output original
overlap = 1;
else %if no overlap, add the source to the destination
dest(dx,dy,dz) = source(sx,sy,sz) + dest(dx,dy,dz); overlap = 0;
end

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Scalar Volume Data에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by