Find the upper surface of a 3d object.

7 views (last 30 days)
As the title suggests, I would like to find the points that correlate only to the upper surface of a 3d object.
I have a matrix containing thousands of points (x,y,z coordinates). The shape is that of a slightly bent, rectangular plate. The coordinates pertain to a molecular structure, so the volume of the structure is filled with points.
I used following to approximate the the shape and then find the outer perimeter:
mymatrix; %mymatrix(:,1) corresponds to x coordinates, mymatrix(:,2) corresponds to y, and mymatrix(:,3) corresponds to z
%The following creates a bounding volume and provides xyz coordinates of that bounding volume
shp = alsphashape(x,y,z, 0.1);
[tri, xyz] = boundaryFacets(shp);
trisurf(tri,xyz(:,1),xyz(:,2),xyz(:,3), 'FaceColor','cyan','FaceAlpha',0.3) ; %This plots that outer perimeter and also yields the xyz matrix of that bounding box
I would like to extract the points correlating only to the upper surface of this matrix so that I can then later take the gradient of that surface.
I think I'm just missing something simple here. Any help is greatly appreciated.

Accepted Answer

Image Analyst
Image Analyst on 9 Sep 2020
Try using scatteredInterpolant() to get a z value for every combination of x and y. See attached demo.
  3 Comments
Image Analyst
Image Analyst on 10 Sep 2020
Edited: Image Analyst on 10 Sep 2020
For some assortment of (x,y) locations, you have a value -- your z value. I assume that z is is the center of the atom so we now need to add the radius to it to get a new height to train the interpolant with.
This is just like the National Weather Service which has temperatures for a bunch of scattered cities, but not everywhere. Now you can turn that into a matrix where you DO have the value everywhere by using scatteredInterpolant. You have your x,y,height values, then you get the interpolant. Then you create a grid using meshgrid which will give you the coordinates for every possible (x,y) location - not just ones you have but ALL of them over your entire range of x and y. Then you just feed that into the interpolant to get the estimated height (z+radius) values everywhere. Not just at your training points, but everywhere in the possible range. This is how the NWS can turn a bunch of scattered temperatures for a limited number of discrete city locations into temperature values for anywhere in the country. Does that explain it better?
Casey Ricks
Casey Ricks on 10 Sep 2020
Yea, thank you for your in-depth responses. This is actually what I ended up doing last night, though I used griddata instead of scatteredinterpolant, but I think it is a very similar idea.

Sign in to comment.

More Answers (1)

Matt J
Matt J on 9 Sep 2020
Perhaps you can obtain the facet normals like in this example,
and classify any facet whose normal has a positive z-component as belonging to the upper surface.

Community Treasure Hunt

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

Start Hunting!