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); }
void GEdgeSigned::print() const { if(getBeginVertex() && getEndVertex()) Msg::Info("Curve %d sign %d, ordered points %d, %d", ge->tag(), _sign, getBeginVertex()->tag(), getEndVertex()->tag()); else Msg::Info("Curve %d sign %d, no begin or end points", ge->tag(), _sign); }
void GEdge::writeGEO(FILE *fp) { if(!getBeginVertex() || !getEndVertex() || geomType() == DiscreteCurve) return; if(geomType() == Line){ fprintf(fp, "Line(%d) = {%d, %d};\n", tag(), getBeginVertex()->tag(), getEndVertex()->tag()); } else{ // approximate other curves by splines Range<double> bounds = parBounds(0); double umin = bounds.low(); double umax = bounds.high(); fprintf(fp, "p%d = newp;\n", tag()); int N = minimumDrawSegments(); for(int i = 1; i < N; i++){ double u = umin + (double)i / N * (umax - umin); GPoint p = point(u); fprintf(fp, "Point(p%d + %d) = {%.16g, %.16g, %.16g};\n", tag(), i, p.x(), p.y(), p.z()); } fprintf(fp, "Spline(%d) = {%d", tag(), getBeginVertex()->tag()); for(int i = 1; i < N; i++) fprintf(fp, ", p%d + %d", tag(), i); fprintf(fp, ", %d};\n", getEndVertex()->tag()); } if(meshAttributes.method == MESH_TRANSFINITE){ fprintf(fp, "Transfinite Line {%d} = %d", tag() * (meshAttributes.typeTransfinite > 0 ? 1 : -1), meshAttributes.nbPointsTransfinite); if(meshAttributes.typeTransfinite){ if(std::abs(meshAttributes.typeTransfinite) == 1) fprintf(fp, " Using Progression "); else fprintf(fp, " Using Bump "); fprintf(fp, "%g", meshAttributes.coeffTransfinite); } fprintf(fp, ";\n"); } if(meshAttributes.reverseMesh) fprintf(fp, "Reverse Line {%d};\n", tag()); }
int OCCEdge::minimumMeshSegments() const { int np; if(geomType() == Line) np = GEdge::minimumMeshSegments(); else np = CTX::instance()->mesh.minCurvPoints - 1; // if the edge is closed, ensure that at least 3 points are // generated in the 1D mesh (4 segments, one of which is // degenerated) if (getBeginVertex() == getEndVertex()) np = std::max(4, np); return std::max(np, meshAttributes.minimumMeshSegments); }
bool GEdge::computeDistanceFromMeshToGeometry (double &d2, double &dmax) { d2 = 0.0; dmax = 0.0; if (geomType() == Line) return true; if (!lines.size())return false; IntPt *pts; int npts; lines[0]->getIntegrationPoints(2*lines[0]->getPolynomialOrder(), &npts, &pts); for (unsigned int i = 0; i < lines.size(); i++){ MLine *l = lines[i]; double t[256]; for (int j=0; j< l->getNumVertices();j++){ MVertex *v = l->getVertex(j); if (v->onWhat() == getBeginVertex()){ t[j] = getLowerBound(); } else if (v->onWhat() == getEndVertex()){ t[j] = getUpperBound(); } else { v->getParameter(0,t[j]); } } for (int j=0;j<npts;j++){ SPoint3 p; l->pnt(pts[j].pt[0],0,0,p); double tinit = l->interpolate(t,pts[j].pt[0],0,0); GPoint pc = closestPoint(p, tinit); if (!pc.succeeded())continue; double dsq = (pc.x()-p.x())*(pc.x()-p.x()) + (pc.y()-p.y())*(pc.y()-p.y()) + (pc.z()-p.z())*(pc.z()-p.z()); d2 += pts[i].weight * fabs(l->getJacobianDeterminant(pts[j].pt[0],0,0)) * dsq; dmax = std::max(dmax,sqrt(dsq)); } } d2 = sqrt(d2); return true; }
void OCCEdge::writeGEO(FILE *fp) { if(geomType() == Circle){ gp_Pnt center; if(curve.IsNull()){ center = Handle(Geom_Circle)::DownCast(curve2d)->Location(); } else{ center = Handle(Geom_Circle)::DownCast(curve)->Location(); } // GEO supports only circle arcs < Pi if(s1 - s0 < M_PI){ fprintf(fp, "p%d = newp;\n", tag()); fprintf(fp, "Point(p%d + 1) = {%.16g, %.16g, %.16g};\n", tag(), center.X(), center.Y(), center.Z()); fprintf(fp, "Circle(%d) = {%d, p%d + 1, %d};\n", tag(), getBeginVertex()->tag(), tag(), getEndVertex()->tag()); } else GEdge::writeGEO(fp); } else GEdge::writeGEO(fp); }
void GEdgeSigned::print() const { Msg::Info("GEdgeSigned : Edge %d sign %d Ordered Vertices %d,%d", ge->tag(), _sign, getBeginVertex()->tag(), getEndVertex()->tag()); }