Domanda

Ho bisogno di creare una spline con due punti finali e 'n' punti di controllo.
Per quanto ne so, una curva di Bezier consente solo un punto di controllo, e una spline Bezier permette due punti di controllo. Tuttavia, ho bisogno di essere in grado di aggiungere il maggior numero di punti di controllo, come vedo in forma, non limitato a uno o due.

Ecco un esempio di quello che voglio ottenere, con 4 punti di controllo:
(Fonte: articolo di Wikipedia su NURBS )

Finora sono stato solo in grado di combinare una serie di BezierSegments insieme come questo:
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>
È stato utile?

Soluzione

Non fuori dalla scatola, ma dare un'occhiata a questo precedente domanda lo farà puntare a come disegnare NURBS utilizzando c #, è possibile trasformare il codice in qualcosa, allora implementa PathSegment per utilizzare sotto WPF.

Altri suggerimenti

Anche se nel titolo si parla NURBS, ti sembra di essere alla ricerca di un modo per attirare una serie di segmenti di Bezier Spline che sono lisci nei punti di connessione.

Per raggiungere questo obiettivo è necessario impostare il point1 sul secondo segmento in modo che si rispecchiano point2 il 1 ° segmento relativo al punto di connessione tra i segmenti (che è point3 al 1 ° segmento).

Nel tuo caso il punto di connessione è (3,3) e point2 sul primo segmento è (2,1) quindi è necessario fare point1 sul secondo segmento (4,5) invece di (4,3) in il vostro codice.

somiglianza cambiamento point1 al 3 ° segmento (7,4) in modo che gli specchi (5,2) rispetto a (6,3) e si finisce con le seguenti segmenti che potrebbero risolvere il problema:

 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" 

Ora, se non ti piace di me cambiare i punti di controllo e tanta voglia (4,3) e (7,2) ad essere i punti di controllo, aggiungere altri segmenti. Basta ricordare che non si arriva a decidere che cosa point1 è, se si vuole la connettività liscia con il segmento precedente.

Note:

  1. questa soluzione vi darà un primo grado di smothness nei punti di connessione. Se si desidera anche un secondo grado di smothness (C2) è possibile ottenere che attraverso la creazione di point2 appropritaly. Se si prende point1 del segmento precedente e lo specchio è relativo al point2 del segmento precedente e quindi il mirroring il risultato relativo al point1 del segmento corrente si otterrà il point2 desiderato del segmento corrente. Quindi è sufficiente scegliere qualsiasi point3 che si desidera e si è fatto. Vedere http://ibiblio.org/e-notes/Splines/B-spline. htm per maggiori informazioni su questo.

  2. L'exmaple hai dato da wikipedia è una NURBS. Un NURBS è come una spline bezier, ma aggiunge pesi ai punti. Da quello che posso dire dalla documentazione BezierSegment non supporta questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top