RCircle RCircle::createFrom3Points(const RVector& p1, const RVector& p2, const RVector& p3) { // intersection of two middle lines // middle points between first two points: RVector mp1 = RVector::getAverage(p1, p2); double a1 = p1.getAngleTo(p2) + M_PI / 2.0; // direction from middle point to center: RVector dir1 = RVector::createPolar(1.0, a1); // middle points between last two points: RVector mp2 = RVector::getAverage(p2, p3); double a2 = p2.getAngleTo(p3) + M_PI / 2.0; // direction from middle point to center: RVector dir2 = RVector::createPolar(1.0, a2); RLine midLine1(mp1, mp1 + dir1); RLine midLine2(mp2, mp2 + dir2); QList<RVector> ips = midLine1.getIntersectionPoints(midLine2, false); if (ips.length()!=1) { return RCircle(); } RVector center = ips[0]; double radius = center.getDistanceTo(p3); // double angle1 = center.getAngleTo(p1); // double angle2 = center.getAngleTo(p3); // bool reversed = RMath::isAngleBetween(center.getAngleTo(p2), // angle1, angle2, true); return RCircle(center, radius); }
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; }
QList<RVector> RShape::getIntersectionPointsAA(const RArc& arc1, const RArc& arc2, bool limited) { QList<RVector> candidates = RShape::getIntersectionPoints( RCircle(arc1.getCenter(), arc1.getRadius()), RCircle(arc2.getCenter(), arc2.getRadius()) ); if (!limited) { return candidates; } QList<RVector> res; for (int i=0; i<candidates.count(); i++) { if (arc1.isOnShape(candidates[i]) && arc2.isOnShape(candidates[i])) { res.append(candidates[i]); } } // ret.setTangent(tangent); return res; }
RCircle RCircle::createFrom2Points(const RVector& p1, const RVector& p2) { RVector center = (p1+p2)/2.0; double radius = p1.getDistanceTo(p2)/2.0; return RCircle(center, radius); }