Oppure

Loading
01/10/13 9:25
coyote100
devo simulare il giro di una ruota.
Questa funzione(in basso) funziona, ma il mio problema e che la ruota(picturebox), mentre ruota si sposta a destra a sinistra, e a me servirebbe che ruotasse, ma sempre in quel punto.

 Private Function RotazioneBMP(ByVal BMPInput As Bitmap, ByVal angoloRotazione As Single, ByVal coloreSfondo As Brush) As Bitmap

        'Angolo di rotazione desiderato
        Dim radianti As Double = angoloRotazione * Math.PI / 180

        'Dimensioni di BMPInput 
        Dim bmpW As Integer = BMPInput.Width
        Dim bmpH As Integer = BMPInput.Height

        'Bitmap di output
        'Dimensioni
        Dim bmpOutW As Integer = bmpW * Math.Abs(Math.Cos(radianti)) + bmpH * Math.Abs(Math.Sin(radianti))
        Dim bmpOutH As Integer = bmpH * Math.Abs(Math.Cos(radianti)) + bmpW * Math.Abs(Math.Sin(radianti))
        Dim BMPOutput As New Bitmap(bmpOutW, bmpOutH)
        Dim G As Graphics = Graphics.FromImage(BMPOutput)

        'Colore di sfondo per le regioni esterne 
        G.FillRectangle(coloreSfondo, 0, 0, bmpOutW, bmpOutH)

        'Disegno / Rotazione di BMPInput su BMPOutput
        Dim M As New System.Drawing.Drawing2D.Matrix
        M.RotateAt(angoloRotazione, New PointF(bmpOutW / 2, bmpOutH / 2)) 'Centro della rotazione
        G.Transform = M
        G.DrawImage(BMPInput, CInt((bmpOutW - BMPInput.Width) / 2), CInt((bmpOutH - BMPInput.Height) / 2))

        Return BMPOutput

    End Function



  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim percorso As String = Application.StartupPath
        Dim BMP As New Bitmap(percorso & "\IMMAGINI\pp.bmp")
        '  PBruora.Image.RotateFlip(RotateFlipType.Rotate90FlipXY)
        ' PBruora.Invalidate()


        PBruora.Image = RotazioneBMP(BMP, txtAngle.Text, Brushes.Red)




    End Sub



Grazie
aaa
01/10/13 18:46
pierotofy
Forse il centro della rotazione e' sbagliato. Prova ad usare bmpW e bmpH invece di bmpOutW e bmpOutH.
Il mio blog: piero.dev
01/10/13 20:53
coyote100
Ho sostituito
   'Disegno / Rotazione di BMPInput su BMPOutput
        Dim M As New System.Drawing.Drawing2D.Matrix
        M.RotateAt(angoloRotazione, New PointF(bmpW / 2, bmpH / 2)) 'Centro della rotazione
        G.Transform = M
        G.DrawImage(BMPInput, CInt((bmpOutW - BMPInput.Width) / 2), CInt((bmpOutH - BMPInput.Height) / 2))


 PBruora.Image = RotazioneBMP(BMP, txtAngle.Text, Brushes.Red)

---Brushes.Red....
Cast non valido dalla stringa "" al tipo 'Single'.




crea il form e va in errore
aaa
02/10/13 21:15
vankraster
Con la premessa che l'immagine della ruota che devi ruotare è quadrata posso dirti (altrimenti nulla di ciò è valido):
Secondo me la larghezza dell'immagine dopo la rotazione va calcolata così:
[pseudo-codice - C#]
diagonale_immagine = diagonale immagine originale, quando l'immagine era ruotata di 0^, quindi lato * Radice_q(2)

if (angolo_rotazione >45)
angolo_rotazione=angolo_rotazione % 45;

if (angolo_rotazione ==0)
larghezza_img_ruotata =larghezza_img_originale
else if ( angolo_rotazione <45 ) a
larghezza_img_ruotata = Cos(angolo) * diagonale_immagine
else if ( angolo_rotazione ==45 )
larghezza_img_ruotata = diagonale_immagine

il punto in cui devi girare l'immagine NON è: larghezza/2 e altezza/2
Difficile calcolare i punti in cui tu devi girare l'immagine, perché considera che se hai ruotato il quadrato di x gradi allora il centro del quadrato non è più larghezza_IMG / 2 e altezza_IMG/2 ma devi incrociare le 2 diagonali del quadrato e quel punto è il centro del quadrato che tu devi girare ! Incrociare le 2 diagonali NON è uguale al H/2 e W/2 !

Questo è il mio parere...
Ultima modifica effettuata da vankraster 03/10/13 11:13
aaa