bool MgArc::_setHandlePoint(int index, const Point2d& pt, float) { if (index == 1) { return setStartMidEnd(pt, getMidPoint(), getEndPoint()); } if (index == 2) { return setStartMidEnd(getStartPoint(), getMidPoint(), pt); } if (index == 3) { return setStartMidEnd(getStartPoint(), pt, getEndPoint()); } if (index == 4) { float a = (pt - getCenter()).angle2(); return setCenterRadius(getCenter(), getRadius(), a, getEndAngle() - a); } if (index == 5) { float a = (pt - getCenter()).angle2(); return setCenterRadius(getCenter(), getRadius(), getStartAngle(), a - getStartAngle()); } if (index == 6) { return setTanStartEnd(pt - getStartPoint(), getStartPoint(), getEndPoint()); } if (index == 7) { return (setTanStartEnd(getEndPoint() - pt, getEndPoint(), getStartPoint()) && _reverse()); } return setCenterStartEnd(pt, getStartPoint(), getEndPoint()); }
bool MgArc::setTanStartEnd(const Vector2d& startTan, const Point2d& start, const Point2d& end) { Point2d center; float radius, startAngle, sweepAngle = 0; return mgArcTan(start, end, startTan, center, radius, &startAngle, &sweepAngle) && setCenterRadius(center, radius, startAngle, sweepAngle); }
bool MgArc::setStartMidEnd(const Point2d& start, const Point2d& point, const Point2d& end) { Point2d center; float radius, startAngle, sweepAngle = 0; return mgArc3P(start, point, end, center, radius, &startAngle, &sweepAngle) && setCenterRadius(center, radius, startAngle, sweepAngle); }
bool MgArc::setCenterStartEnd(const Point2d& center, const Point2d& start, const Point2d& end) { float startAngle = (start - center).angle2(); float endAngle = (end - center).angle2(); float sweepAngle = mgToRange(endAngle - startAngle, -_M_2PI, _M_2PI); if (!mgIsZero(sweepAngle)) { float lastSweepAngle = getSweepAngle(); if (fabsf( fabsf(sweepAngle) - fabsf(lastSweepAngle) ) > _M_PI_6) { sweepAngle = sweepAngle + (sweepAngle > 0 ? -_M_2PI : _M_2PI); } } return setCenterRadius(center, start.distanceTo(center), startAngle, sweepAngle); }
bool MgArc::setCSE(const Point2d& center, const Point2d& start, const Point2d& end, float lastSweepAngle) { float startAngle = (start - center).angle2(); float endAngle = (end - center).angle2(); float sweepAngle = mgbase::toRange(endAngle - startAngle, -_M_2PI, _M_2PI); if (fabsf(sweepAngle - lastSweepAngle) > _M_PI) { if (fabsf(sweepAngle) < _M_D2R * 5 && fabsf(lastSweepAngle) > _M_PI + _M_PI_2) { sweepAngle = lastSweepAngle > 0 ? _M_2PI : -_M_2PI; } else { sweepAngle = sweepAngle + (sweepAngle > 0 ? -_M_2PI : _M_2PI); } } return setCenterRadius(center, start.distanceTo(center), startAngle, sweepAngle); }
bool MgArc::_setHandlePoint2(int index, const Point2d& pt, float, int& data) { static float lastSweepAngle; if (index == 1 || index == 2) { // 起点、终点 return setCenterRadius(getCenter(), pt.distanceTo(getCenter()), getStartAngle(), getSweepAngle()); } if (index == 3) { // 弧线中点 return setStartMidEnd(getStartPoint(), pt, getEndPoint()); } if (index == 4) { // 改变起始角度 if (data == 0) { lastSweepAngle = getSweepAngle(); data++; } Point2d startPt(getCenter().polarPoint((pt - getCenter()).angle2(), getRadius())); bool ret = setCSE(getCenter(), startPt, getEndPoint(), lastSweepAngle); lastSweepAngle = getSweepAngle(); return ret; } if (index == 5) { // 改变终止角度 if (data == 0) { lastSweepAngle = getSweepAngle(); data++; } Point2d endPt(getCenter().polarPoint((pt - getCenter()).angle2(), getRadius())); bool ret = setCSE(getCenter(), getStartPoint(), endPt, lastSweepAngle); lastSweepAngle = getSweepAngle(); return ret; } if (index == 6) { return setTanStartEnd(pt - getStartPoint(), getStartPoint(), getEndPoint()); } if (index == 7) { return (setTanStartEnd(getEndPoint() - pt, getEndPoint(), getStartPoint()) && _reverse()); } return offset(pt - getCenter(), -1); }
bool MgArc::setCenterStartEnd(const Point2d& center, const Point2d& start) { float startAngle = (start - center).angle2(); return setCenterRadius(center, start.distanceTo(center), startAngle, 0); }