Domanda

Supponendo che sto utilizzando alcune API grafica che mi permette di disegnare curve di Bezier specificando i 4 punti necessari: inizio, fine, due punti di controllo .

Posso riutilizzare questa funzione per disegnare x per cento della curva 'originale' (Regolando i punti di controllo e il punto finale)?

O è impossibile?

informazioni non necessarie, dovrebbero cura qualcuno:

  • Ho bisogno il tutto per disegnare ogni n% della
    originale curva bezier con colore differente e / o lo stile della linea
  • Sto usando Path2D di Java per disegnare le curve di Bezier:

    Path2D p = new GeneralPath();
    p.moveTo(x1, y1);
    p.curveTo(bx1, by1, bx2, by2, x2, y2);
    g2.draw(p);
    
È stato utile?

Soluzione

Quello che vi serve è De Casteljau algoritmo . Questo vi permetterà di dividere la curva in qualunque segmenti vuoi.

Tuttavia, dal momento che hai a che fare con le curve cubiche solo, vorrei suggerire un po 'più facile da usare formulazione che ti do un segmento da t0 a t1 dove 0 <= t0 <= t1 <= 1. Ecco alcuni pseudocodice:

u0 = 1.0 - t0
u1 = 1.0 - t1

qxa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1

qya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1

xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1

ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1

Poi basta disegnare la curva di Bézier formata da (xa,ya), (xb,yb), (xc,yc) e (xd,yd).

Si noti che t0 e t1 non sono esattamente percentuali della curva distanza ma piuttosto le curve spazio parametrico . Se si deve assolutamente avere distanza allora le cose sono molto più difficili. Provate questo fuori e vedere se lo fa quello che ti serve.

Modifica: vale la pena notare che queste equazioni semplificare un po 'se uno o t0 t1 è 0 o 1 (cioè desideri solo tagliare da un lato)

.

Inoltre, il rapporto 0 <= t0 <= t1 <= 1 non è un requisito rigoroso. Per esempio t0 = 1 e t1 = 0 possono essere usati per "flip" curva all'indietro, o t0 = 0 e t1 = 1.5 potrebbero essere utilizzati per estendere la curva oltre la fine originale. Tuttavia, la curva potrebbe apparire diverso da quello che ci si aspetta se si tenta di estendere oltre la gamma [0,1].

Edit2: Più di 3 anni dopo la mia risposta originale, MvG rilevare un errore nei miei equazioni. Ho dimenticato l'ultimo passaggio (un'interpolazione lineare in più per ottenere i punti di controllo finale). Le equazioni di cui sopra sono stati corretti.

Altri suggerimenti

una risposta per un'altra domanda ho incluso alcune formule per calcolare i punti di controllo per una sezione di una curva cubica. u = 1 - t , una curva di Bezier cubica viene descritta come

B ( t ) = u 3 P 1 + 3 < i> u 2 t P 2 + 3 ut < sup> 2 P 3 + t 3 P 4

P 1 è il punto iniziale della curva, P 4 suo punto finale. P 2 e P 3 sono i punti di controllo.

Dati due parametri t 0 e t 1 (e con u 0 = (1 - t 0 ), u 1 = (1 - t 1 )), la parte della curva nell'intervallo [ t 0 , t 1 ] è descritto dai nuovi punti di controllo

  • Q 1 = u 0 u 0 u 0 P 1 + ( t 0 u 0 u 0 + u 0 t 0 u 0 + u 0 u 0 t 0 ) < i> P 2 + ( t 0 t 0 u 0 + u 0 t 0 t 0 + t 0 u 0 t 0 ) < i> P 3 + t 0 t 0 t 0 P 4
  • Q 2 = u 0 u 0 u 1 P 1 + ( t 0 u 0 u 1 + u 0 t 0 u 1 + u 0 u 0 t 1 ) < i> P 2 + ( t 0 t 0 u 1 + u 0 t 0 t 1 + t 0 u 0 t 1 ) < i> P 3 + t 0 t 0 t 1 P 4
  • Q 3 = u 0 u 1 u 1 P 1 + ( t 0 u 1 u 1 + u 0 t 1 u 1 + u 0 u 1 t 1 ) < i> P 2 + ( t 0 t 1 u 1 + u 0 t 1 t 1 + t 0 u 1 t 1 ) < i> P 3 + t 0 t 1 t 1 P 4
  • Q 4 = u 1 u 1 u 1 P 1 + ( t 1 u 1 u 1 + u 1 t 1 u 1 + u 1 u 1 t 1 ) < i> P 2 + ( t 1 t 1 u 1 + u 1 t 1 t 1 + t 1 u 1 t 1 ) < i> P 3 + t 1 t 1 t 1 P 4

Si noti che nelle espressioni tra parentesi, almeno alcuni dei termini sono uguali e possono essere combinati. Non ho fatto in modo tale formula, come indicato qui renderà il modello più chiaro, credo. Si può semplicemente eseguire questi calcoli in modo indipendente per il x e y le indicazioni per calcolare i vostri nuovi punti di controllo.

Si noti che una determinata percentuale del campo parametro Fo t in generale sarà non corrispondere alla stessa percentuale della lunghezza. Così avrete molto probabile che per integrare sulla curva per girare lunghezze di percorso di nuovo in parametri. O si utilizza qualche approssimazione.

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