Newsgroup: it.comp.lang.visual-basic
Titolo: Interpolazione

Ho creato in VB6 un programma che crea all'interno di pictureBox
un grafico utilizzando il metodo grafico line:
ho n punti e tiro n-1 rette che uniscono i punti così ottengo un grafico a
linea continua.
Vorrei ottenere un aspetto un po' più gradevole interpolando i punti
e ottenendo una linea, oltre che continua, anche derivabile.
Qualcuno sa dove si possano trovare informazioni sull'interpolazione?
Secondo voi è fattibile in VB, o diventa troppo lento (visto che i calcoli
dovrebbero essere parecchi)?
Grazie a tutti.
-----------------------------------------------------------
Stefano Sala
stefan...@stcorp.cjb.net
http://stcorp.cjb.net/
http://clik.to/stefano/

 Vorrei ottenere un aspetto un po' più gradevole interpolando...

dovrebbero essere parecchi)?
Se usi le funzioni di OpenGL e' "uno scherzo": se devi farle a mano,
la cosa si complica molto.
Eventualmente, potresti, avendo n punti, creare una polinomiale che
passi per gli n punti. Si tratta di invertire una matrice che puo'
essere resa velocemente triangolare inferiore sinistra di ordine n,
che non e' proprio uno scherzo ma neanche tanto difficile...
Boh, potento userei le OpenGL.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

Grazie;
confesso di non avere idea di cosa sia OpenGL (l'ho gia' sentito nominare
ma nulla di piu'). Potresti farmi avere qualche info di base (o almeno link
a informazioni)?
Grazie ancora
Stefano.


a informazioni)?
Facciamo cosi': questa volta sono breve, cosi' se pensi ti sia utile e
ti interessa poi approfondiamo, mentre se cosi' non e' non ho perso
tempo inutilmente :)
Al solito, diro' imprecisioni che semplificano, pero', il discorso.
Non me ne vogliano i puristi della grafica :)
OpenGL e' fondamentalmente 2 cose:
- una libreria grafica
- una delle possibili accelerazioni grafiche delle schede video.
Ovviamente, la libreria e' quello che ci interessa dal momento che
dobbiamo programmare e visto che la puoi usare indipendentemente dal
fatto che tu abbia un acceleratore hardware che la supporta --tanto
meglio se c'e', ma non e' necessario--.
Praticamente si tratta di una libreria che ti mette a disposizione una
serie di API molto potenti per disegnare, fare rendering, ray tracing,
blablabla. La cosa che a te interessa sono fondamentalmente le curve
di Bezier, che sono curve che al meglio approssimano il passaggio per
3 punti. Le curve di Bezier sono quelle curve che il buon Bezier
studio' tanti anni fa per permettere ai cad --allora molto limitati
quanto a capacita' di calcolo-- che usavano alla Renault di
approssimare bene le curve che i progettisti volevano dare alla
carrozzeria delle autovetture che progettavano. Come dicevo, si parla
di curve per 3 punti.
Esistono poi una famiglia di curve di Bezier "estese" che praticamente
possono passare per n punti, perche' ogni volta che aggiungi un punto
all'array viene leggermente rivista --se necessario-- la curva fino a
quel punto ottenuta e quindi hai sempre il passaggio ottimale per
tutti i punti.
Nota: per passaggio ottimale intendo quello che realizzi col minor
sforzo di calcolo perche' sono formule approssimate relativamente
leggere per l'elaboratore. E' una curva quasi-polinomiale, per i
matematici puri :)
Normalmente, chi usa OpenGL, usa questa libreria perche' deve fare
cose veloci e quindi lavora in C, pero' e' disponibile un controllo
ocx per Visual Basic che ti mette a disposizione tanti metodi per
disegnare utilizzando le API di OpenGL. Naturalmente, e' un subset
della libreria completa, pero' funziona bene. Il controllo forse si
trova su Internet: se non lo trovi, te lo posso spedire io.
Per quanto riguarda il manuale d'uso di OpenGL --altrimenti col
fischio che usi le API e l'ocx :)--, io ho comprato lo splendido
OpenGL SuperBible della Waite Group, che, pero', costa 178.000 lire...
Se guardi sul sito della Silicon Graphics forse trovi qualcosa online.
Se non ricordo male, 
http://www.sgi.com
Altrimenti, come dicevo, puoi mettere le coordinate dei punti in una
matrice e invertire la matrice dei coefficienti del polinomio che
passa per questi punti, solo che bisogna fare almeno una stima del
numero max di punti che potresti avere per fare una cosa fatta bene.
E poi l'inversa di una matrice in VB ho paura che venga leeeeeenta...


Esitono anche un paio d'api:
Private Declare Function PolyBezier Lib "gdi32.dll" (ByVal hdc As Long, lppt
As POINTAPI, ByVal cPoints As Long) As Long
Private Declare Function PolyBezierTo Lib "gdi32.dll" (ByVal hdc As Long,
lppt As POINTAPI, ByVal cCount As Long) As Long

Per Stefano ed eventuali altri interessati all' argomento:
  negli ultimi due giorni Xoom sembra essersi messo in mutua.
Ho percio', molto rapidamente, allestito una copia del mio sito
su: 
http://www.mclink.it/personal/MC7061
Non e' ancora completo ma gia' ci sono vari miei progettini in
VB tra cui i due citati ieri.
Nel progetto Splines potrai trovare, tra le altre, anche la
routine per calcolare la "spline" di Bezier, consigliata da
Gianni. Attenzione, pero': le splines di tipo Bezier, B-Spline
e le regressioni non passano esattamente per tutti i punti dati
(sono curve approssimanti) a differenza delle C-Spline, T-Spline
e dei polinomi di Aitken, di Lagrange, etc... che passano si'
per tutti i punti ma che possono presentare notevoli oscillazioni
tra punto e punto.
Ciao e fatti sentire per eventuali problemi.
Franco