SOrientedBoundingBox GRegion::getOBB() { if (!_obb) { std::vector<SPoint3> vertices; std::list<GFace*> b_faces = faces(); for (std::list<GFace*>::iterator b_face = b_faces.begin(); b_face != b_faces.end(); b_face++) { if((*b_face)->getNumMeshVertices() > 0) { int N = (*b_face)->getNumMeshVertices(); for (int i = 0; i < N; i++) { MVertex* mv = (*b_face)->getMeshVertex(i); vertices.push_back(mv->point()); } std::list<GEdge*> eds = (*b_face)->edges(); for(std::list<GEdge*>::iterator ed = eds.begin(); ed != eds.end(); ed++) { int N2 = (*ed)->getNumMeshVertices(); for (int i = 0; i < N2; i++) { MVertex* mv = (*ed)->getMeshVertex(i); vertices.push_back(mv->point()); } // Don't forget to add the first and last vertices... SPoint3 pt1((*ed)->getBeginVertex()->x(), (*ed)->getBeginVertex()->y(), (*ed)->getBeginVertex()->z()); SPoint3 pt2((*ed)->getEndVertex()->x(), (*ed)->getEndVertex()->y(), (*ed)->getEndVertex()->z()); vertices.push_back(pt1); vertices.push_back(pt2); } } else if ((*b_face)->buildSTLTriangulation()) { for (unsigned int i = 0; i < (*b_face)->stl_vertices.size(); i++){ GPoint p = (*b_face)->point((*b_face)->stl_vertices[i]); vertices.push_back(SPoint3(p.x(), p.y(), p.z())); } } else { int N = 10; std::list<GEdge*> b_edges = (*b_face)->edges(); for (std::list<GEdge*>::iterator b_edge = b_edges.begin(); b_edge != b_edges.end(); b_edge++) { Range<double> tr = (*b_edge)->parBounds(0); for (int j = 0; j < N; j++) { double t = tr.low() + (double)j / (double)(N - 1) * (tr.high() - tr.low()); GPoint p = (*b_edge)->point(t); SPoint3 pt(p.x(), p.y(), p.z()); vertices.push_back(pt); } } } } _obb = SOrientedBoundingBox::buildOBB(vertices); } return SOrientedBoundingBox(_obb); }
SOrientedBoundingBox GEdge::getOBB() { if (!_obb) { std::vector<SPoint3> vertices; if(getNumMeshVertices() > 0) { int N = getNumMeshVertices(); for (int i = 0; i < N; i++) { MVertex* mv = getMeshVertex(i); vertices.push_back(mv->point()); } // Don't forget to add the first and last vertices... SPoint3 pt1(getBeginVertex()->x(), getBeginVertex()->y(), getBeginVertex()->z()); SPoint3 pt2(getEndVertex()->x(), getEndVertex()->y(), getEndVertex()->z()); vertices.push_back(pt1); vertices.push_back(pt2); } else if(geomType() != DiscreteCurve && geomType() != BoundaryLayerCurve){ Range<double> tr = this->parBounds(0); // N can be choosen arbitrarily, but 10 points seems reasonable int N = 10; for (int i = 0; i < N; i++) { double t = tr.low() + (double)i / (double)(N - 1) * (tr.high() - tr.low()); GPoint p = point(t); SPoint3 pt(p.x(), p.y(), p.z()); vertices.push_back(pt); } } else { SPoint3 dummy(0, 0, 0); vertices.push_back(dummy); } _obb = SOrientedBoundingBox::buildOBB(vertices); } return SOrientedBoundingBox(_obb); }