/* 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); }