Differenze tra le versioni di "Ruotare un triangolo in una DrawingArea"

Da Gambas-it.org - Wikipedia.
 
Riga 17: Riga 17:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()   
+
  Public Sub Form_Open()   
 
   
 
   
With Me
+
  With Me
  .W = Screen.AvailableWidth
+
    .W = Screen.AvailableWidth
  .H = Screen.AvailableHeight
+
    .H = Screen.AvailableHeight
  .Arrangement = Arrange.Fill
+
    .Arrangement = Arrange.Fill
End With   
+
  End With   
 
   
 
   
With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
+
  With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
  .Background = Color.White
+
    .Background = Color.White
End With
+
  End With
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
   
 +
Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 47: Riga 48:
 
   End With     
 
   End With     
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Form_KeyPress()
+
   
 +
Public Sub Form_KeyPress()
 
    
 
    
 
   Select Case Key.Code
 
   Select Case Key.Code
Riga 62: Riga 64:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Form_MouseWheel()
+
   
 +
Public Sub Form_MouseWheel()
 
   
 
   
 
   ang += Mouse.Delta
 
   ang += Mouse.Delta
Riga 76: Riga 79:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno non va perso.''</font>
+
   
 +
Public Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno non va perso.''</font>
 
    
 
    
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
  
 
==Ruotare un Triangolo intorno al suo Incentro==
 
==Ruotare un Triangolo intorno al suo Incentro==
Riga 104: Riga 108:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()   
+
  Public Sub Form_Open()
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With  
 
   
 
   
With Me
+
  With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
  .W = Screen.AvailableWidth
+
    .Background = Color.White
  .H = Screen.AvailableHeight
+
  End With
  .Arrangement = Arrange.Fill
 
End With
 
 
   
 
   
With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
+
  End
  .Background = Color.White
 
  End With
 
 
   
 
   
'''End'''
 
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 134: Riga 139:
 
   End With     
 
   End With     
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Form_KeyPress()
+
  Public Sub Form_KeyPress()
 
    
 
    
 
   Select Case Key.Code
 
   Select Case Key.Code
Riga 149: Riga 155:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Form_MouseWheel()
+
   
 +
Public Sub Form_MouseWheel()
 
   
 
   
 
   ang += Mouse.Delta
 
   ang += Mouse.Delta
Riga 163: Riga 170:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
   
 
   
  '''End'''
+
  End
 +
 +
 +
Public Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno non va perso.''</font>
 
   
 
   
'''Public''' Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno non va perso.''</font>
 
 
 
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
  
  
Riga 175: Riga 183:
 
=Note=
 
=Note=
 
[1] Vedere anche queste pagine:
 
[1] Vedere anche queste pagine:
* [[Ruotare_un_cerchio_disegnato_in_una_DrawingArea|Ruotare un cerchio disegnato in una DrawingArea]]
+
* [[Ruotare un cerchio disegnato in una DrawingArea]]
* [[Ruotare_un_quadrato_ed_un_rettangolo_in_una_DrawingArea|Ruotare un quadrato ed un rettangolo in una DrawingArea]]
+
* [[Ruotare un quadrato ed un rettangolo in una DrawingArea]]
* [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
+
* [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
* [[Ruotare_una_immagine_sul_proprio_asse_centrale|Ruotare una immagine sul proprio asse centrale]]
+
* [[Ruotare una immagine sul proprio asse centrale]]

Versione attuale delle 05:40, 27 giu 2024

Mostriamo due possibili codice per far ruotare su se stesso un Triangolo disegnato su una DrawingArea. [Nota 1]

Ruotare un Triangolo intorno al suo Baricentro

Di seguito mostreremo un possibile codice per ruotare un Triangolo intorno al suo Baricentro.
La rotazione del triangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse.
Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza.

Private DrawingArea1 As DrawingArea
' Imposta le coordinate dei tre vertici del triangolo, con il primo vertice nel punto di rotazione (0, 0):
Private ABC As Single[] = [0, 0, 200, 0, 100, 300]
' Calcoli per ottenere il "Baricentro" del triangolo:
Private xb As Single = (ABC[0] + ABC[2] + ABC[4]) / 3
Private yb As Single = (ABC[1] + ABC[3] + ABC[5]) / 3
' Memorizza i gradi dell'angolo:
Private ang As Float
Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
Private f As Float[] = [0, 0.34, 0.67, 1]


Public Sub Form_Open()  

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With  

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.White
 End With

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Brush = .LinearGradient(0, 20, 15, 0, c, f)
' Imposta il fulcro/punto della rotazione - ad esempio - al centro dell'area di disegno:
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(ang))
   .LineWidth = 2.0
' Disegna il Triangolo.
' Siccome l'angolo ruota su se stesso, avendo come centro di rotazione il proprio "Baricentro", ad ogni coordinata del punto, che costituisce un elemento del vettore del Metodo ".Polygon()", si sottrae il valore della corrispondente coordinata del punto del Baricentro. In questo modo si farà coincidere l'angolo di rotazione con il "Baricentro" del Triangolo.
' Non si devono modificare i valori né i segni dei quattro argomenti qui riportati.
   .Polygon([ABC[0] - xb, ABC[1] - yb, ABC[2] - xb, ABC[3] - yb, ABC[4] - xb, ABC[5] - yb])
   .Stroke 
   .End
 End With     

End


Public Sub Form_KeyPress()
  
 Select Case Key.Code
   Case Key.Up
     ang += 1
     If ang = 361 Then ang = 1
   Case Key.Down
     ang -= 1
     If ang = -361 Then ang = -1
 End Select
 
 DrawingArea1.Refresh
  
End


Public Sub Form_MouseWheel()

 ang += Mouse.Delta
 Select Case ang
   Case 361
     ang = 1
   Case -361
     ang = -1
 End Select

 DrawingArea1.Refresh

End


Public Sub Form_Resize()   ' Con questo evento se cambia la dimensione del Form, il disegno non va perso.
  
 DrawingArea1.Refresh
  
End

Ruotare un Triangolo intorno al suo Incentro

Quest'altro codice servirà per far ruotare un Triangolo intorno al suo Incentro.
La rotazione del triangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse.
Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza.

Private DrawingArea1 As DrawingArea
' Imposta le coordinate dei tre vertici del triangolo, con il primo vertice nel punto di rotazione (0, 0):
Private ABC As Single[] = [0, 0, 200, 0, 100, 300]
' Calcola la distanza euclidea fra due punti, per ottenere la lunghezza di ciascun lato del triangolo:
Private ab As Single = Sqr(((ABC[2] - ABC[0]) ^ 2) + ((ABC[3] - ABC[1]) ^ 2))
Private bc As Single = Sqr(((ABC[4] - ABC[2]) ^ 2) + ((ABC[5] - ABC[3]) ^ 2))
Private ac As Single = Sqr(((ABC[4] - ABC[0]) ^ 2) + ((ABC[5] - ABC[1]) ^ 2))
' Calcoli per ottenere il "Incentro" del triangolo:
Private ix As Single = ((ab * ABC[4]) + (bc * ABC[0]) + (ac * ABC[2])) / (ab + bc + ac)
Private iy As Single = ((ab * ABC[5]) + (bc * ABC[1]) + (ac * ABC[3])) / (ab + bc + ac)
' Memorizza i gradi dell'angolo:
Private ang As Float
Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
Private f As Float[] = [0, 0.34, 0.67, 1]


Public Sub Form_Open()  

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With  

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.White
 End With

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Brush = .LinearGradient(0, 20, 15, 0, c, f)
' Imposta il fulcro/punto della rotazione - ad esempio - al centro dell'area di disegno:
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(ang))
   .LineWidth = 2.0
' Disegna il Triangolo.
' Siccome l'angolo ruota su se stesso, avendo come centro di rotazione il proprio "Incentro", ad ogni coordinata del punto, che costituisce un elemento del vettore del Metodo ".Polygon()", si sottrae il valore della corrispondente coordinata del punto dell'Incentro. In questo modo si farà coincidere l'angolo di rotazione con il "Incentro" del Triangolo.
' Non si devono modificare i valori né i segni dei quattro argomenti qui riportati.
   .Polygon([ABC[0] - ix, ABC[1] - iy, ABC[2] - ix, ABC[3] - iy, ABC[4] - ix, ABC[5] - iy])
   .Stroke 
   .End
 End With     

End


Public Sub Form_KeyPress()
  
 Select Case Key.Code
   Case Key.Up
     ang += 1
     If ang = 361 Then ang = 1
   Case Key.Down
     ang -= 1
     If ang = -361 Then ang = -1
 End Select
 
 DrawingArea1.Refresh
  
End


Public Sub Form_MouseWheel()

 ang += Mouse.Delta
 Select Case ang
   Case 361
     ang = 1
   Case -361
     ang = -1
 End Select

 DrawingArea1.Refresh

End


Public Sub Form_Resize()   ' Con questo evento se cambia la dimensione del Form, il disegno non va perso.

 DrawingArea1.Refresh
  
End


Note

[1] Vedere anche queste pagine: