Qt中如何在已知点间绘制圆弧以绘制XNOR门符号

问题说明
需要在E点到G点、F点到H点之间绘制圆弧,实现标准XNOR门(同或门)符号,初始实现代码如下,运行效果不符合预期:
path.moveTo(72,10); // for E --> G QRect bound1 (52,10,20,60); path.arcTo(bound1,90,-180); QPainterPath path1; // for F --> H path1.moveTo(104,10); QRect bound2 (72,10,32,60); path1.arcTo(bound2,90,-180);
实际错误绘制效果:
错误原因
- 圆弧外接矩形参数计算错误:Qt绘制圆弧的外接矩形参数需要和圆弧半径严格匹配,初始代码里
bound1宽度仅20、bound2宽度仅32,和60的门高对应的圆弧半径不匹配,导致圆弧形状、位置偏移。 - 路径拆分错误:单独新建
path1绘制第二段圆弧时,arcTo会自动在路径当前点和圆弧起点间连直线,出现多余的错误线段,且两段圆弧的绘制方向参数设置错误。
正确实现代码
QPainterPath xnorPath; // 绘制E到G的左侧半圆弧 xnorPath.moveTo(72, 10); // 定位到E点 // 半圆弧半径30,外接矩形宽高均为60,圆心对齐门体垂直中线 QRect egArcBound(42, 10, 60, 60); // 从90度(12点钟方向,即E点位置)顺时针绘制180度半圆弧到G点 xnorPath.arcTo(egArcBound, 90, -180); // 连接直线到F点 xnorPath.lineTo(104, 10); // 绘制F到H的右侧半圆弧,半径32 QRect fhArcBound(72, 10, 64, 60); // 从90度位置逆时针绘制180度半圆弧到H点 xnorPath.arcTo(fhArcBound, 90, 180); // 闭合路径完成门主体轮廓,后续补充输入引脚、输出引脚和左侧额外的同或标识弧即可 xnorPath.closeSubpath();
注意:Qt
arcTo接口的角度规则为0度指向3点钟方向,正角度为逆时针旋转,负角度为顺时针旋转,绘制前需要根据圆弧凸向确认角度参数符号。
内容的提问来源于stack exchange,提问作者tushar
相关产品推荐
相关产品推荐

