void RGraphicsSceneQt::exportArcSegment(const RArc& arc, bool allowForZeroLength) { Q_ASSERT(currentPainterPath.isValid()); if (arc.getRadius()<RS::PointTolerance) { currentPainterPath.addPoint(arc.getCenter()); return; } // arc threshold is configurable (FS#1012): if (arc.getAngleLength(allowForZeroLength)<=RSettings::getArcAngleLengthThreshold()) { // Qt won't export a zero length line as point: RVector startPoint = arc.getStartPoint() - RVector::createPolar(0.01, arc.getStartAngle()+M_PI_2); RVector endPoint = arc.getEndPoint() + RVector::createPolar(0.01, arc.getStartAngle()+M_PI_2); currentPainterPath.moveTo(startPoint); currentPainterPath.lineTo(endPoint); return; } // arc approximation with splines: faster but not precise enough: // RPainterPath p; // p.addArc(arc); // currentPainterPath.addPath(p); if (twoColorSelectedMode) { // QPainterPath with pattern shown as solid when clipped bug workaround: currentPainterPath.moveTo(arc.getStartPoint()); currentPainterPath.arcTo( arc.getCenter().x-arc.getRadius(), arc.getCenter().y-arc.getRadius(), arc.getRadius()*2, arc.getRadius()*2, RMath::rad2deg(-arc.getStartAngle()), RMath::rad2deg(-arc.getSweep()) ); } else { currentPainterPath.setAutoRegen(true); RGraphicsScene::exportArcSegment(arc, allowForZeroLength); } }
QList<RVector> RShape::getIntersectionPointsAT(const RArc& arc1, const RTriangle& triangle2, bool limited) { Q_UNUSED(limited) RTriangle plane(arc1.getCenter(), arc1.getStartPoint(), arc1.getEndPoint()); QList<RVector> r = plane.getIntersectionPoints(RLine(triangle2.getCorner(0), triangle2.getCorner(1))); r.append(plane.getIntersectionPoints(RLine(triangle2.getCorner(1), triangle2.getCorner(2)))); r.append(plane.getIntersectionPoints(RLine(triangle2.getCorner(2), triangle2.getCorner(0)))); if (r.size()<2) { return QList<RVector>(); } RLine l(r[0], r[1]); return l.getIntersectionPoints(arc1); }
void RExporter::exportArcSegment(const RArc& arc) { double segmentLength; if (pixelSizeHint>0.0) { // approximate arc with segments with the length of 2 pixels: segmentLength = pixelSizeHint * 2; } else { segmentLength = arc.getRadius() / 40.0; } // avoid a segment length of 0: if (segmentLength<1.0e-4) { segmentLength = 1.0e-4; } double a1 = arc.getStartAngle(); double a2 = arc.getEndAngle(); RVector center = arc.getCenter(); double radius = arc.getRadius(); // avoid huge radius and slow down to almost stand-still: if (radius>1.0e6) { return; } double aStep; if (radius<1.0e-3) { aStep = 0.1; } else { aStep = segmentLength / radius; if (aStep>1.0) { aStep = 1.0; } double minAStep = 2*M_PI/360.0; if (!draftMode) { minAStep /= 4; } if (aStep<minAStep) { aStep = minAStep; } } RVector prev = arc.getStartPoint(); RVector ci; double a; if(!arc.isReversed()) { // Arc Counterclockwise: if(a1>a2-RS::AngleTolerance) { a2+=2*M_PI; } for(a=a1+aStep; a<=a2; a+=aStep) { ci.x = center.x + cos(a) * radius; ci.y = center.y + sin(a) * radius; //path.lineTo(RVector(ci.x, ci.y)); this->exportLineSegment(RLine(prev, ci)); prev = ci; } } else { // Arc Clockwise: if(a1<a2+RS::AngleTolerance) { a2-=2*M_PI; } for(a=a1-aStep; a>=a2; a-=aStep) { ci.x = center.x + cos(a) * radius; ci.y = center.y + sin(a) * radius; this->exportLineSegment(RLine(prev, ci)); //path.lineTo(RVector(cix, ciy)); prev = ci; } } this->exportLineSegment(RLine(prev, arc.getEndPoint())); //path.lineTo(arc.getEndPoint()); }
void RExporter::exportArcSegment(const RArc& arc, bool allowForZeroLength) { if (allowForZeroLength && arc.isFullCircle()) { exportLineSegment(RLine(arc.getStartPoint(), arc.getEndPoint()), arc.getDirection1()); return; } double segmentLength; if (pixelSizeHint>0.0) { // approximate arc with segments with the length of 2 pixels: segmentLength = pixelSizeHint * 2; } else { segmentLength = arc.getRadius() / 40.0; } // avoid a segment length of 0: if (segmentLength<1.0e-4) { segmentLength = 1.0e-4; } double a1 = arc.getStartAngle(); double a2 = arc.getEndAngle(); RVector center = arc.getCenter(); double radius = arc.getRadius(); double aStep; if (radius<1.0e-3) { aStep = 0.1; } else { aStep = segmentLength / radius; if (aStep>1.0) { aStep = 1.0; } double minAStep = RSettings::getMinArcAngleStep(); if (draftMode) { minAStep *= 4; } if (aStep<minAStep) { aStep = minAStep; } } RVector prev = arc.getStartPoint(); RVector ci; double a; if (!arc.isReversed()) { // Arc Counterclockwise: if(a1>a2-RS::AngleTolerance) { a2+=2*M_PI; } for (a=a1+aStep; a<=a2; a+=aStep) { ci.x = center.x + cos(a) * radius; ci.y = center.y + sin(a) * radius; exportLineSegment(RLine(prev, ci), a+M_PI_2); prev = ci; } } else { // Arc Clockwise: if (a1<a2+RS::AngleTolerance) { a2-=2*M_PI; } for (a=a1-aStep; a>=a2; a-=aStep) { ci.x = center.x + cos(a) * radius; ci.y = center.y + sin(a) * radius; exportLineSegment(RLine(prev, ci), a+M_PI_2); prev = ci; } } this->exportLineSegment(RLine(prev, arc.getEndPoint()), arc.getEndAngle()+M_PI_2); }