欢迎使用皮肤 Geek|

起点-终点-弧度 三参数 定位圆弧

无脑推导

符号说明

  • o 圆心
  • p1 圆弧起点
  • p2 圆弧终点
  • a 弧度(逆时针方向)
  • a1 以圆心为原点建轴,圆弧起点到正半轴的弧度
  • a2 以圆心为原点建轴,圆弧终点到正半轴的弧度

推导过程

(1)p1o=r{cos(a1),sin(a1)}(2)p2o=r{cos(a2),sin(a2)}(3)a2a1=a(4)p2p1=r{cos(a2)cos(a1),sin(a2)sin(a1)}(5)dx=r(cos(a2)cos(a1))(6)dy=r(sin(a2)sin(a1))(7)dxdy=cos(a+a1)cos(a1)sin(a+a1)sin(a1)(8)dxdy=cos(a)cos(a1)sin(a)sin(a1)cos(a1)sin(a)cos(a1)+cos(a)sin(a1)sin(a1)(9)dxdy=(cos(a)1)cos(a1)sin(a)sin(a1)(cos(a)1)sin(a1)+sin(a)cos(a1)(10)((cos(a)1)dx+sin(a)dy)sin(a1)=((cos(a)1)dysin(a)dx)cos(a1)(11)tan(a1)=sin(a1)cos(a1)=(cos(a)1)dysin(a)dx(cos(a)1)dx+sin(a)dy

Qt 实现

细节处理

由于 Qt 窗口坐标系与标准笛卡尔坐标系存在上下翻转的差异,故为了保证实际绘制效果与理论效果一致,需要进行顺逆时针的翻转变换。

进行翻转变换后,计算结果同样是变换过后的值,并非理论的计算值。如果需要对所确定的圆弧参数进行下一步计算,需对结果进行逆变换或在一开始便不进行翻转变换。

源码

void drawArc(QPainter* painter, const QPointF& p1, const QPointF& p2, double radian) {
//! 翻转起点、终点
const auto& q1 = p2;
const auto& q2 = p1;
const auto dx = q2.x() - q1.x();
const auto dy = q2.y() - q1.y();
const auto u = cos(radian) - 1;
const auto v = sin(radian);
const auto a1 = atan2(u * dy - v * dx, u * dx + v * dy);
const auto a2 = a1 + radian;
const auto r = fabs(dx) < 1e-6 ? dy / (sin(a2) - sin(a1)) : dx / (cos(a2) - cos(a1));
const auto ox = q1.x() - r * cos(a1);
const auto oy = q1.y() - r * sin(a1);
const auto bb = QRectF(ox - r, oy - r, r * 2, r * 2);
//! 翻转圆弧角度
const auto start = -qRadiansToDegrees(a1) * 16;
const auto span = -qRadiansToDegrees(radian) * 16;
painter->drawArc(bb, start, span);
}

本文作者:周上行Ryer

本文链接:https://www.cnblogs.com/zymelaii/p/17169632.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   周上行Ryer  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起