我有一个二维点列表,它们是闭合均匀三次 B 样条的控制顶点 (Dx)。我假设一条简单的曲线(非自相交,所有控制点都是不同的)。
我试图找到曲线包围的区域:
如果我计算结点(Px),我可以将曲线视为多边形;然后我“只”需要在实际曲线和连接结点的直线之间找到每个段的剩余增量区域。
我知道 Bspline 的形状(以及因此面积)在旋转和平移下是不变的 - 所以对于每个段,我可以找到一个平移来将 t=0 结放在原点,并找到一个旋转来放置 t=1 结在 +x 轴上:
我可以通过插入点并重新分组来找到曲线的方程:
P(t) = (
(t**3)*(-Dm1 + 3*D0 - 3*D1 + D2)
+ (t**2)*(3*Dm1 - 6*D0 + 3*D1)
+ t*(-3*Dm1 + 3*D1)
+ (Dm1 + 4*D0 + D1)
) / 6.
但我正在努力整合它——我能做到
1
/
| Py(t) dt
/
t=0
但这并没有给我空间。我想我需要的是
Px(t=1)
/
| Py(t) (dPx(t) / dt) dt
/
x = Px(t=0)
但在我走得更远之前,我真的很想知道:
这是正确的面积计算吗?理想情况下,分析解决方案会让我开心!
一旦我找到这个区域,我如何判断我是否需要从基础多边形中添加或减去它(第一个图中的红色与绿色区域)?
是否有任何 Python 模块可以为我进行此计算?Numpy 有一些评估三次 Bsplines 的方法,但似乎都没有处理面积。
有没有更简单的方法来做到这一点?我正在考虑可能在一堆点上评估 P(t) - 比如
t = numpy.arange(0.0, 1.0, 0.05)
- 并将整个事物视为一个多边形。知道需要多少细分来保证给定的准确度(我希望误差 < 1%)吗?