Volumen de intersección en Matlab
3d intersection (0)
He desarrollado un código que toma un conjunto de coordenadas 3D y realiza una triangulación para generar el casco convexo / Delaunay.
Esto ha ido bien y usando la triangulación de Deluanay puedo probar si los puntos están contenidos en un volumen determinado usando tsearchn.
Ahora quiero tomar dos de esos volúmenes en 3D y probar si se cruzan. Además, me gustaría saber qué porcentaje del volumen A se cruza con el Volumen B.
Creo que podría generar una malla de puntos que están dentro de uno de los volúmenes, luego probarlos en el otro usando tsearchn. Pero quería saber si alguien sabe de una manera más conveniente. O tiene consejos para hacer análisis similares.
¡Muchas gracias!
EDITAR ... Código de ejemplo
Para este código de ejemplo, shapeA
sería intersectada en un 50% por shapeB
.
tsearchn
una sección al final del código que muestra la usabilidad de tsearchn
Sé que podría resolver mi problema aumentando el número de puntos de las formas y probándolos con tsearchn
% Establish shapes by coordinates
botA = [ 0 0 0 ; ...
1 0 0; ...
1 1 0; ...
0 1 0 ];
topA = botA; topA(:,3) = 1;
midA = [0.5 0.5 0.5];
botB = [ 0 0 0.5 ; ...
1 0 0.5; ...
1 1 0.5; ...
0 1 0.5 ];
topB = botA; topB(:,3) = 1.5;
midB = [0.5 0.5 1];
% Shape arrays
shapeA = [botA;midA;topA];
shapeB = [botB;midB;topB];
% Establish volume by using the delaunayn() function
dtA = delaunayn(shapeA);
dtB = delaunayn(shapeB);
% Plot the volume surfaces
shapesurfA=tetramesh(dtA,shapeA);
set(shapesurfA,''FaceColor'',''b'',''FaceAlpha'',.90,''EdgeAlpha'',1);
hold on
shapesurfB=tetramesh(dtB,shapeB);
set(shapesurfB,''FaceColor'',''y'',''FaceAlpha'',.90,''EdgeAlpha'',1);
hold off
axis equal
%example of point in volume test
%if tsearchn output = NaN then testpoint is not in volume
testpoint1 = tsearchn(shapeA,dtA, [ 2 2 2]) % [test point [2 2 2] in volume A
testpoint2 = tsearchn(shapeA,dtA, [0.75 0.75 0.75])