Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot surface from irregular data

I'm make a filled contour or surface plot from a scattered dataset.

A major difference from other Qs is that the data are not convex.

[r,th] = meshgrid(10:15,0:180);
[x,y] = deal(r.*sind(th), r.*cosd(th));
z = x.^2+y.^2;
scatter(x(:),y(:),[],z(:),'fill'); axis equal off;

The inner circle is null.

enter image description here

I use

tri = delaunay(x,y);
trisurf(tri,x,y,z);  view(2); axis equal off;

to make a surface plot.

However, as you can see, the inner circle is filled.

enter image description here

like image 397
ddzzbbwwmm Avatar asked Aug 12 '26 15:08

ddzzbbwwmm


1 Answers

Rather than using the Delaunay triangulation which results in the convex hull, you're going to want to use an alphaShape with which you can impose a limit on the length of the resulting surfaces edges.

You can specify the Alpha property (by specifying a third input) which is the inverse of the maximum edge length. For your example, I've chosen an Alpha of 1.

A = alphaShape(x(:), y(:), 1);

You can then get the triangulation out using the alphaTriangulation method of your alphaSurface object.

[faces, vertices] = A.alphaTriangulation();
zvalue = sum(vertices.^2, 2);

Or you can use the plot method of the alphaShape object

plot(A, 'FaceColor', 'interp', 'CData', zvalue)

enter image description here

like image 149
Suever Avatar answered Aug 14 '26 12:08

Suever



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!