QList<RVector> RShape::getIntersectionPointsAE(const RArc& arc1, const REllipse& ellipse2, bool limited) { QList<RVector> candidates = RShape::getIntersectionPointsCE( RCircle(arc1.getCenter(), arc1.getRadius()), ellipse2); if (!limited) { return candidates; } QList<RVector> res; for (int i=0; i<candidates.count(); i++) { RVector c = candidates[i]; if (arc1.isOnShape(c)) { if (!ellipse2.isFullEllipse()) { double a1 = ellipse2.getCenter().getAngleTo(ellipse2.getStartPoint()); double a2 = ellipse2.getCenter().getAngleTo(ellipse2.getEndPoint()); double a = ellipse2.getCenter().getAngleTo(c); if (!RMath::isAngleBetween(a, a1, a2, ellipse2.isReversed())) { continue; } } res.append(c); } } return res; }
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()); }
QList<RVector> RShape::getIntersectionPointsEE(const REllipse& ellipse1, const REllipse& ellipse2, bool limited) { QList<RVector> candidates = getIntersectionPointsEE(ellipse1, ellipse2); if (!limited) { return candidates; } QList<RVector> ret; for (int i=0; i<candidates.length(); i++) { RVector c = candidates[i]; bool onShape = true; double a1 = ellipse1.getCenter().getAngleTo(ellipse1.getStartPoint()); double a2 = ellipse1.getCenter().getAngleTo(ellipse1.getEndPoint()); double a = ellipse1.getCenter().getAngleTo(c); if (!RMath::isAngleBetween(a, a1, a2, ellipse1.isReversed())) { // qDebug() << "1) angle NOT between: " // << " a: " << RMath::rad2deg(a) // << " a1: " << RMath::rad2deg(a1) // << " a2: " << RMath::rad2deg(a2) // << " r: " << ellipse1.isReversed(); //ret.append(c); onShape = false; } a1 = ellipse2.getCenter().getAngleTo(ellipse2.getStartPoint()); a2 = ellipse2.getCenter().getAngleTo(ellipse2.getEndPoint()); a = ellipse2.getCenter().getAngleTo(c); if (!RMath::isAngleBetween(a, a1, a2, ellipse2.isReversed())) { // qDebug() << "2) angle NOT between: " // << " a: " << RMath::rad2deg(a) // << " a1: " << RMath::rad2deg(a1) // << " a2: " << RMath::rad2deg(a2) // << " r: " << ellipse2.isReversed(); //ret.append(c); onShape = false; } if (onShape) { ret.append(c); } } return ret; }
/** * 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); }