最近有网友遇到一个问题,使用 QPainter::drawPie 或者 QPainter::drawArc 绘制同中心的圆和椭圆,指定同一起始点和角度,两条弧线的起点与圆心的连线不在同一直线上:

测试代码:

QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.translate(100, 100);QRectF ellipseRect(0, 0, 300, 200);QRectF circle(0, 0, 200, 200);circle.moveCenter(ellipseRect.center());
// 绘制圆,红色painter.setPen(QPen(QColor(232, 63, 63, 128), 3.0));painter.drawPie(circle, 10 * 16, 70 * 16);
// 绘制椭圆,绿色painter.setPen(QPen(QColor(63, 232, 63, 128), 3.0));painter.drawPie(ellipseRect, 10 * 16, 70 * 16);

1. 原理

Qt绘制椭圆曲线,使用的是椭圆离心角,参数方程是:

x = a * cosθ
y = b * sinθ

即:在椭圆的外切圆和内切圆上,选择θ角度的两个点A,B,以A点x坐标和B点y坐标,确定椭圆上一个点M。

因此,当以∠θ绘制时,点A、B、M、圆心O,不在一条直线上。

而通常情况下,以上图为例,以∠φ为参数调用接口,期望从M点开始绘制。需要∠φ与∠θ的转换关系。

2. 离心角与旋转角的转换关系

这里我称∠φ为旋转角,两者之间的转换公式推导参考这篇文章,这里写个结论:
(这里的θ与φ与参考文章里的反过来的)

tanθ = ( a / b) * tanφ
tanφ = ( b / a) * tanθ

再利用反三角函数计算出θ或者φ,需要注意的是,反三角函数的返回值总是在[-π/2, π/2],因此还需要进一步调整。

由上图可以推测出,∠φ和∠θ一定是在同一个象限内,因此两者的差不可能超过π/2;而且,∠θ在一、三象限时,tanθ的符号相同,所以可以通过θ′ = θ±kπ,使得θ′与φ间隔在π/2以内。

3. 转换代码

qreal convertToEccentricAngle(qreal a, qreal b, qreal angle)
{   // *π和π/2使用宏即可*static qreal pi = qDegreesToRadians(180.0);static qreal half_pi = qDegreesToRadians(90.0);// 理论上两个角度差距不会很大,且落在同一象限// 反函数始终在第一象限和第四象限qreal ret = qAtan(a / b * qTan(angle));if(ret > angle){ret -= int((ret - angle) / pi) * pi;if(ret - angle > half_pi)ret -= pi;}else{ret += int((angle - ret) / pi) * pi;if(angle - ret > half_pi)ret += pi;}return ret;
}

使用该函数将指定的弧度制角转换到对应的离心角,也可以自己补充角度制的转换。

效果如下:

Qt绘制椭圆曲线的角度问题(离心角和旋转角)相关推荐

  1. qt绘制一圈圆_Qt绘制圆

    最近开始折腾Qt了,手头上的一个项目需要用到Qt来绘制一些简单图像. 记录下Qt绘制圆的过程: 对于以A为圆心,半径为R的圆,外部有一个外切的正方形,正方形上有B点.如下图所示: 对于void QPa ...

  2. QT绘制多边形-----五边形

    *QT绘制多边形 今天学习qt绘制多边形的绘制 1.先创建一个新项目Application->Qt Widgets Application 2.在头文件.h添加: protected: //在保 ...

  3. Qt绘制旋转的轮播图

    前言 目前见的比较多的轮播图有平移和旋转两种方式.平移类似淘宝那种切换幻灯片一样的效果,旋转一般是近大远小,看起来有点3D的感觉.本文代码实现旋转轮播图效果如下: 完整代码链接: https://gi ...

  4. 如何用Qt绘制一颗好看的二叉树

    原创~~作者码字不易,如需转载请注明出处,谢谢~ 欢迎来我的博客小站(Aayu Yain = 学无止境 = 阿宇的可爱博客)逛一逛,有惊喜呦~ 最近在学习数据结构二叉树,通过在C++控制台界面已实现了 ...

  5. 【原创】QT 绘制饼图,曲线图,柱状图,详解。

    用QT绘制数据图表.刚开始感觉不知如何下手,在参考了网上的文章后(部分代码来自网上),现学现卖,把饼图,曲线图,柱状图全部做到一起了.不啰嗦,上图!!! QT 是面向对象的编程语言, 图形库的用法比较 ...

  6. 9.如何使用QT绘制导航箭头的图标

    利用QT绘制一个地图导航软件中的导航图标,代码如下 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLa ...

  7. QT绘制带有数据源的图表

    QT绘制带有数据源的图表 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 QML将XmlListModel用作图表的数据源. 项目技术 qt5.12,qt chart ...

  8. QT绘制散点图(1)

    QT绘制散点图1 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 创建一个简单的散点图以及如何与该图进行交互. 项目技术 qt5.12,qt charts模块,C++ ...

  9. QT绘制散点图(2)

    QT绘制散点图2 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 创建简单的散点图. 项目技术 qt5.12,qt charts模块,C++ 项目展示 主要源码片段解 ...

  10. QT绘制嵌套的圆饼状图

    QT绘制嵌套的圆饼状图 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 使用QPieSeries API创建嵌套的甜甜圈图. 项目技术 qt5.12,qt chart ...

最新文章

  1. 网络流24题-飞行员配对方案问题
  2. Numpy中数组间运算
  3. 数据结构与算法 | 线性表 —— 链表
  4. 判断1000素数的c语言程序,C语言求1~1000素数的简单程序
  5. 西门子Step7找不到有效授权的解决方法
  6. 项目经济规模的估算方法_估算英国退欧的经济影响
  7. 机器学习的练功心法(三)——特征工程
  8. B. Sifid and Strange Subsequences
  9. python concat_python-pd.concat()不合并在同一索引上
  10. 高校教师职称制度将迎重大改革,教师怎么看?
  11. Spring Boot2 整合 Ehcache
  12. 开平区教育局资源分布式存储解决方案
  13. [Angualr 2] Using FormBuilder
  14. python基础教程免费视频-零基础小白python从入门到精通视频(全60集)
  15. Python入门--方法重写
  16. Echarts数据可视化polar极坐标系,开发全解+完美注释
  17. poj2112,最大流,最优挤奶方案
  18. 软件迭代测试是什么工作,快速迭代的测试人员的思考
  19. 2021全球程序员收入报告出炉!
  20. 解决H5在移动端overflow:scroll滚动条默认不显示和滚动后消失的问题

热门文章

  1. Screw 整合Oracle 报错异常信息oracle.jdbc.driver.T4CConnection.isValid(I)Z
  2. nssa和stub_华为路由器OSPF设置之NSSA和STUB
  3. mysql in查询效率真的低_MySql中in查询效率低的替代方法
  4. 2022全国智慧医院建设大会
  5. 设置屏幕亮度,并且监听屏幕亮度变化
  6. 面试记录-KPMG(毕马威)
  7. iOS 几种打包方式
  8. wh计算公式_锂电池计算公式wh 锂电池锂含量如何计算 - 硬件设备 - 服务器之家...
  9. java架构师职责_架构师的主要职责
  10. [区块链]对话区块链人工智能顶级实力公司ObEN