in pytorch3d/csrc/iou_box3d/iou_utils.h [429:480]
inline face_verts ClipTriByPlane(
const std::vector<vec3<float>>& plane,
const std::vector<vec3<float>>& tri,
const vec3<float>& normal) {
// Get Triangle vertices
const vec3<float> v0 = tri[0];
const vec3<float> v1 = tri[1];
const vec3<float> v2 = tri[2];
// Check each of the triangle vertices to see if it is inside the plane
const bool isin0 = IsInside(plane, normal, v0);
const bool isin1 = IsInside(plane, normal, v1);
const bool isin2 = IsInside(plane, normal, v2);
// All in
if (isin0 && isin1 && isin2) {
// Return input vertices
face_verts tris = {{v0, v1, v2}};
return tris;
}
face_verts empty_tris = {};
// All out
if (!isin0 && !isin1 && !isin2) {
return empty_tris;
}
// One vert out
if (isin0 && isin1 && !isin2) {
return ClipTriByPlaneOneOut(plane, normal, v2, v0, v1);
}
if (isin0 && !isin1 && isin2) {
return ClipTriByPlaneOneOut(plane, normal, v1, v0, v2);
}
if (!isin0 && isin1 && isin2) {
return ClipTriByPlaneOneOut(plane, normal, v0, v1, v2);
}
// Two verts out
if (isin0 && !isin1 && !isin2) {
return ClipTriByPlaneTwoOut(plane, normal, v1, v2, v0);
}
if (!isin0 && !isin1 && isin2) {
return ClipTriByPlaneTwoOut(plane, normal, v0, v1, v2);
}
if (!isin0 && isin1 && !isin2) {
return ClipTriByPlaneTwoOut(plane, normal, v0, v2, v1);
}
// Else return empty (should not be reached)
return empty_tris;
}