我需要一种更通用的形式来提取具有不同特征的多个路径。这是一种递归解决方案,可以同时处理路径、路径列表、段列表和单个段。您可以为曲线指定每个段的sample_points
,但是对于直线而言,保持2个点以避免不必要的额外点:
import svgpathtools.path
def svgpathtools_unpacker(obj, sample_points=10):
path = []
if isinstance(obj, (svgpathtools.path.Path, list)):
for i in obj:
path.extend(svgpathtools_unpacker(i, sample_points=sample_points))
elif isinstance(obj, svgpathtools.path.Line):
path.extend(obj.bpoints())
elif isinstance(obj, (svgpathtools.path.CubicBezier, svgpathtools.path.QuadraticBezier)):
path.extend(obj.points(np.linspace(0,1,sample_points)))
else:
print(type(obj))
return np.array(path)
并且您可以如何使用它:
import matplotlib.pyplot as plt
bezier_curve = svgpathtools.path.CubicBezier(start=(300+100j), control1=(100+100j), control2=(200+200j), end=(200+300j))
bezier_quad = svgpathtools.path.QuadraticBezier(bezier_curve.end, control=(200+200j), end=(300+150j))
line = svgpathtools.path.Line(start=bezier_quad.end, end=bezier_curve.start)
bezier_path = svgpathtools.path.Path(bezier_curve, bezier_quad, line)
plt.figure()
for i in [10, 100]:
xy = svgpathtools_unpacker(bezier_path, sample_points=i)
plt.plot(xy.real, xy.imag, label=f'sample_points={i}')
plt.legend()
bezier_curve.bpoints()
将返回元组(起始坐标,控制点1,控制点2,结束坐标)
,但这似乎不是您要找的内容。贝塞尔曲线是多项式,例如,三次贝塞尔曲线完全由其四个系数确定。如需更多信息,请参阅: https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves - mathandy