Newsgroup: it.comp.lang.visual-basic
Titolo: cerco algoritmo per "spline interpolation"

Lavoro con VB4 VB5 e cerco disperatamente un algoritmo per calcolare la 
interpolazione "spline" di punti nello spazio (bidimensionale).
Qualcuno puņ aiutarmi? o conosce qualche sito Web dove queste utility possano 
essere scaricate?
Grazie infinite
Dario Barbieri

Qualcuno puň aiutarmi? o conosce qualche sito Web dove queste utility



Potresti usare le funzioni api PolyBezier e PolyBezierTo (sono delle
spline).
Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As
POINTAPI, ByVal cPoints As Long) As Long
Declare Function PolyBezierTo Lib "gdi32" (ByVal hdc As Long, lppt As
POINTAPI, ByVal cCount As Long) As Long
Per le dichiarazioni guarda il visualizzatore Api
Con la seconda funzione puoi attaccare piů curve di Bezier.
Per algoritmi specifici dovresti procurarti un libro di calcolo numerico.
Ciao Marco

interpolazione "spline" di punti nello spazio (bidimensionale).
Utilizzeremo le Catmul-Rom splines che hanno il pregio di passare per
i punti di controllo.
Prima ti calcoli le "blending functions" (Overhauser) che ti salvi in
un array: deve essere fatto una volta sola. Il parametro "d"
rappresenta il numero di suddivisioni di ogni arco di curva.
Sub OverhauserBlend(ByVal d%, b!())
    Dim i%
    Dim u!
    ReDim b(4, d)
    For i = 1 To d
        u = i / d
        b(0, i - 1) = (-u * u * u + 2! * u * u - u) / 2!
        b(1, i - 1) = (3! * u * u * u - 5! * u * u + 2!) / 2!
        b(2, i - 1) = (-3! * u * u * u + 4! * u * u + u) / 2!
        b(3, i - 1) = (u * u * u - u * u) / 2!
    Next i
End Sub
Poi per tracciare la spline usa questa sub (le funzioni di
tracciamento sono quelle di OpenGL):
Const ENDS_STR = 6
Sub Spline(av2dPoints() As Vector2D, ByVal nPoints%, afBlend!(), ByVal
nSegs%)
    Dim i%, j%, k%, ii%
    Dim x!, y!
    If nPoints < 4 Then Exit Sub
    glBegin GL_LINE_STRIP
    glVertex2f av2dPoints(1).x, av2dPoints(1).y
    For i = 0 To nPoints - 4
         For j = 1 To nSegs
             x = 0!
             y = 0!
             For k = 0 To 3
                 ii = i + k
                 If ii = 0 Then
                    x = x + (ENDS_STR * av2dPoints(0).x - _
                        (ENDS_STR - 1) * av2dPoints(1).x) * afBlend(k,
j - 1)
                    y = y + (ENDS_STR * av2dPoints(0).y - _
                        (ENDS_STR - 1) * av2dPoints(1).y) * afBlend(k,
j - 1)
                 ElseIf ii = (nPoints - 1) Then
                    x = x + (ENDS_STR * av2dPoints(ii).x - _
                        (ENDS_STR - 1) * av2dPoints(ii - 1).x) *
afBlend(k, j - 1)
                    y = y + (ENDS_STR * av2dPoints(ii).y - _
                        (ENDS_STR - 1) * av2dPoints(ii - 1).y) *
afBlend(k, j - 1)
                 Else
                    x = x + av2dPoints(ii).x * afBlend(k, j - 1)
                    y = y + av2dPoints(ii).y * afBlend(k, j - 1)
                End If
            Next k
            glVertex2f x, y
        Next j
    Next i
    glEnd
End Sub
Vector2D e' naturalmente un
Type Vector2D
    x As Single
    y As Single
End Type
Il primo e l'ultimo punto non vengono tracciati (il perche' te lo vai
a leggere sul Foley - van Dam - Feiner  - Hughes "Computer Graphics -
Principles and Practice" che ti invito comunque a leggere), ma basta
duplicarli per risolvere il problema.
Forse c'e' qualche piccolo errore di sintassi perche' ho rimaneggiato
al volo una sub che ho scritto qualche anno fa.
Ciao
Gian Michele Bertoni
--
Home Page: 
http://space.tin.it/computer/gbertoni/


Sorry, tempo fa avevo una funzione in C che lo faceva, ma non la trovo
piu'...
Se proprio non trovi risposta su questo newsgroup, puoi provare su
comp.graphics.algorithms.
--
Roal Zanazzi
z...@iol.it