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

Is it accurate to conclude the radius of a circle given 4 bazier curves in svg?

我用过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 也是半径。
这会访问 path 中的 属性、q1,与上述两种方式相比,我更喜欢它,因为它访问的是一个 属性,而不是两个。

下图绿圈所示
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 以下的数字和尽可能少的小数点,尤其是理解一个新想法。更短的 text-length 数字极大地提高了可读性,理解无止境。
我经常只使用十以下的数字。
注意:您正在绘制圆 counter-clockwise。顺时针是通常的方式。