在 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。顺时针是通常的方式。
我用过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。顺时针是通常的方式。