Newsgroup: it.comp.lang.visual-basic
Titolo: torte pie, quesito complicatissimo

ho seguiti il consiglio di hal1961, e ho iniziato a provare a disegnare le
torte, i grafici pie, a mano, usando la funzione Pie.
disegnare una "faccia" della torta, quella superiore, non ci vuole niente
(piu o meno). il problema è renderla tridimensionale.
hal1961 aveva detto che dovevo disegnare la stessa torta due volte, solo che
una doveva essere spostata in basso rispetto all'altra. e ho fatto così.
il problema insormontabile è un altro: per far venire un grafico a torta 3D
decente, devo unire i punti che si trovano sulla torta superiore, e che
corrispondono ad ogni singolo "inizio" di fetta della torta, con i
corrispondenti punti che si trovano nella torta inferiore.
a dirla cosi sembrerebbe non tanto difficile, ma invece lo è. perche Pie
disegna le "fette" di torte basandosi sulle coordinate del "bounding
rectangle", e quindi io dovrei, conoscendo i punti degli "inizi" solo sul
rettangolo esterno, trovarmeli anche per quanto riguarda la circonferenza
della torta. in pratica mi servirebbe conoscere una intersezione, tra la
retta che va dal centro della torta al punto individuato sul rettangolo, e
la torta stessa.
avevoi pensato di andare a ripescare la formula che dà la funzione di una
retta passante per due punti. una volta presa questa funzione, mi "scorrevo"
tutti i punti dal centro della torta, fino al rettangolo, vedevo quando il
pixel cambiava colore, e avevo individuato il punto.
ma trasformare una formula "astratta" in funzione VB, visto che non esiste
una sorta di Evaluate, è moooooooolto difficile.
quindi, se qualcuno conosce un sistema piu semplice che non comporti una
laurea in matematica o ingegneria, mi potrebbe aiutare???????
MarioH

...
Dunque, non so come si comporta la Pie(), ma se i tuoi punti sono il
bounding rectangle non dovrebbe essere difficile.
Ti posso dare un paio di funzioncine trigonometriche che potrebbero
servirti:
RotatePt() dato un punto, un centro di rotazione e un'angolo ti trova il
punto di destinazione.
GetPtOnCircle() dato un'ellissi e un'angolo ti trova il punto che cade sulla
circonferenza.
GetAngle() pensandoci ti servirebbe anche questa: data una retta ti dà
l'angolo di inclinazione in gradi.
Public Sub RotatePt(ByVal OrgX As Long, ByVal OrgY As Long, ByVal PtX As
Long, ByVal PtY As Long, ByVal Angle As Integer, DestPt As POINTAPI)
    Dim r As Double
    Dim cr As Double
    Dim sr As Double
    Dim PdummyX As Long
    Dim PdummyY As Long
    If (Angle <> 0) Then
        r = -(pi * Angle / 180#)
        PdummyX = PtX - OrgX 'Evita errori nel caso che Pt e DestPt siano la
stessa variabile
        PdummyY = PtY - OrgY
        cr = Cos(r)
        sr = Sin(r)
        DestPt.x = (PdummyX * cr) - (PdummyY * sr) + OrgX
        DestPt.y = (PdummyX * sr) + (PdummyY * cr) + OrgY
    Else
        DestPt.x = PtX
        DestPt.y = PtY
    End If
End Sub
Public Sub GetPtOnCircle(CenterX As Long, CenterY As Long, RadiusX As Long,
RadiusY As Long, ByVal Angle As Integer, DestPt As POINTAPI)
    Dim r As Double
    r = pi / 180#
    DestPt.x = CenterX - (Sin(Angle * r) * RadiusX)
    DestPt.y = CenterY - (Sin((90 - Angle) * r) * RadiusY)
End Sub
Public Function GetAngle(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As
Long, ByVal Y2 As Long) As Long
    Dim RInv As Double
    RInv = 180# / pi
    If (X2 = X1) Then
        If (Y1 > Y2) Then
            Gr_GetAngle = -90
        Else
            Gr_GetAngle = 90
        End If
    Else
        GetAngle = -Atn((Y2 - Y1) / (X2 - X1)) * RInv
        If (X2 < X1) And (Y2 < Y1) Then GetAngle = GetAngle + 180
        If (X2 >= X1) And (Y2 < Y1) Then GetAngle = GetAngle - 180
    End If
End Function
Ciao


     r = pi / 180#
grazie mille

>     r = pi / 180#
A, sì... pi è una costante globale che chiaramente vale 3.14159265358979
Ciao

ok grazie faccio un paio di prove
MarioH