【问题标题】:How can I create a simple 2D NURBS using XAML?如何使用 XAML 创建简单的 2D NURBS?
【发布时间】:2009-09-21 18:49:02
【问题描述】:

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

这是我想要实现的示例,有 4 个控制点:
(来源:Wikipedia article on NURBS

到目前为止,我只能像这样将一系列 BezierSegments 组合在一起:
http://img297.imageshack.us/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>

【问题讨论】:

    标签: .net wpf xaml .net-3.5 bezier


    【解决方案1】:

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

    【讨论】:

    • 这看起来会很有用。谢谢!
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2010-10-06
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多