/** * Classifies a point according to the specified plane with EPSILON accuracy. * @param p point * @param plane plane * @return >0 if the point is above (OUT), * =0 if the point is on (ON), * <0 if the point is below (IN) */ int BOP_classify(const MT_Point3& p, const MT_Plane3& plane) { // Compare plane - point distance with zero return BOP_comp0(plane.signedDistance(p)); }
/** * Returns if a plane contains a point with EPSILON accuracy. * @param plane plane * @param point point * @return true if the point is on the plane, false otherwise */ bool BOP_containsPoint(const MT_Plane3& plane, const MT_Point3& point) { return BOP_fuzzyZero(plane.signedDistance(point)); }
bool BSP_CSGMesh:: SC_Face( BSP_FaceInd f ){ #if 0 { // check area is greater than zero. vector<BSP_MVertex> & verts = VertexSet(); vector<BSP_VertexInd> f_verts; FaceVertices(f,f_verts); MT_assert(f_verts.size() >= 3); BSP_VertexInd root = f_verts[0]; MT_Scalar area = 0; for (int i=2; i < f_verts.size(); i++) { MT_Vector3 a = verts[root].m_pos; MT_Vector3 b = verts[f_verts[i-1]].m_pos; MT_Vector3 c = verts[f_verts[i]].m_pos; MT_Vector3 l1 = b-a; MT_Vector3 l2 = c-b; area += (l1.cross(l2)).length()/2; } MT_assert(!MT_fuzzyZero(area)); } #endif // Check coplanarity #if 0 MT_Plane3 plane = FacePlane(f); const BSP_MFace & face = FaceSet()[f]; vector<BSP_VertexInd>::const_iterator f_verts_it = face.m_verts.begin(); vector<BSP_VertexInd>::const_iterator f_verts_end = face.m_verts.end(); for (;f_verts_it != f_verts_end; ++f_verts_it) { MT_Scalar dist = plane.signedDistance( VertexSet()[*f_verts_it].m_pos ); MT_assert(fabs(dist) < BSP_SPLIT_EPSILON); } #endif // Check connectivity vector<BSP_EdgeInd> f_edges; FaceEdges(f,f_edges); MT_assert(f_edges.size() == FaceSet()[f].m_verts.size()); unsigned int i; for (i = 0; i < f_edges.size(); ++i) { int matches = 0; for (unsigned int j = 0; j < EdgeSet()[f_edges[i]].m_faces.size(); j++) { if (EdgeSet()[f_edges[i]].m_faces[j] == f) matches++; } MT_assert(matches == 1); } return true; }