使用2D阵列中的点列表绘制样条线

时间:2018-09-05 18:09:46

标签: c# algorithm bezier spline nurbs

我已经研究过样条线纽结贝塞尔曲线,但我找不到适合自己需求的算法。我希望能提供基于2D阵列中的点绘制曲线的算法或函数的帮助。

示例:

数组中的第一个起点:ex arr [1,2] =新的Point(1,2)

  

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  0,0, 1 ,0,0,0,0,0, 1 ,0,0,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0, 1 ,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  0,0,0,0,0, 1 ,0,0,0,0,0,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

输出:

  

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  0,0, 1 ,0,0,0,0,0, 1 ,0,0,0,0,0,0,0
  0,0, 1 ,0,0,0,0, 1 ,0, 1 ,0,0,0,0,0 ,0
  0,0,0, 1 ,0,0,0, 1 ,0,0, 1 ,0,0,0,0 ,0
  0,0,0, 1 ,0,0, 1 ,0,0,0,0,0,0,0,0,0
  0,0,0,0, 1 1 1 ,0,0,0,0,0,0,0,0 ,0
  0,0,0,0,0, 0 ,0,0,0,0,0,0,0,0,0,0
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

1 个答案:

答案 0 :(得分:1)

这个问题有两个部分:定义一条穿过这些点的平滑曲线,然后将该曲线绘制到数组中。

通过多个定义点的常见曲线类型是Catmull-Rom spline。您可能想看看这是否满足您的需求。

要定义Catmull-Rom样条曲线,您需要从左到右扫描2D数组,并在有1的位置添加一个点到样条曲线。您还需要提出曲线参数化。将列号用作每个点的参数值可能会产生良好的结果。

在绘图方面,有几种不同的方法。 Catmull-Rom样条曲线是参数化的,因此您可以尝试在许多t值处计算曲线上的点,并设置相应的数组位置。如果您实现了线描图基元(例如Bresenham线描),则可以在样条线上计算更少的点并用线填充。还有其他方法,例如将样条线分解为贝塞尔曲线或扫描线方法,但它们更为复杂,可能不必要。