How do you convert a surf object to an isosurface?

How to convert a regular surf surface (rectangular mesh) to a patch isosurface (triangular mesh)?
I have seen how to go the other direction, but this one eludes me. After creating the isosurface, I need to run inpolyhedron() to see if points are inside or outside the object.
theta = (pi:0.1:pi);
phi = 0:0.1:pi);
[THETA, PHI] = meshgrid(theta, phi);
x = cos(THETA).* sin(PHI);
y = sin(THETA).*sin(PHI);
z = cos(PHI;
ellipsoid = surf(x,y,z);
(Extract the isosurface from the ellipsoid...)
fv = isosurface(something something ...)
pts = rand(5,3);
in = inpolyhedron(fv,pts); % check if points are inside or outside object

2 comentarios

It is an ellipsoid though! It is far simpler to test if a point lies inside an ellipsoid, if that is all you need.
Kurt
Kurt el 6 de Mayo de 2024
It's actually more complex than that. I bend and shape the ellipsoid to resemble a radar beam.

Iniciar sesión para comentar.

 Respuesta aceptada

Hi Kurt,
You can use the "delaunayTriangulation" function, to convert the rectangular mesh to a triangular mesh.
for your given code, here is how you can use the function:
theta = (0:0.1:2*pi); % Corrected range for theta
phi = (0:0.1:pi);
[THETA, PHI] = meshgrid(theta, phi);
x = cos(THETA).* sin(PHI);
y = sin(THETA).*sin(PHI);
z = cos(PHI);
h = surf(x,y,z);
axis equal; % Equal aspect ratio for all axes
X = get(h, 'XData');
Y = get(h, 'YData');
Z = get(h, 'ZData');
% Flatten the matrices
x = X(:);
y = Y(:);
z = Z(:);
figure;
DT = delaunayTriangulation(x, y, z);
Warning: Duplicate data points have been detected and removed.
The Triangulation indices are defined with respect to the unique set of points in delaunayTriangulation.
tetramesh(DT, 'FaceAlpha', 0.3); % Adjust 'FaceAlpha' for transparency
axis equal;
You can refer to the "delaunaytriangulation" function documentation here https://www.mathworks.com/help/matlab/ref/delaunaytriangulation.html

3 comentarios

Kurt
Kurt el 14 de Mayo de 2024
Editada: Kurt el 14 de Mayo de 2024
Thanks! This is a good start. Now, is there any way to convert this tetramesh to ECEF coordinates?
Normally, for a surf object I would call enu2ecef(XData,YData,ZData,lat,lon,alt,grs80) but that doesn't work here since the mesh data is ordered differently.
I would also like to make it invisible. Can I use alpha to do that?
Yatharth
Yatharth el 15 de Mayo de 2024
Hello, have you tried using "pointLocation" function? https://www.mathworks.com/help/matlab/ref/delaunaytri.pointlocation.html
for making it invisible set the "FaceAlpha" to 0.
Kurt
Kurt el 16 de Mayo de 2024
I think if I do my ECEF coordinate conversion first and then extract the tetramesh, it just might work.

Iniciar sesión para comentar.

Más respuestas (0)

Productos

Versión

R2023b

Preguntada:

el 6 de Mayo de 2024

Comentada:

el 16 de Mayo de 2024

Community Treasure Hunt

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

Start Hunting!

Translated by