在svg中给定4条巴塞尔曲线,得出圆的半径是否准确?

问题描述

我使用了 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以下的数字。
注意:您是沿逆时针方向绘制圆。通常是顺时针方向。

showing a circle made from four cubic beziers