问题描述
我使用了 svg2paths2 ,想弄清楚一个圆的位置和半径是什么,我注意到该圆是由4 CubicBezier构造的,如下所示:
Path(CubicBezier(start=(127.773+90.5469j),control1=(127.773+85.7656j),control2=(123.898+81.8906j),end=(119.121+81.8906j)),CubicBezier(start=(119.121+81.8906j),control1=(114.34+81.8906j),control2=(110.465+85.7656j),end=(110.465+90.5469j)),CubicBezier(start=(110.465+90.5469j),control1=(110.465+95.3281j),control2=(114.34+99.1992j),end=(119.121+99.1992j)),CubicBezier(start=(119.121+99.1992j),control1=(123.898+99.1992j),control2=(127.773+95.3281j),end=(127.773+90.5469j)))
我已经读过标准方法是将圆分成四个相等的部分,并将每个部分拟合为三次贝塞尔曲线。
所以我想知道圆圈的半径是否准确
(q1.start.real - q3.start.real)/2
或
(q2.start.imag - q4.start.imag)/2
圆的中心是:
c_x = (q1.start.real + q1.end.real) / 2
c_y = (q1.start.imag + q1.end.imag) / 2
谢谢!
解决方法
我假设您正在python中使用svg.path
库,或者与svg2paths2
相关。
from svg.path import Path,Line,Arc,CubicBezier,QuadraticBezier,Close
path = Path(CubicBezier(start=(127.773+90.5469j),control1=(127.773+85.7656j),control2=(123.898+81.8906j),end=(119.121+81.8906j)),CubicBezier(start=(119.121+81.8906j),control1=(114.34+81.8906j),control2=(110.465+85.7656j),end=(110.465+90.5469j)),CubicBezier(start=(110.465+90.5469j),control1=(110.465+95.3281j),control2=(114.34+99.1992j),end=(119.121+99.1992j)),CubicBezier(start=(119.121+99.1992j),control1=(123.898+99.1992j),control2=(127.773+95.3281j),end=(127.773+90.5469j)))
q1 = path[0]
q2 = path[1]
q3 = path[2]
q4 = path[3]
.real
是X坐标.imag
是Y坐标
您使用的绘图程序的精度存在很小的误差,除非您希望极高的精度,否则这根本不是问题。
(q1.start.real - q3.start.real) / 2 # 8.6539
是这种情况下的半径。(q4.start.imag - q2.start.imag)/2 # 8.6543
也是半径。
(q1.start.real - q1.end.real) # 8.6539
也是半径。
这会访问相同的属性,即q1
中的path
,与上面的两种方法相比,我更喜欢它,因为它访问的是一个属性,而不是两个。
在图中绿色圆圈下方 c_x = (q1.start.real + q1.end.real) / 2 # 123.447
不在x
的中心
c_y = (q1.start.imag + q1.end.imag) / 2 # 86.21875
不在y中心
在图中红色圆圈下方 c_x = q1.end.imag # 119.121
这是中心x c_y = q1.start.real # 90.5469
这是中心y
为解释精度误差的严重程度,粉红色的圆圈使用了8.6543
半径,在其下方是绿色的8.6539
,也许可以通过极大的缩放来查看。但这确实说明了小数点的重要性。
请考虑使用小于100的数字和尽可能少的小数点,尤其是了解新概念时。较短的文本长度数字极大地提高了可读性,无止境地理解。
我经常只使用10以下的数字。
注意:您是沿逆时针方向绘制圆。通常是顺时针方向。