Alternatives to Delaunay triangulation
Ältere Kommentare anzeigen
Hello,
I am in need of calculating the volume of a shape that is given as a cloud of points. I thought a first step would be to triangulate using delaunay but the results are not satisfactory. I have attached some images to show what is unsatisfactory. I zoomed in to look at a part of the cloud that is kind of shaped like the cone of an airplane. I have provided two angles so a sense can be gotten. The super elongated triangles do not seem like they will be useful in getting me surface area and volume.
Does anyone know of alternatives that would produce better results?




Thanks.
4 Kommentare
Richard Brown
am 5 Nov. 2019
Looks to me like the cone is "open" - like an ice-cream cone with no ice-cream. Should there be points over the disc-shaped part of it?
David Wilson
am 5 Nov. 2019
Bearbeitet: David Wilson
am 5 Nov. 2019
You could try alphashape. Further details on how to extract its volume are given in:
I'll try to regenerate your cone shape. One could, if they bothered, compute the exact volume for comparison.
%% Make a nose cone
npts = 1e3;
a = 1; % change this to pi/2
l = a*rand(npts, 1);
phi = rand(npts,1)*2*pi;
p = deg2rad(3);
r = sin(l);
x = cos(l);
y = r.*sin(phi); z = r.*cos(phi);
plot3(x,y,z,'.');
axis equal
grid on
Now compute the convex hull and the volume.
pts = [x,y,z];
[k,vol] = convhulln(pts);
For a sanity check, if you re-run the code above with
a = pi/2 % half a sphere
I get vol = 2.0593 which is not too far off the exact 4/6 pi = 2.0944.
David Winthrop
am 5 Nov. 2019
David Winthrop
am 5 Nov. 2019
Antworten (4)
Richard Brown
am 7 Nov. 2019
Bearbeitet: Richard Brown
am 7 Nov. 2019
As David Wilson suggested, use alphashape:
U = csvread('Coords.txt');
shp = alphashape(U(:, 1), U(:, 2), U(:, 3));
plot(shp)
disp(shp.vol)
I get a volume of 3.59e-8. The picture is here:

Or, I just noticed that the commands are different in R2019a (I did the previous with R2018a by accident):
U = csvread('Coords.txt');
shp = alphaShape(U(:, 1), U(:, 2), U(:, 3));
plot(shp)
disp(shp.volume)
David Winthrop
am 5 Nov. 2019
Bearbeitet: David Winthrop
am 5 Nov. 2019
darova
am 6 Nov. 2019
Volume can be found as summation volume of pyramids. Here is an idea:

clc,clear
load Coords.txt
x = Coords(:,1);
y = Coords(:,2);
z = Coords(:,3);
% move to origin
x = x-mean(x);
y = y-mean(y);
z = z-mean(z);
% convert to spherical system
[t,p,r] = cart2sph(x,y,z);
tri = delaunay(t,p);
trisurf(tri,x,y,z)
% indices of triangle
i1 = tri(:,1);
i2 = tri(:,2);
i3 = tri(:,3);
% vectors of triangle base
v1 = [x(i1)-x(i2) y(i1)-y(i2) z(i1)-z(i2)];
v2 = [x(i1)-x(i3) y(i1)-y(i3) z(i1)-z(i3)];
A = 1/2*cross(v1,v2,2); % surface of a triangle
V = 1/3*dot(A,[x(i1) y(i1) z(i1)],2); % volume of a triangle
V = sum(abs(V));
3 Kommentare
David Winthrop
am 6 Nov. 2019
Bearbeitet: David Winthrop
am 7 Nov. 2019
darova
am 7 Nov. 2019
Maybe it's because of wrong triangulation in this place:

alphashape should be cool in this case then
It's because of converting cartesian coordinates to spherical
[t,p,r] = cart2sph(x,y,z);
Geometrically -pi and +pi are the same, but delaunay interprets it as different numbers.
That is why there is a gap between -pi and +pi
Don't know how to resolve it

David Winthrop
am 7 Nov. 2019
0 Stimmen
5 Kommentare
Richard Brown
am 7 Nov. 2019
Did you see my solution using alphaShape above? It produces a mesh that looks very similar, and a volume of 3.59e-8 with default parameters ...
darova
am 7 Nov. 2019
I get 3.7336e-08 using my script. How is this possible?
David Winthrop
am 7 Nov. 2019
David Winthrop
am 7 Nov. 2019
M.S. Khan
am 31 Mai 2020
David, could you plz explain how you applied trgingulations.
regards,
Kategorien
Mehr zu Triangulations finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
