Tight surface meshing of 3D points
6 views (last 30 days)
Show older comments
Given a set of 3D points, I need to create a surface triangulation to be stored in .stl file. The set of points is similar to a prism with C-shaped base, or a box with a small cilyndrical hole centered on one edge.
How can I create a tight surface mesh? I tried functions such as boundary, alphaShape, MyRobustCrust (https://it.mathworks.com/matlabcentral/fileexchange/63730-surface-reconstruction-from-scattered-points-cloud), and so on, but I didn't reach my expectation. Do you have any further suggestions?
I think probably the cause is that points are not well distributed to be meshed in such ways. Do you know any method to increase the set of points to the optimal number for using those functions?
Thanks in advance
2 Comments
Answers (2)
John D'Errico
on 6 Apr 2020
Sadly, there is no optimal amount of data, no optimal distribution of points. Only as much data as you can get.
The quality of the surface reconstruction will improve with more data, and more evenly distributed data on the surface. How could it not?
At the same time, there would also be areas where a finer sampling will be necessary, because those areas have cusps or other highly nonlinear shapes.
It is ironic, that the one part of your shape where not as much information is needed is the area where the surface is very well behaved. There any scheme will work well, and will probably yield a decent approximation, even with a less dense sampling. But at the same time, that will also be a region where one probably could generate more data easily, but who cares? You don't need it there.
Can you somehow generate extra data, purely from only the data you have? That question gets a fairly emphatic no. At the very least, it would be difficult as hell, and would require a great deal of information about the surface.
Consider this very simple shape, described only be some scattered data points:
px = [0 1 1 .6 .5 .4 0 0];
py = [0 0 1 1 .2 1 1 0];
S = polyshape(px,py);
xy = rand(1000,2);
in = isinterior(S,xy)
xy = xy(in,:);
plot(xy(:,1),xy(:,2),'r.')
Where exactly does the end of that interior cusp lie? How far down does it go? Yes, if you were willing to make a variety of assumptions based on the known shape of the bounding polygon, you could find the shape of that hole, reasonably well. But making up more data, based on nothing more than the data you already have will not improve your ability to predict the shape of that internal cusp.
Essentially, if you want more data, then you need to improve the process where the data was generated, not make up more data from the existing data.
0 Comments
darova
on 6 Apr 2020
I just looped through all edges and calculated length
clc,clear
load points.mat
ii = 1:50:size(a,1); % i reduced size of data (my computer can't handle it)
x = a(ii,1);
y = a(ii,2);
z = a(ii,3);
% plot3(x,y,z,'.r')
DT = delaunayTriangulation(x,y,z); % create tetrahedrons
con = DT.ConnectivityList;
pp = DT.Points;
xx = pp(:,1);
yy = pp(:,2);
zz = pp(:,3);
x = xx(con);
y = yy(con);
z = zz(con);
ix = true(size(con,1),1);
mlength = 20; % minimum side length
for i = 1:3
for j = i+1:4
A = [x(:,i)-x(:,j) y(:,i)-y(:,j) z(:,i)-z(:,j)]; % length of side
D = sqrt(sum(A.^2,2)) < mlength; % is length small?
ix = ix & D; % if big write '0'
end
end
tetramesh(con(ix,:),pp)
% alpha(0.5)
axis equal vis3d
Data reduced and minimum side length is 20
0 Comments
See Also
Categories
Find more on Computational Geometry in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!