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

Qualcuno  sa dirmi come si disegna un'ellisse con glia ssi inclinati??
Grazie
Tommaso

Tommaso:
 puoi provare con questa routine, copiata da un mio vecchio progetto:
Private Sub Ellisse(ByVal Quadro As PictureBox, ByVal a!, ByVal b! _
    , Optional ByVal Rot! = 0!, Optional ByVal Tx! = 0!, Optional ByVal Ty! = 0! _
    , Optional ByVal Rd! = 0.1, Optional ByVal Colore& = vbWhite)
'
'   Quadro: PictureBox di destinazione del disegno.
'   a:      semiasse x (a > 0).
'   b:      semiasse y.
'   Rot:    rotazione in [radianti].
'   Tx:     traslazione in direzione x.
'   Ty:     traslazione in direzione y.
'   Rd:     risoluzione del disegno.
'   Colore: colore del disegno.
'
    Dim x!, y!, x0s!, y0s!, x0i!, y0i!, x1!, y1!
'
    ' Punto di inizio del disegno dell' ellisse:
    Trasforma -a, 0!, Rot, Tx, Ty, x0s, y0s
    x0i = x0s
    y0i = y0s
'
    For x = -a + Rd To a - Rd Step Rd
        y = Sqr(a * a - x * x) * b / a
'
        ' Disegna la meta' superiore dell' ellisse:
        Trasforma x, y, Rot, Tx, Ty, x1, y1
        Quadro.Line (x0s, y0s)-(x1, y1), Colore
        x0s = x1
        y0s = y1
'
        ' Disegna la meta' inferiore dell' ellisse:
        Trasforma x, -y, Rot, Tx, Ty, x1, y1
        Quadro.Line (x0i, y0i)-(x1, y1), Colore
        x0i = x1
        y0i = y1
    Next x
'
    ' Chiude la curva del disegno dell' ellisse:
    Trasforma a, 0!, Rot, Tx, Ty, x1, y1
    Quadro.Line (x0s, y0s)-(x1, y1), Colore
    Quadro.Line (x0i, y0i)-(x1, y1), Colore
'
'
'
End Sub
Private Sub Trasforma(ByVal x!, ByVal y!, ByVal Rot!, ByVal Tx!, ByVal Ty!, x1!, y1!)
'
'   x, y:   coordinate del punto da trasformare.
'   Rot:    rotazione del punto in [radianti].
'   Tx, Ty: traslazione del punto nelle direzioni x e y.
'   x1, y1: coordinate finali del punto trasformato.
'
    ' Rotazione:
    x1 = x * Cos(Rot) - y * Sin(Rot)
    y1 = x * Sin(Rot) + y * Cos(Rot)
'
    ' Traslazione:
    x1 = x1 + Tx
    y1 = y1 + Ty
'
'
'
End Sub
Ciao e spero che sia quello che ti serve,
Franco


 wrote in message
3AE879AA...@MCLINK.IT...

Con questo metodo viene eseguito il disegno di una ellisse per punti.
OK!
potrebbe andare ma mi sembra troppo artificioso e la risoluzione grafica
potrebbe non essere buona;
i risultati che hai ottenuto tu sono stati soddisfacenti?

 i risultati che hai ottenuto tu sono stati soddisfacenti?
Ti ho inviato a parte il Form che avevo usato, a suo tempo, per provare
la routine in modo che tu possa giudicare da solo se il metodo soddisfa
le tue necessita'.
Ciao e fammi sapere.
Franco

 wrote in message
3AE9B407...@MCLINK.IT...

Pensavo si potesse ottenere risultato migliore con qualcghe funzione di
rotazione
Evidentemente non esiste questa possibilità
La tua routine mi ha dato lo spunto per una soluzione un poco migliore
La rotazione e la traslazione viene riferita al centro dell'ellisse.
Vorrei aggiungere la possibilità di riempire la superficie; come si potrebbe
fare?
Ti saluto e ti ringrazione comunque
Tommaso

Non ho letto i messaggi precedenti perche' e' da parecchio che non frequento
questo news, ma non capisco cosa intendi per "funzione di rotazione".
L'unico modo per disegnare un'ellisse e' quello di costruire una poligonale
per passi, magari tanto piccoli da superare la risoluzione grafica. Piu'
diquesto non potrai ottenere nemmeno con i computer del 3000 d.c.
Comunque non so la funzione che ti hanno passato, ma per disegnare un
'ellisse bastano questi pochi comandi:
passi=<numero di passi>
r1=<asse maggiore>
r2=<asse minore>
For an=0 to (2*pi+.001) step 2*pi/passi
 x=r1*cos(an)
 y=r2*sin(an)
 if an=0 then pset(x,y) else line-(x,y)
next
Per riempirla aggiungi il comando Paint
Michelangelo
[...]


 Michelangelo

 fare?
Niente di piu' facile...
Cambia la dichiarazione iniziale con:
Private Sub Ellisse(ByVal Quadro As PictureBox, ByVal a!, ByVal b! _
    , Optional ByVal Rot! = 0!, Optional ByVal Tx! = 0!, Optional ByVal Ty! = 0! _
    , Optional ByVal Rd! = 0.1, Optional ByVal Colore& = vbWhite _
    , Optional ByVal RiempiColColore As Variant)
e sostituisci:
    ' Chiude la curva del disegno dell' ellisse:
    'Trasforma a, 0!, Rot, Tx, Ty, x1, y1
    'Quadro.Line (x0s, y0s)-(x1, y1), Colore
    'Quadro.Line (x0i, y0i)-(x1, y1), Colore
con:
    ' Chiude la curva del disegno dell' ellisse:
    Trasforma a, 0!, Rot, Tx, Ty, x1, y1
    Quadro.Line -(x1, y1), Colore
    Quadro.Line -(x0s, y0s), Colore
    ' Elimina la mancanza dell' ultimo pixel:
    Quadro.Line -(x1, y1), Colore
'
    If Not IsMissing(RiempiColColore) Then
        ' Riempie l' elisse con il colore richiesto:
        Dim hBrush&, X0&, Y0&
        hBrush = CreateSolidBrush(CLng(RiempiColColore))
        SelectObject Quadro.hDC, hBrush
        X0 = CLng(Quadro.ScaleX(Tx - Quadro.ScaleLeft, vbUser, vbPixels))
        Y0 = CLng(Quadro.ScaleY(Ty - Quadro.ScaleTop, vbUser, vbPixels))
        ExtFloodFill Quadro.hDC, X0, Y0, Colore, FLOODFILLBORDER
        DeleteObject hBrush
    End If
A questo punto se passi un valore di colore nel parametro RiempiColColore
il tuo elisse verra' colorato internamente. Questo sistema vale, ovviamente,
per riempire una qualsiasi curva chiusa.
Ciao e fatti sentire.
Dimenticavo. Aggiungi nelle dichiarazioni del Form:
'
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hDC As Long, ByVal X As Long _
, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
Private Declare Function DeleteObject& Lib "gdi32" (ByVal hObject As Long)
Private Declare Function SelectObject& Lib "gdi32" (ByVal hDC As Long _
, ByVal hObject As Long)
Private Declare Function CreateSolidBrush& Lib "gdi32" (ByVal crColor As Long)
'
Private Const FLOODFILLBORDER = 0
Private Const FLOODFILLSURFACE = 1

 Grazie
E' vero Paint era del vecchio Basic. Ho pero' visto l'esitenza di
FillColor.vedi un po' se funziona. altrimenti, anche se un po' lenta in
Basic, la fai tu. Ad esempio anzicche' collegare i punti successivi
dell'ellisse potresti modificare il programmino di cui sopra,disegnare solo
mezza ellisse (parlo di ellisse orizzontale o verticale e non ruotata su XY)
e collegare i punti simmetrici rispetto ad un asse dell'ellisse.
Il programmino diventa cosi':
passi=<numero di passi>/2
r1=<asse maggiore>
r2=<asse minore>
For an=0 to pi step 2*pi/passi
 x=r1*cos(an)
 y=r2*sin(an)
 line(x,y)-(x,y*-1)
next
Anzi, visto che si tratta di una figura simmetrica sia in orizzontale che
verticale io calcolerei solo un quarto di essa:
almeno riduci i calcoli trigonometrici ad un quarto.
passi=<numero di passi>/4
r1=<asse maggiore>
r2=<asse minore>
For an=0 to pi/2 step 2*pi/passi
 x=r1*cos(an)
 y=r2*sin(an)
 line(x,y)-(x,-y)
line(-x,y)(-x,-y)
next