Liverpool” post=72127
Detto in altri termini: l’interpolazione lineare (curve di Bézier del primo ordine: segmenti) richiede un mucchio di punti; [omissis] . Le curve di Bézier del terzo ordine sono raccordate in modo da mantenere la continuità della tangente sia quella della concavità. Fidatevi di Bézier: le quadratiche vanno già bene; le cubiche vanno ottimamente. Sia tikz sia pgfplots possono usare tranquillamente le curve di Bézier; con grossi vantaggi sul disegno e sull’impiego modesto della memoria.
Su questo punto non sono d’accordo ad occhi chiusi. Ci sono dei grafici per i quali le curve di Bézier vanno benissimo e sono quelli in cui, come hai detto tu, tra le proprietà della curva c’è la continuità della tangente e della concavità. Ci sono però delle curve che non hanno questa proprietà e tracciarle con l’interpolazione cubica può dare problemi se i punti non sono scelti bene. Prendi ad esempio il grafico di una rampa o una qualunque curva con un punto angoloso. Se i nodi sono scelti uniformemente nel dominio e sono radi, rischi di prendere fischi per fiaschi. Se invece i nodi sono uniformemente distribuiti e densi va tutto bene, ma a questo punto a che ti serve l’interpolazione non lineare? Per mantenere basso il numero dei nodi, la soluzione è addensarli in prossimità del punto angoloso e diradarli altrove, che è ciò che fanno Matlab e Mathematica quando determinano il luogo delle radici, ad esempio. Ma se non usiamo un algoritmo del genere? Pensa ad un campionamento uniforme con acquisizione dati. Affideresti alla cieca la tua analisi alle curve di Bézier? La figura che segue mostra la differenza di comportamento della rampa nel caso di interpolazione lineare e cubica su nodi equispaziati, ottenuto con questo codice:
`\documentclass{standalone}
\usepackage{pgfplots}\begin{document}
\begin{tikzpicture}
\begin{axis} [legend pos=north west, no marks]
\addplot+[thick, dashed] coordinates {(-3,0) (-2,0) (-1,0) (0,0) (1,1) (2,2) (3,3)};
\addplot+[smooth, thick] coordinates {(-3,0) (-2,0) (-1,0) (0,0) (1,1) (2,2) (3,3)};
\legend{lineare,cubica}
\end{axis}
\end{tikzpicture}
\end{document}`[attachment=246]rampa.png[/attachment]
Altro aspetto è quello del risparmio di memoria. Perché pensi che l’interpolazione di ordine superiore faccia risparmiare memoria? Secondo te dove vengono memorizzati i punti inermedi tra i nodi (*)? Quei punti che non ci metti tu nella definizione della curva se li deve calcolare e memorizzare lui per tracciare il grafico: non è che i punti sul pdf se li può inventare. Quindi non solo non risparmi memoria, ma rallenti anche la compilazione(**). Fa una prova. Io ho provato a tracciare una retta con un numero di campioni spinto quasi al limite. Ho aggiunto l’opzione [tt]smooth[/tt] e la compilazione si è arrestata per sforamento della capacità. L’interpolazione cubica serve solo a rendere più dolci i grafici quando i punti a disposizione sono pochi e ad ottenere risultati decenti non rallentando troppo la compilazione(**) con un numero sproporzionato di campioni. La soluzione sta semplicemente nel non esagerare con i nodi, ma io preferisco (quasi) sempre campioni veri a campioni inventati.
O sbaglio? Ciao
*************************************
Edit: forse ho capito ora che con “impiego modesto della memoria” volevi dire che con le curve di Bézier servono meno punti in più che con l’interpolazione lineare per ottenere generalmente buoni risultati con un modesto incremento della memoria. Se è così siamo d’accordo (con le obiezioni sollevate all’inizio), ma è bene chiarire che l’interpolazione cubica ha bisogno di ulteriore spazio di memoria per definire le curve rispetto a quella riservata ai campioni.
*************************************(*) non intendo i punti che costituiscono la linea, ma quelli necessari a determinare univocamente l’equazione della curva.
(**) rallenti la compilazione rispetto al caso in cui non aumenti tu i nodi, ma se per evitare le curve di Bézier aumenti i campioni, il discorso è vero fintantoché la funzione della quale vuoi disegnare il grafico è più “semplice” di un polinomio di terzo grado e quindi quasi mai.
Forse mi era sfuggita la lettura di tutto il messaggio, che ora ho ritrovato e ho letto con attenzione.
ti posso dare due risposte:
1) è ovvio che una curva da tracciare contiene delle discontinuità, usi l’interpolazione lineare, quedratica, cubica solo nei tratti dove la curva è sufficientemente regolare; quindi una funzione gradino si disegna con due segmenti non raccordati; una rampa si disegna con due segmenti raccordati; una curva con cuspide si disegna con due curve (di orine 1, 2 o tre non importa; si usa la curva più adatta)che hanno solo le coordinate della cuspide in comune, eccetera.
2) le curve di Bézier richiedono ognuna quattro punti; due sono di inteprolazione e gli altri due sono di controllo; la parte difficile da fare e che fa pgfplots, è quella di determinare i punti di controllo delle due tangenti e della concavità per le curve del terzo orine, senza obbligare l’utente a definirli; poi una volta fatti questi calcoli, tenuto conto che ongi nuova curva aggiunta al grafico parte dal putno fissato con “moveto” e arriva allaltro nodo, mentre in mezzo ci sono le coordinate dei punti di controllo, ogni nuovo arco richiede un comando PostScript o un compndo PDF che aggiunge solo tre coordinate al file di uscita intercalate con poche altre informazoini relative a chi fa che cosa; tipicamente pict2e per una cubica richede di scrivere nel file di uscita il risultato della traduzione nel linguaggio del driver in uso di
`
\curveto(x1,y1)(x2,y2)(x3,y3)
`
dove x1,y1 e x2,y2 sono le coordinate dei due punti di controllo, e x3,y3 sono le coordinate del nodo di arrivo; il codice tradotto in linguaggio pdf richede un’altra mezza dozzina di caratteri; PostScript è più “verboso” e ne richiede una ventina in più.
La domanda allora diventa: dove sono i punti della cirva? semplice, non ci sono; la curva viene ridisegnata ogni vola dal driver per il formato di uscita: se questo è PDF, ci pensa Preview, Skim, Adone Reader, Sumatra, xpdf, o quant’altro a tradurre quelle poche informazioni in una bela curva sia sullo schermo sia sulla carta disegnata con il colore giusto a lo spessore giusto.
Ora sarà pur vero che il linguaggio PDF non costituisce una macchina di Turing, ma è anche vero che i suoi comandi primitivi consentono di disegnare curve cubiche molto bene con tre (quattro contando anche il punto di partenza) sole coordinate e qualche byte in più per dirgli che cosa deve fare con quelle coordinate.
Ecco perché affermo che è opportuno usare sempre l’interpolazione cubica, ovviamante quando si può; certo non con funzioni discontinue, ma tra una discontinuità e l’altra.
D’altra parte come pensi che si posano disegnare i caratteri ridigitallizzando ex novo il disegno ogni volta che si cambia scala sullo schermo in modo da non ingrandire i pixel che sono serviti per digitalizzare la pagina in prima istanza?perché il font bitmapped sono così scadenti quando si ingrandisce il disegno sullo schermo? proprio perché sono definiti da una matrice fissa di quadratini/rettangolini che nella scala giusta producono un bel disegno, ma nella scala sbagliata producono un orrore. L’abilità del visualizzatore delle pagine PDF sta appunto nela sua abilità di ridisegnare e rigitalizzare ogni forma grafica che appare sullo schermo disponendo appunto delle poche informazioni costituite dai nodi di interpolazione e dai punti di controllo dei relativamante pochi archi che formao ol disegno di ogni carattere.
Prova a installarti FontForge, se non lhai già installato; anche i contorni dei caratteri sono curve; ma vai a vedere un carattere qualsiasi scegliendolo da una qualsiasi polizza pfb, o ttf, o otf, cliccando sopra il disegno del carattere puoi evidenziare in rosso sia i nodi di interpolazione sia i unti di controllo, sia il contorno del glifo; nonostante ogni glifo possa essere più o meno complicato il numero totale di nodi di interpolazione è veramente modesto; prova so a immaginare quanti nodi ci vorrebbero se si usasse solo l’interpolazione lineare. ogni glifo sarebbe disegnato usando un numro di noti superiore di almeno due ordini di grandezza rispetto a quando sono disegnati con spline cubiche; noterai che in prossimità delle cuspidi le due tangenti destra e sinistra rispetto al verso di percorrenza sono indipendenti l’una dall’altra, mentre se provi a muovere il punto di controllo di una tangente in un nodo di continuità, si muove corrispondentemente anche il punto di controllo dell’altra tangente.
Anche senza disegnare font, l’uso di FontForge insegna tante cose sull’uso dell’interpolazione cubica.
Scusa se mi sono dilungato sull’interpolazione cubica dei contorni dei glifi. questi contorni sono curve come tutte le altre ma presentano anche delle cuspidi; l’unica cosa di cui non dispongono sono le discontinuità di prima specie, perché sono sempre curve chiuse semplicemente connesse. Però in questo modo credo di avere risposto alla tua domanda sull’interpolazione.