MATLAB Examples

Tutorial and examples of PINPOLYHEDRON function

PINPOLYHEDRON: This function is an implementation of a novel algorithm. It tests whether points are inside/outside/on a polyhedron defined by triangular faces and vertices. It can be used for various complicated models such as non-convex volumes, multi-material bodies, and there is no assumption about orientation of the face normals. Above all, the algorithm is very efficient especially for large-scale problems.To the authors' best knowledge, it is the fastest code in a large-scale setting.

SYNTAX:

output = pinpolyhedron (p,vertices,faces);

INPUT:

p : The points to be tested represented as an Nx3 matrix of XYZ coordinates,
    e.g., [x1 y1 z1; x2 y2 z2; …].
vertices : The vertices of the polyhedron, in an Mx3 matrix of XYZ coordinates,
    e.g., [x1 y1 z1; x2 y2 z2; …].
faces : The faces of the polyhedron, in an Mx3 matrix,
    e.g., [a1,b1,c1; a2,b2,c2; ...].a b c are the index numbers of the
    three vertices forming the triangular faces.

OUTPUT:

output : an Mx4 array. The first three columns are same as the input p.
        The function set the fourth column as -1 and 0, standing for
        outside or inside the polyhedron respectively ,and -2 stands for
        p on the boundary.

ABOUT multi-material polyhedron:

A body may be composed of different materials, from which one can get a multi-material polyhedron by triangulating its outer boundary and inner boundaries between different materials.

Our algorithm can be used for multi-material polyhedrons too.

The syntax in this case is almost the same. However, the input of faces should be an Mx5 matrix, e.g., [a1,b1,c1,m11, m12; a2,b2,c2,m21,m22; ...]. Here a b c are still index numbers of vertices, and m1 m2 are the two materials on either side of a face. Invoking the function in this way, it will indicate, for a point inside the body, which material the point is in by setting the fourth column output value as the material number. If a testing point is exactly on a triangular face, whether the face is on the outer boundary or an inner one, the function will set the output value as -2.

AUTHOR: Guo YuFei, Jose M. Maisog, Liu JF

REFERENCE : Liu JF, Y.Q. Chen, Jose M. Maisog, George Luta, A new point containment test algorithm based on preprocessing and determining triangles, Computer-Aided Design, vol 42, No.12, December 2010, Pages 1143-1150.

22 Sep 2014 : Version 1.0

Problems or suggestions? Email me: guoyufei2014@gmail.com

More information? Get from: https://stat.ethz.ch/CRAN/web/packages/ptinpoly/

Contents

First example: box(single material model)

b=[0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
c=[0 1 3;1 3 2;0 5 4;0 1 5;1 2 6;1 6 5;3 6 2;6 7 3;0 4 7;...
0 7 3;4 5 7;6 5 7];
a=[rand(50,3)*2-0.5;0 0.3 0.4;0.5 0.5 1];
c=c+1;
out=pinpolyhedron(a,b,c);
fv.vertices=b;
fv.faces=c;
figure, hold on, view(3)
patch(fv,'FaceColor','g','FaceAlpha',0.2)
[m,n]=size(a);
for i=1:m
    if out(i,4)==0
        plot3(out(i,1),out(i,2),out(i,3),'bo','MarkerFaceColor','b')
    elseif out(i,4)==-1
        plot3(out(i,1),out(i,2),out(i,3),'ro','MarkerFaceColor','r')
    else
        plot3(out(i,1),out(i,2),out(i,3),'yo','MarkerFaceColor','y')
    end
end
axis image
Your model is composed of 1 different materials.

Second example: twonestedboxes(two-material model)

b=[0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1;...
0.250000 0.250000 0.250000;0.750000 0.250000 0.250000;...
0.750000 0.750000 0.250000;0.250000 0.750000 0.250000;...
0.250000 0.250000 0.750000;0.750000 0.250000 0.750000;...
0.750000 0.750000 0.750000;0.250000 0.750000 0.750000];
c=[0 1 3   0 -1
1 3 2   -1 0
0 5 4   -1 0
0 1 5   -1 0
1 2 6   -1 0
1 6 5   -1 0
3 6 2   -1 0
6 7 3   0 -1
0 4 7   -1 0
0 7 3   -1 0
4 5 7   -1 0
6 5 7   0 -1

8 9 11    1 0
9 11 10   0 1
8 13 12   0 1
8 9 13    0 1
9 10 14   0 1
9 14 13   0 1
11 14 10  0 1
14 15 11  1 0
8 12 15   0 1
8 15 11   0 1
12 13 15  0 1
14 13 15  1 0];
a=[rand(50,3)*2-0.5];
out=pinpolyhedron(a,b,c);
fv.vertices=b;
fv.faces=c(:,1:3)+1;
figure, hold on, view(3)
patch(fv,'FaceColor','g','FaceAlpha',0.2)
[m,n]=size(a);
for i=1:m
    switch out(i,4)
        case 0
        plot3(out(i,1),out(i,2),out(i,3),'co','MarkerFaceColor','c')
        case -1
        plot3(out(i,1),out(i,2),out(i,3),'ro','MarkerFaceColor','r')
        case 1
        plot3(out(i,1),out(i,2),out(i,3),'bo','MarkerFaceColor','b')
        otherwise
        plot3(out(i,1),out(i,2),out(i,3),'yo','MarkerFaceColor','y')
    end
end
axis image
Your model is composed of 2 different materials.