34 static QBezier fromPoints(
const QPointF &p1,
const QPointF &p2,
35 const QPointF &p3,
const QPointF &p4)
36 {
return {p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y(), p4.x(), p4.y()}; }
38 static void coefficients(qreal t, qreal &a, qreal &b, qreal &c, qreal &d);
40 inline QPointF pointAt(qreal t)
const;
41 inline QPointF normalVector(qreal t)
const;
43 inline QPointF derivedAt(qreal t)
const;
44 inline QPointF secondDerivedAt(qreal t)
const;
46 QPolygonF toPolygon(qreal bezier_flattening_threshold = 0.5)
const;
47 void addToPolygon(QPolygonF *p, qreal bezier_flattening_threshold = 0.5)
const;
48 void addToPolygon(QDataBuffer<QPointF> &polygon, qreal bezier_flattening_threshold)
const;
50 QRectF bounds()
const;
51 qreal length(qreal error = 0.01)
const;
52 void addIfClose(qreal *length, qreal error)
const;
54 qreal tAtLength(qreal len)
const;
56 int stationaryYPoints(qreal &t0, qreal &t1)
const;
57 qreal tForY(qreal t0, qreal t1, qreal y)
const;
59 QPointF pt1()
const {
return QPointF(x1, y1); }
60 QPointF pt2()
const {
return QPointF(x2, y2); }
61 QPointF pt3()
const {
return QPointF(x3, y3); }
62 QPointF pt4()
const {
return QPointF(x4, y4); }
64 QBezier mapBy(
const QTransform &transform)
const;
66 inline QPointF midPoint()
const;
67 inline QLineF midTangent()
const;
69 inline QLineF startTangent()
const;
70 inline QLineF endTangent()
const;
72 inline void parameterSplitLeft(qreal t, QBezier *left);
73 inline std::pair<QBezier, QBezier> split()
const;
75 int shifted(QBezier *curveSegments,
int maxSegmets,
76 qreal offset,
float threshold)
const;
78 QBezier bezierOnInterval(qreal t0, qreal t1)
const;
79 QBezier getSubRange(qreal t0, qreal t1)
const;
81 qreal x1, y1, x2, y2, x3, y3, x4, y4;
89inline QLineF QBezier::midTangent()
const
91 QPointF mid = midPoint();
92 QLineF dir(QLineF(x1, y1, x2, y2).pointAt(0.5), QLineF(x3, y3, x4, y4).pointAt(0.5));
93 return QLineF(mid.x() - dir.dx(), mid.y() - dir.dy(),
94 mid.x() + dir.dx(), mid.y() + dir.dy());
97inline QLineF QBezier::startTangent()
const
99 QLineF tangent(pt1(), pt2());
100 if (tangent.isNull())
101 tangent = QLineF(pt1(), pt3());
102 if (tangent.isNull())
103 tangent = QLineF(pt1(), pt4());
107inline QLineF QBezier::endTangent()
const
109 QLineF tangent(pt4(), pt3());
110 if (tangent.isNull())
111 tangent = QLineF(pt4(), pt2());
112 if (tangent.isNull())
113 tangent = QLineF(pt4(), pt1());
163inline QPointF QBezier::derivedAt(qreal t)
const
170 qreal a = -m_t * m_t;
171 qreal b = 1 - 4 * t + 3 * d;
172 qreal c = 2 * t - 3 * d;
174 return 3 * QPointF(a * x1 + b * x2 + c * x3 + d * x4,
175 a * y1 + b * y2 + c * y3 + d * y4);
189std::pair<QBezier, QBezier> QBezier::split()
const
191 const auto mid = [](QPointF lhs, QPointF rhs) {
return (lhs + rhs) * .5; };
193 const QPointF mid_12 = mid(pt1(), pt2());
194 const QPointF mid_23 = mid(pt2(), pt3());
195 const QPointF mid_34 = mid(pt3(), pt4());
196 const QPointF mid_12_23 = mid(mid_12, mid_23);
197 const QPointF mid_23_34 = mid(mid_23, mid_34);
198 const QPointF mid_12_23__23_34 = mid(mid_12_23, mid_23_34);
201 fromPoints(pt1(), mid_12, mid_12_23, mid_12_23__23_34),
202 fromPoints(mid_12_23__23_34, mid_23_34, mid_34, pt4()),
206inline void QBezier::parameterSplitLeft(qreal t, QBezier *left)
211 left->x2 = x1 + t * ( x2 - x1 );
212 left->y2 = y1 + t * ( y2 - y1 );
214 left->x3 = x2 + t * ( x3 - x2 );
215 left->y3 = y2 + t * ( y3 - y2 );
217 x3 = x3 + t * ( x4 - x3 );
218 y3 = y3 + t * ( y4 - y3 );
220 x2 = left->x3 + t * ( x3 - left->x3);
221 y2 = left->y3 + t * ( y3 - left->y3);
223 left->x3 = left->x2 + t * ( left->x3 - left->x2 );
224 left->y3 = left->y2 + t * ( left->y3 - left->y2 );
226 left->x4 = x1 = left->x3 + t * (x2 - left->x3);
227 left->y4 = y1 = left->y3 + t * (y2 - left->y3);