Qt中计算椭圆、椭圆弧上点的方法
程序员文章站
2022-03-31 11:30:37
...
起初使用以下方法
椭圆上点的方法
但是遇到椭圆越扁平的时候,误差越大。什么原因?哎。果然数学是程序的灵魂。
后来找到以下方法
在文件qpainterpath.cpp 中,Qt根据角度计算椭圆弧上的点
void qt_find_ellipse_coords(const QRectF &r, qreal angle, qreal length,
QPointF* startPoint, QPointF *endPoint)
{
if (r.isNull()) {
if (startPoint)
*startPoint = QPointF();
if (endPoint)
*endPoint = QPointF();
return;
}
qreal w2 = r.width() / 2;
qreal h2 = r.height() / 2;
qreal angles[2] = { angle, angle + length };
QPointF *points[2] = { startPoint, endPoint };
for (int i = 0; i < 2; ++i) {
if (!points[i])
continue;
qreal theta = angles[i] - 360 * qFloor(angles[i] / 360);
qreal t = theta / 90;
// truncate
int quadrant = int(t);
t -= quadrant;
//根据角度计算椭圆弧弧度,算法没看懂TODO,后续研究
t = qt_t_for_arc_angle(90 * t);
// swap x and y?
if (quadrant & 1)
t = 1 - t;
qreal a, b, c, d;
//这个函数又是干什么的,云里雾里TODO,后续研究
QBezier::coefficients(t, a, b, c, d);
QPointF p(a + b + c*QT_PATH_KAPPA, d + c + b*QT_PATH_KAPPA);
// left quadrants
if (quadrant == 1 || quadrant == 2)
p.rx() = -p.x();
// top quadrants
if (quadrant == 0 || quadrant == 1)
p.ry() = -p.y();
*points[i] = r.center() + QPointF(w2 * p.x(), h2 * p.y());
}
}
推荐阅读