PDA

View Full Version : [PHP] Calcolo punti di controllo per spline bicubica (Bezier): help.


uomoserio
01-03-2014, 16:42
Ciao, avrei bisogno di un aiuto circa un problema che forse è più matematico che di programmazione....spero che possiate aiutarmi a capire.

La premessa: ho una serie di punti (di cui conosco le coordinate) in un grafico cartesiano e dovrei collegarli non con linee rette, ma bensì tramite una curva spline bicubica o di Bezier che passi per i punti stessi.
Dispongo già di una funzione PHP di disegno su file PDF che genera una curva di Bezier fra due punti (la chiamo semicurva, poi capirete il motivo), accettando come input le coordinate dei due punti estremi della semicurva e le coordinate dei due punti di controllo (quello iniziale e quello finale). :fagiano:

Il problema, per me, è proprio quello di calcolare le coordinate dei punti di controllo, in modo tale che la successione delle semicurve costituiscano un'unica curva di Bezier fluida che passa per i punti stessi. :muro:
Alcuni dettagli da tenere conto sono:
- Il primo punto e l'ultimo punto della serie non possono avere il punto di controllo.
- Il secondo punto di controllo di ogni semicurva deve essere collineare al primo punto di controllo della semicurva successiva, per far sì che la curva finale risultante sia fluida.

Ho trovato molte fonti in rete riguardo l'interpolazione (o approssimazione) di curve con spline bicubiche o Bezier, ma non essendo io un matematico non riesco a capirci quasi nulla. :mc:
Inoltre tutto il materiale che ho trovato spiega, dal punto di vista matematico, come calcolare tutti i punti interpolati per generare la curva di Bezier, mentre io ho già una funzione di disegno che si occupa di fare questo e mi serve soltanto calcolare le coordinate dei punti di controllo di ogni semicurva.

Quancuno riesce a spiegarmi come ottengo questo calcolo oppure può segnalarmi qualche fonte dove trovare del codice che esegua questa operazione? Anche se non è codice PHP non importa, posso trasportarlo.

Grazie a chiunque sappia darmi una mano :)

Daniels118
03-03-2014, 09:25
Le curve di bezier non passano attraverso i punti che definisci, ci passano solo vicino; inoltre i punti di controllo possono essere posizionati arbitrariamente per deformare la curva, questa resterà comunque "tonda", non presenta angoli.
Se invece vuoi che la curva passi attraverso i tuoi punti, allora una spline fa al caso tuo, inoltre non necessita di punti di controllo, risolvendo il problema a priori.

uomoserio
03-03-2014, 13:33
Giusto, allora le spline sono la soluzione al mio problema.
Hai qualche risorsa comprensibile che io possa consultare per avere indicazioni su come gestirle ed implementarle nel codice?

Daniels118
03-03-2014, 14:54
Personalmente non ho mai trattato con le spline da programmatore, però cercando su google trovi diverse librerie in php, scegli quella che trovi più comoda.

uomoserio
03-03-2014, 19:09
Eh, ma il problema è proprio quello: ho cercato il materiale online, ma ho trovato sempre solo le spiegazioni matematiche di come funzionano e non ho mai trovato librerire di funzioni già pronte, soprattutto per php.
Hai qualche link a portata di mano per caso? :)

Daniels118
03-03-2014, 19:41
Basta cercare su google "spline php" (senza virgolette) e trovi una lunga lista.
Questo risultato sembra molto promettente:
http://www.script-tutorials.com/smooth-curve-graphs-with-php-and-gd/
Hai delle classi già pronte per disegnare spline tramite GD, il codice sorgente è abbastanza breve e se ne hai bisogno puoi facilmente estrarre solo ciò che ti serve.