3

我需要创建一个带有两个端点和“n”个控制点的样条线。
据我所知,贝塞尔曲线只允许一个控制点,而贝塞尔样条曲线允许两个控制点。但是,我需要能够添加我认为合适的控制点,不限于一两个。

这是我想要实现的示例,有 4 个控制点:(
来源:NURBS 上的维基百科文章

到目前为止,我只能像这样将一系列 BezierSegments 组合在一起:
http://img297.imageshack。我们/img297/3706/bezierpath.png

<Polyline   Stroke="Green" Stretch="Uniform"
            Points="0,0 1,2 2,1 3,3 4,3 5,2 6,3 7,2 8,1.75 9,2.5" />

<Path Stroke="Red" Stretch="Uniform">
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigureCollection>
          <PathFigure StartPoint="0,0">
            <PathFigure.Segments>
              <PathSegmentCollection>
                <BezierSegment Point1="1,2" Point2="2,1" Point3="3,3" />
                <BezierSegment Point1="4,3" Point2="5,2" Point3="6,3" />
                <BezierSegment Point1="7,2" Point2="8,1.75" Point3="9,2.5" />
              </PathSegmentCollection>
            </PathFigure.Segments>
          </PathFigure>
        </PathFigureCollection>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>
4

2 回答 2

2

不是开箱即用,但请看一下前面的问题,它将指出如何使用 c# 绘制 NURBS,然后您可以将代码转换为某种东西,然后实现PathSegment以在 WPF 下使用它。

于 2009-09-21T20:00:48.600 回答
1

尽管您在标题中提到了 NURBS,但您似乎正在寻找一种方法来绘制一系列在连接点处平滑的贝塞尔样条线段。

要实现这一点,您需要在第二段上设置 point1,以便它将相对于段之间的连接点(即第一段上的 point3)镜像第一段上的 point2。

在您的情况下,连接点是 (3,3),第一段上的 point2 是 (2,1),因此您需要在代码中的第二段 (4,5) 而不是 (4,3) 上创建 point1。

第 3 段的相似性将 point1 更改为 (7,4),因此它相对于 (6,3) 镜像 (5,2),您最终会得到以下可能解决您的问题的段:

 BezierSegment Point1="1,2" Point2="2,1" Point3="3,3"

 BezierSegment Point1="4,5" Point2="5,2" Point3="6,3" 

 BezierSegment Point1="7,4" Point2="8,1.75" Point3="9,2.5" 

现在,如果您不喜欢我更改您的控制点并且真的希望 (4,3) 和 (7,2) 成为控制点,请添加更多段。请记住,如果您想与前一段平滑连接,您无法决定 point1 是什么。

笔记:

  1. 此解决方案将在连接点为您提供第一级的平滑度。如果您还想要第二级平滑度 (C2),您可以通过适当地设置 point2 来实现。如果您取前一段的 point1 并将其相对于前一段的 point2 镜像,然后相对于当前段的 point1 镜像结果,您将获得当前段的所需 point2。然后,您只需选择您想要的任何点 3,您就完成了。有关更多信息,请参见http://ibiblio.org/e-notes/Splines/B-spline.htm

  2. 您从维基百科提供的示例是 NURBS。NURBS 类似于贝塞尔样条曲线,但它为点添加了权重。从我从文档中可以看出,BezierSegment 不支持这一点。

于 2010-12-17T18:15:51.927 回答