Как я могу создать простой 2D NURBS, используя XAML? - PullRequest
3 голосов
/ 21 сентября 2009

Мне нужно создать сплайн с двумя конечными точками и контрольными точками 'n'.
Насколько мне известно, кривая Безье допускает только одну контрольную точку, а сплайн Безье допускает две контрольные точки. Однако мне нужно иметь возможность добавлять столько контрольных точек, сколько я считаю нужным, не ограничиваясь одной или двумя.

Вот пример того, чего я хочу достичь, с 4 контрольными точками:
(Источник: статья в Википедии о NURBS )
image
So far I've only been able to combine a series of BezierSegments together like this:
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>

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Не из коробки, но взгляните на этот предыдущий вопрос, он покажет вам, как рисовать NURBS с помощью c #, вы можете затем превратить код во что-то, а затем реализовать PathSegment чтобы использовать его под WPF.

1 голос
/ 17 декабря 2010

Хотя в названии вы упоминаете NURBS, вы, похоже, ищете способ нарисовать серию отрезков Безье-сплайна, которые являются гладкими в точках соединения.

Для этого вам нужно установить точку 1 на втором сегменте, чтобы она отражала точку 2 на 1-м сегменте относительно точки соединения между сегментами (которая является точкой 3 на 1-м сегменте).

В вашем случае точка подключения (3,3) и точка 2 на первом сегменте (2,1), поэтому вам нужно указать точку 1 на втором сегменте (4,5) вместо (4,3) в ваш код.

Измените точку сходства 1 на 3-м сегменте на (7,4), чтобы она соответствовала (5,2) относительно (6,3), и вы получите следующие сегменты, которые могут решить вашу проблему:

 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 подходящим образом. Если вы возьмете точку 1 предыдущего сегмента и отразите ее относительно точки 2 предыдущего сегмента, а затем отразите результат относительно точки 1 текущего сегмента, вы получите желаемую точку 2 текущего сегмента. Затем вы просто выбираете любую точку3, которую пожелаете, и все готово. Подробнее см. http://ibiblio.org/e-notes/Splines/B-spline.htm.

  2. Пример, который вы дали из Википедии, - это NURBS. NURBS похож на безлиний сплайн, но он добавляет вес к точкам. Из того, что я могу сказать из документации, BezierSegment не поддерживает это.

...