【问题标题】:Draw splines with a list of points in a 2D Array用二维数组中的点列表绘制样条线
【发布时间】:2018-09-12 05:14:17
【问题描述】:

我研究了 样条线nurbsBezier 曲线,但找不到适合我需要的算法。我将不胜感激有关可以根据二维数组中的点绘制曲线的算法或函数的帮助。

示例:

我的数组中的第一个起点:ex arr[1,2] = new 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”),但这并不能确定要连接哪个点。我们也不知道您到底想要什么结果?像素?点加控制点?很不清楚。在 GDI+ 中有很好的函数从点绘制贝塞尔曲线。但是你需要点和正确的 order
  • 我希望结果像第二个数组。我的数组中有 n 个点,然后我想在我的样条线经过的地方每 0 到 1 进行一次更改,就像 Bresenham 的算法一样,但对于曲线。
  • 所以点应该从左到右连接,就像连续函数的图形一样?
  • 要么做数学题,要么作弊。为了作弊,您可以绘制一个小位图并读出像素并将 1 放入第二个数组。我做了类似的事情with characters here
  • 我可以“作弊”,但我真的很想要这个算法,因为我非常需要它,而且它比读取 1200*800 位图 n 次更容易。但是谢谢你帮助我。

标签: c# algorithm bezier spline nurbs


【解决方案1】:

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

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

要定义您的 Catmull-Rom 样条,您需要从左到右扫描您的二维数组,只要有 1,就在样条上添加一个点。您还需要提出曲线参数化。使用列号作为每个点的参数值可能会得到很好的结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2020-08-25
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2018-09-04
    相关资源
    最近更新 更多