起点-终点-弧度 三参数 定位圆弧
无脑推导
符号说明
- 圆心
- 圆弧起点
- 圆弧终点
- 弧度(逆时针方向)
- 以圆心为原点建轴,圆弧起点到正半轴的弧度
- 以圆心为原点建轴,圆弧终点到正半轴的弧度
推导过程
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话