2011-01-12 12 views
5

Diciamo che ho un percorso Bézier cubica come segue (formattato per l'uso con la funzione di percorso Raffaello):Disegno metà di un tracciato Bezier in Raphael

M55 246S55 247 55 248

Solo un esempio. Questo è stato preso dalla mia applicazione di disegno, dove uso il cursore per tracciare una linea quando l'utente tiene premuto il pulsante del mouse, tipo una matita o un pennarello. Sto usando l'evento Mousemove di jquery per disegnare la linea tra due punti ogni volta che l'utente muove il mouse. C'è un altro (il punto di riferimento) che viene preso prima che la linea sia disegnata, in modo che la curva di Bezier possa essere creata.

Ecco la mia domanda: è possibile fare in modo che Raffaello tragga solo metà di un determinato percorso? Sono a conoscenza della funzione getSubpath(), ma se la mia comprensione delle curve di Bezier è corretta, sarebbe piuttosto difficile calcolare il secondo argomento. Il problema con la funzione animate è che crea doppie linee (cioè crea la linea curva che voglio e la linea squadrata che lo circonda che non dovrebbe essere mostrata, probabilmente perché il mouse viene spostato più velocemente di quanto l'animazione possa gestire).

Naturalmente, se il mio approccio è in qualche modo imperfetto (o la mia comprensione delle possibili soluzioni), mi piacerebbe sentirlo. Qualsiasi aiuto sarebbe apprezzato.

+0

Cosa intendi per "metà"? Quale metà vuoi disegnare? – Gabe

+0

Vorrei disegnare la prima metà (dall'inizio del movimento del mouse fino al punto medio della curva di Bezier). La giustificazione per questo è eliminare i bordi che appaiono invariabilmente se si disegna semplicemente linee da una posizione del cursore a quella successiva. – Fibericon

risposta

3

E 'un po' disordinato, ma forse questo sarà rispondere:

line[line.length] = paper.path(drawPath); //drawPath being the fill line length 

//get a subpath, being half the length of your bezier curve 
subPath = line[line.length - 1].getSubpath(0, line[line.length - 1].getTotalLength()/2); 

//remove the full-length bezier curve 
line[line.length - 1].remove(); 

//Draw your new line 
line[line.length - 1] = paper.path(subpath); 

Onestamente, questo questo è abbastanza inefficiente. Ma non riesco a pensare a un modo migliore per farlo. Non puoi afferrare la tangente e dividere per metà, poiché una curva più bezier sarà più lunga della lunghezza di una linea tangente (in linea d'aria). Ciò significa che è necessario elaborare la linea tramite rapheal e quindi ottenere un subPath di metà della lunghezza.

+0

Quello sarebbe! È davvero più lento, ma non si può fare nulla a riguardo. – Fibericon

+1

La soluzione corretta sarebbe quella di rideterminare l'equazione per la curva cubica di bezier come funzione di t' = 2t: http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves – fuzzyTew

+0

Questo è davvero vero. Ti dispiacerebbe includere dove e come farlo in Rapheal. – Beaker

1

Il punto centrale può essere calcolato, non a conoscenza di alcuna funzionalità in Raphael che taglierà a metà il bezier.

Dagli sguardi di questi comandi, è markup SVG standard (vedere le specifiche SVG per capire meglio: http://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands)

M => MoveTo posizione assoluta 55,24 S => curva liscia all'assoluto 55,247 55,248

La curva liscia può essere riscritta come CurveTo standard o C se lo si desidera, S è solo la scorciatoia per esso e la curva/C consente di calcolare facilmente il punto centrale.

+0

Ho provato questo, ma l'uso di CurveTo sembra peggiorare il problema della doppia linea che sto avendo. – Fibericon

+0

Hai uno screenshot della doppia linea che stai ottenendo? –

-1

Dividere una curva di Bézier a metà è solo un po 'di matematica, niente di troppo difficile. Potresti essere aiutato dal path extensions for raphaël, e dovrebbe essere piuttosto semplice aggiungere un metodo lì per eseguire la suddivisione.

La parte "solo un po 'di matematica" potrebbe ad esempio utilizzare De Castelau's algorithm per dividere la curva in un dato punto.

+1

'Dividere una curva di Bezier a metà è solo un po' di matematica, niente di troppo difficile. ' Penso che la sua domanda ruota attorno a questo e niente di troppo difficile non risponde. Forse potresti essere più specifico? – Beaker

Problemi correlati