void REllipseEntity::setShape(const REllipse& e) { data.setCenter(e.getCenter()); data.setMajorPoint(e.getMajorPoint()); data.setRatio(e.getRatio()); data.setStartParam(e.getStartParam()); data.setEndParam(e.getEndParam()); data.setReversed(e.isReversed()); }
/** * Exports an ellipse with the current attributes. * \todo switch from line based interpolation to arcs. */ void RExporter::exportEllipse(const REllipse& ellipse, double offset) { if (ellipse.getMajorRadius()<RS::PointTolerance || ellipse.getMinorRadius()<RS::PointTolerance) { return; } RPolyline polyline; RVector cp = ellipse.getCenter(); double radius1 = ellipse.getMajorRadius(); double radius2 = ellipse.getMinorRadius(); double angle = ellipse.getAngle(); double a1 = ellipse.getStartParam(); double a2 = ellipse.getEndParam(); bool reversed = ellipse.isReversed(); double aStep; // Angle Step (rad) double a; // Current Angle (rad) aStep=0.05; RVector vp; RVector vc(cp.x, cp.y); vp.set(cp.x+cos(a1)*radius1, cp.y+sin(a1)*radius2); vp.rotate(angle, vc); polyline.appendVertex(vp); if (!reversed) { // Arc Counterclockwise: if (a1>a2-RS::AngleTolerance) { a2+=2*M_PI; } for(a=a1+aStep; a<=a2; a+=aStep) { vp.set(cp.x+cos(a)*radius1, cp.y+sin(a)*radius2); vp.rotate(angle, vc); polyline.appendVertex(vp); } } else { // Arc Clockwise: if (a1<a2+RS::AngleTolerance) { a2-=2*M_PI; } for(a=a1-aStep; a>=a2; a-=aStep) { vp.set(cp.x+cos(a)*radius1, cp.y+sin(a)*radius2); vp.rotate(angle, vc); polyline.appendVertex(vp); } } vp.set(cp.x+cos(a2)*radius1, cp.y+sin(a2)*radius2); vp.rotate(angle, vc); polyline.appendVertex(vp); exportPolyline(polyline, offset); }