//================================================================ // Function : Convert_Presentation::sampleBezier // Purpose : //================================================================ void Convert_Presentation::sampleBezier() { TCollection_AsciiString aText ( " Standard_Real aPolesCoords[][3] = {" EOL " {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0},{2,0,0},{2,-1,0}," EOL " {3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0},{5,0,0},{6,0,0},{6,-1,0},{7,-1,0}," EOL " {7,0,0},{8,0,0},{8,1,0}" EOL " };" EOL " TColgp_Array1OfPnt aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*2));" EOL " " EOL " for (Standard_Integer i=1; i <= aPoles.Upper(); i++)" EOL " aPoles(i) = gp_Pnt (aPolesCoords[i-1][0]*100, " EOL " aPolesCoords[i-1][1]*100, " EOL " aPolesCoords[i-1][2]*100);" EOL " " EOL " Handle(Geom_BezierCurve) aCurve = new Geom_BezierCurve (aPoles);" EOL ); Standard_Real aPolesCoords[][3] = { {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0},{2,0,0},{2,-1,0}, {3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0},{5,0,0},{6,0,0},{6,-1,0},{7,-1,0}, {7,0,0},{8,0,0},{8,1,0} }; TColgp_Array1OfPnt aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*3)); for (Standard_Integer i=1; i <= aPoles.Upper(); i++) aPoles(i) = gp_Pnt (aPolesCoords[i-1][0]*150-500, aPolesCoords[i-1][1]*150, aPolesCoords[i-1][2]*150); Handle(Geom_BezierCurve) aCurve = new Geom_BezierCurve (aPoles); drawCurveAndItsBSpline (aCurve, "BezierCurve", aText); }
/*! \brief Returns the oriented normal of a triangle * * \warning The returned vector is not normalized * * \param nodes Vertices of the triangulation that \p triangle belongs to * \param triangle Triangle whose normal has to be computed * \param ori Orientation of the triangle (generally inherited from the * triangulated face) */ gp_Vec MathUtils::triangleNormal( const TColgp_Array1OfPnt &nodes, const Poly_Triangle &triangle, TopAbs_Orientation ori) { Standard_Integer n1, n2, n3; if (ori == TopAbs_REVERSED) triangle.Get(n1, n3, n2); else triangle.Get(n1, n2, n3); assert(nodes.Lower() <= n1 && n1 <= nodes.Upper()); assert(nodes.Lower() <= n2 && n2 <= nodes.Upper()); assert(nodes.Lower() <= n3 && n3 <= nodes.Upper()); const gp_Vec v1(nodes(n1), nodes(n2)); // V1=(P1,P2) const gp_Vec v2(nodes(n2), nodes(n3)); // V2=(P2,P3) const gp_Vec v3(nodes(n3), nodes(n1)); // V3=(P3,P1) if ((v1.SquareMagnitude() > 1.e-10) && (v2.SquareMagnitude() > 1.e-10) && (v3.SquareMagnitude() > 1.e-10)) { return v1.Crossed(v2); } return v1; }
Handle(Geom_BSplineSurface) ParameterCorrection::CreateSurface(const TColgp_Array1OfPnt& points, unsigned short usIter, bool bParaCor, float fSizeFactor) { if (_pvcPoints != NULL) { delete _pvcPoints; _pvcPoints = NULL; delete _pvcUVParam; _pvcUVParam = NULL; } _pvcPoints = new TColgp_Array1OfPnt(points.Lower(), points.Upper()); *_pvcPoints = points; _pvcUVParam = new TColgp_Array1OfPnt2d(points.Lower(), points.Upper()); if (_usUCtrlpoints*_usVCtrlpoints > _pvcPoints->Length()) return NULL; //LGS unterbestimmt if(!DoInitialParameterCorrection(fSizeFactor)) return NULL; if (bParaCor) DoParameterCorrection(usIter); return new Geom_BSplineSurface (_vCtrlPntsOfSurf, _vUKnots, _vVKnots, _vUMults, _vVMults, _usUOrder-1, _usVOrder-1); }
/* Creates the hyperboloid using a formula. TODO: Update this so the hyperboloid actually represents a proper parametric model. */ TopoDS_Shape hyperboloid::create(double innerRadius, double height, double heightUnder, double angle) { int detail = 40; gp_Pnt Origin(0,0,0); gp_Vec Dir(0,0,1); int uCount = detail; double a = innerRadius; double c = angle; double totalHeight = height + heightUnder; TColgp_Array1OfPnt array (0,uCount - 1); for (double u = 0; u < uCount; u++) { double uValue = ((totalHeight * u / (uCount - 1)) - heightUnder) / c; double vValue = 0; double sqrMe = 1 + uValue * uValue; double x = a * sqrt(sqrMe) * cos(vValue); double y = a * sqrt(sqrMe) * sin(vValue); double z = c * uValue; gp_Pnt P1(x,y,z); array.SetValue(u,P1); } Handle(Geom_BSplineCurve) hyperbola = GeomAPI_PointsToBSpline(array).Curve(); TopoDS_Edge hyperbolaTopoDS = BRepBuilderAPI_MakeEdge(hyperbola); gp_Ax1 axis = gp_Ax1(Origin,Dir); TopoDS_Shape hyperboloid = BRepPrimAPI_MakeRevol(hyperbolaTopoDS, axis); return hyperboloid; }
void HeeksDxfRead::OnReadSpline(struct SplineData& sd) { bool closed = (sd.flag & 1) != 0; bool periodic = (sd.flag & 2) != 0; bool rational = (sd.flag & 4) != 0; // bool planar = (sd.flag & 8) != 0; // bool linear = (sd.flag & 16) != 0; SplineData sd_copy = sd; if(closed) { // add some more control points sd_copy.control_points += 3; //for(int i = 0; i<3; i++ //sd_copy.controlx } TColgp_Array1OfPnt control (1,/*closed ? sd.controlx.size() + 1:*/sd.controlx.size()); TColStd_Array1OfReal weight (1,sd.controlx.size()); std::list<double> knoto; std::list<int> multo; std::list<double>::iterator ity = sd.controly.begin(); std::list<double>::iterator itz = sd.controlz.begin(); std::list<double>::iterator itw = sd.weight.begin(); unsigned i=1; //int i=1; for(std::list<double>::iterator itx = sd.controlx.begin(); itx!=sd.controlx.end(); ++itx) { gp_Pnt pnt(*itx,*ity,*itz); control.SetValue(i,pnt); if(sd.weight.empty()) weight.SetValue(i,1); else { weight.SetValue(i,*itw); ++itw; } ++i; ++ity; ++itz; } i=1; double last_knot = -1; for(std::list<double>::iterator it = sd.knot.begin(); it!=sd.knot.end(); ++it) { if(*it != last_knot) { knoto.push_back(*it); multo.push_back(1); i++; } else { int temp = multo.back(); multo.pop_back(); multo.push_back(temp+1); } last_knot = *it; } TColStd_Array1OfReal knot (1, knoto.size()); TColStd_Array1OfInteger mult (1, knoto.size()); std::list<int>::iterator itm = multo.begin(); i = 1; for(std::list<double>::iterator it = knoto.begin(); it!=knoto.end(); ++it) { knot.SetValue(i,*it); int m = *itm; if(closed && (i == 1 || i == knoto.size()))m = 1; mult.SetValue(i, m); ++itm; ++i; } OnReadSpline(control, weight, knot, mult, sd.degree, periodic, rational); }