+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Modificare le coordinate di un punto in un array 'ruotandolo' intorno ad un centro.

  1. #1
    Dev-01 non è in linea Scribacchino
    Post
    528

    Modificare le coordinate di un punto in un array 'ruotandolo' intorno ad un centro.

    Buonasera,

    ho la necessità di ruotare un array di punti relativamente al centro di un'area per poi unirli e creare una figura geometrica.

    I punti esprimono un modello (possiamo comunque esemplificare riferendoci ad un normale rettangolo) che può essere disegnato a varie angolazioni utilizzando il mouse.

    Ho provato il seguente metodo (riferito ad un generico poligono regolare) ridotto al minimo per non scrivere tonnellate di codice:

    codice:
    Dim StartPoint as Point
    Dim EndPoint as Point
    
    Sub Me_MouseDown(sender as Object, e as MouseEventArgs)Handles Me.MouseDown
    StartPoint = new point (e.x, e.y)
    End Sub 
    
    Sub Me_MouseUp(sender as Object, e as MouseEventArgs)Handles Me.Me.MouseUp
    EndPoint = new point (e.x, e.y)
    End sub 
    
    
    Sub Button1_Click(sender as Object, e as EventArgs) Handles Button1.Click
    
    ' * Coordinate dell'area d'interesse.
    Dim X as integer = StartPoint.X  
    Dim Y as integer = StartPoint.Y 
    
    ' * Misure dell'area di interesse.
    Dim W as integer = EndPoint.X - StartPoint.X 
    Dim H as integer = EndPoint.Y - StartPoint.Y
    
    Dim Points(3) As Point 
    
    Points(0) = New Point(X, Y)
    Points(1) = New Point(X + W, Y)
    Points(2) = New Point(X + W, Y + H)
    Points(3) = New Point(X, Y + H)
    
    Points = Rotate(Points, W, H, Points.GetUpperBound(0), 63) ' * Esempio di rotazione a 63 gradi.
    
    Dim bmp As New bitmap (Width, Height)
    Dim gr As Graphics = Graphics.FromImage(bmp)
    gr.Clear(Color.White)
    
    For I As Integer = 0 to Points.GetUpperBound(0)
    Dim P As Point = Points(i)
    bmp.SetPixel(P.X, P.Y, Color.Red)
    
    Next
    
    BackgroundImage = bmp
    
    End Sub 
    
    Function Rotate(ByVal Points() As Point,  ByVal Width As integer, ByVal Height As Integer, ByVal Sides As Integer, ByVal ShiftDegrees As Integer) As Point()
    
    Dim _Sides as integer = Sides
    
    Dim X as integer = StartPoint.X  
    Dim Y as integer = StartPoint.Y  
    
    Dim W2 As Integer = Width \ 2
    Dim H2 As Integer = Height \ 2
    
    Dim Shift As Double = Math.PI * 2 / _Sides
    Dim Angle As Double = Math.PI / 2 + ShiftDegrees
    
    For i As Integer = 0 To UBound(Points)
                Points(i) = New Point(X + W2 + W2 * Math.Cos(Angle), Y + H2 - H2 * Math.Sin(Angle))
                Angle = Angle + Shift
    Next
    
    Return Points
    
    End Function
    Ma non ottengo la giusta rotazione.

    Ho provato anche a ruotare una GraphicPath dopo avervi aggiunto la figura già terminata: la rotazione applicata era perfetta ma non riesco a circoscriverla all'interno dell'area designata.

  2. #2
    Dev-01 non è in linea Scribacchino
    Post
    528
    Con questo metodo sono riuscito a ruotare l'immagine intorno al centro dell'area designata ma la figura può diventare più grande: mantiene l'angolazione giusta ma sborda.

    (Integrazione e modifica del codice precedente).

    codice:
    Sub Button1_Click(sender as Object, e as EventArgs) Handles Button1.Click
    
            Dim X As Integer = StartPoint.X
            Dim Y As Integer = StartPoint.Y
    
            Dim W As Integer = EndPoint.X - StartPoint.X
            Dim H As Integer = EndPoint.Y - StartPoint.Y
    
            Dim Points(3) As Point
    
            Points(0) = New Point(X, Y)
            Points(1) = New Point(X + W, Y)
            Points(2) = New Point(X + W, Y + H)
            Points(3) = New Point(X, Y + H)
    
    
            Dim Path As New GraphicsPath
    
            Path = Rotate(Points, New Point(X + (W / 2), Y + (H / 2)), 63)
    
           Dim bmp As New bitmap (Width, Height)
           Dim gr As Graphics = Graphics.FromImage(bmp)
    
           gr.Clear(Color.White)
           gr.DrawPath(New SoliBrush(Color.Red), Path)
    
    
           BackgroundImage = bmp
    
    End Sub 
    
      Function Rotate(ByVal Points() As Point, ByVal Focal As Point, ByVal Angle As Single) As GraphicsPath
    
            Dim Path As New Drawing2D.GraphicsPath()
    
            Path.AddPolygon(Points)
    
            Dim translateMatrix As New Matrix
            translateMatrix.RotateAt(Angle, New PointF(Focal.X, Focal.Y))
            Path.Transform(translateMatrix)
    
    
            Return Path
        End Function
    Mi spiego meglio:

    Dal momento che partiamo sempre da un'area di forma rettangolare compresa fra StartPoint e EndPoint, quello che vorrei ottenere è si, la figura correttamente inclinata e centrata ma anche sempre e comunque circoscritta all'interno non del Path (le dimensioni ottenute sono effetivamente quelle del rettangolo d'origine) ma dell'area originale.
    Ultima modifica di Dev-01; 18-05-2020 16:56 

  3. #3
    L'avatar di Eleatico
    Eleatico non è in linea Scolaretto
    Luogo
    Eboli
    Post
    66
    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    Mi spiego meglio:

    Dal momento che partiamo sempre da un'area di forma rettangolare compresa fra StartPoint e EndPoint, quello che vorrei ottenere è si, la figura correttamente inclinata e centrata ma anche sempre e comunque circoscritta all'interno non del Path (le dimensioni ottenute sono effetivamente quelle del rettangolo d'origine) ma dell'area originale.
    Se ho bene capito vuoi ruotare l'immagine all'interno del rettangolo ma non il rettangolo, ovvero l'immagine ruotata deve essere contenuta all'interno dei quattro punti iniziali, è così?

  4. #4
    Dev-01 non è in linea Scribacchino
    Post
    528
    Ciao e grazie per l'interesse.

    Si, è proprio quello che voglio ottenere.

    Ho provato con il metodo .Scale della matrice applicata all'oggetto GraphicsPath ma senza risultato.

  5. #5
    L'avatar di Eleatico
    Eleatico non è in linea Scolaretto
    Luogo
    Eboli
    Post
    66
    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    Si, è proprio quello che voglio ottenere.
    In tal modo uno zona adiacente i quattro spigoli risulterebbe bianca o del colore di sfondo del rettangolo.
    Potrei, per curiosità, sapere cosa devi farne di una soluzione del genere?

  6. #6
    Dev-01 non è in linea Scribacchino
    Post
    528
    Certo che puoi.

    Si tratta di realizzare dei modelli 2D anche complessi espressi sotto forma di relazione matematica pronti ad essere utilizzati o definibili dall'utente.

    Per esemplificarne l'utilizzo al massimo necessito di poter disegnare all'interno del rettangolo definito durante il trascinamento del mouse.

  7. #7
    L'avatar di Eleatico
    Eleatico non è in linea Scolaretto
    Luogo
    Eboli
    Post
    66
    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    Certo che puoi.

    Si tratta di realizzare dei modelli 2D anche complessi espressi sotto forma di relazione matematica pronti ad essere utilizzati o definibili dall'utente.

    Per esemplificarne l'utilizzo al massimo necessito di poter disegnare all'interno del rettangolo definito durante il trascinamento del mouse.
    Cioè vorresti poter trascinare un'immagine per ridisegnarla in un poligono qualsiasi?

  8. #8
    Dev-01 non è in linea Scribacchino
    Post
    528
    No.

    Quando io trascino il mouse durante il disegno posso sempre ottenere un'area rettangolare compresa fra il punto definito nell'evento MouseDown e quello definito all'atto del trascinamento prima e del rilascio poi.

    In quest'area io disegno un modello (o figura, se preferisci).

    Questo modello può essere ruotato definendo l'angolo prima di effettuare il trascinamento col mouse (tipo MSPaint ma con la rotazione, per intenderci).

    Per esempio: seleziono un rettangolo (per rimanere in tema con l'esempio iniziale) assegnando un'inclinazione di 32 gradi.

    Il risultato è un rettangolo che ha le dimensioni del rettangolo definito durante il trascinamento ma la rotazione applicata lo porta al di fuori del rettangolo iniziale.

    Quello che vorrei ottenere è un rettangolo ruotato ma che resti contenuto all'interno del rettangolo definito col mouse.

    Non mi interessano le dimensioni effettive (è chiaro che sarà più piccolo del rettangolo definito in fase di trascinamento) ma solo che l'angolo applicato sia corretto.

  9. #9
    L'avatar di Eleatico
    Eleatico non è in linea Scolaretto
    Luogo
    Eboli
    Post
    66
    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    No.
    Quello che vorrei ottenere è un rettangolo ruotato ma che resti contenuto all'interno del rettangolo definito col mouse.
    La rotazione avviene intorno al baricentro del rettangolo iniziale?

  10. #10
    Dev-01 non è in linea Scribacchino
    Post
    528
    Si, ho specificato alcuni dettagli nei primi due post.

    Mi è necessario altrimenti tutto il discorso cadrebbe.

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi