Differenze tra le versioni di "Spostare con il mouse un triangolo in una DrawingArea"

Da Gambas-it.org - Wikipedia.
 
Riga 11: Riga 11:
 
  Private dif As Short[]
 
  Private dif As Short[]
 
   
 
   
  '''Public''' Sub _new()
+
   
 +
Public Sub _new()
 
   
 
   
 
   With Me
 
   With Me
Riga 22: Riga 23:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Form_Arrange()
+
  Public Sub Form_Arrange()
 
   
 
   
 
  <FONT Color=gray Size=2>' '''Coord.      X1                  Y1                    X2                    Y2                    X3                    Y3'''
 
  <FONT Color=gray Size=2>' '''Coord.      X1                  Y1                    X2                    Y2                    X3                    Y3'''
Riga 33: Riga 35:
 
   area = AreaTriangolo(ABC)
 
   area = AreaTriangolo(ABC)
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseDown()
+
  Public Sub DrawingArea1_MouseDown()
 
   
 
   
 
   Dim s1, s2, s3 As Single
 
   Dim s1, s2, s3 As Single
Riga 57: Riga 60:
 
   dif[5] = ABC[5] - Mouse.Y
 
   dif[5] = ABC[5] - Mouse.Y
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseMove()
+
   
 +
Public Sub DrawingArea1_MouseMove()
 
   
 
   
 
   If Not Object.IsValid(dif) Then Return  
 
   If Not Object.IsValid(dif) Then Return  
Riga 74: Riga 78:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseUp()
+
   
 +
Public Sub DrawingArea1_MouseUp()
 
   
 
   
 
  <FONT Color=gray>' ''Distrugge l'Oggetto array assegnandogli il valore "Null":''</font>
 
  <FONT Color=gray>' ''Distrugge l'Oggetto array assegnandogli il valore "Null":''</font>
Riga 83: Riga 88:
 
   DrawingArea1.Mouse = Mouse.Default
 
   DrawingArea1.Mouse = Mouse.Default
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
   
 +
Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 94: Riga 100:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Private''' Function AreaTriangolo(tria As Integer[]) As Single
+
  Private Function AreaTriangolo(tria As Integer[]) As Single
 
   
 
   
 
  <FONT Color=gray>' ''Calcola il "Determinante" delle coordinate della figura del triangolo:''</font>
 
  <FONT Color=gray>' ''Calcola il "Determinante" delle coordinate della figura del triangolo:''</font>
 
   Return CSingle(Abs((tria[4] * tria[3] + tria[5] * tria[0] + 1 * tria[2] * tria[1]) - (tria[0] * tria[3] + tria[1] * tria[4] + tria[2] * tria[5]))) / 2
 
   Return CSingle(Abs((tria[4] * tria[3] + tria[5] * tria[0] + 1 * tria[2] * tria[1]) - (tria[0] * tria[3] + tria[1] * tria[4] + tria[2] * tria[5]))) / 2
 
   
 
   
  '''End'''
+
  End
  
  

Versione attuale delle 14:56, 27 giu 2024

Il presente caso è quello in cui si intende spostare un qualunque Triangolo, disegnato in una DrawingArea, soltanto qualora si clicchi con il puntatore del mouse all'interno della figura del predetto Triangolo.

Definito "ABC" il Triangolo disegnato nella DrawingArea, e chiamato "D" il punto ove si è cliccato con il puntatore del mouse, per sapere se si è cliccato all'interno del Triangolo, si procederà nel modo seguente:
1) si calcola l'area del Triangolo ABC e quella di ciascun singolo Triangolo formato dai vertici: "ABD", "BCD" e "ACD", mediante il calcolo del Determinante delle coordinate dei tre vertici [Nota 1] del Triangolo in questione;
2) se la somma delle aree dei triangoli "ABD", "BCD" e "ACD" è maggiore dell'area del Triangolo ABC, disegnato nella DrawingArea, allora il punto - su cui si è cliccato con il puntatore del mouse - è esterno al Triangolo "ABC".

Mostriamo un esempio pratico per spostare il Triangolo disegnato nella DrawingArea, qualora si clicchi al suo interno con il puntatore del mouse.

Private DrawingArea1 As DrawingArea
Private ABC As Integer[]
Private area As Single
Private dif As Short[]


Public Sub _new()

 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 Form_Arrange()

' Coord.       X1                   Y1                    X2                    Y2                    X3                    Y3
' Indice:       0                    1                     2                     3                     4                     5
 ABC = [DrawingArea1.W * 0.4, DrawingArea1.H * 0.5, DrawingArea1.W * 0.6, DrawingArea1.H * 0.4, DrawingArea1.W * 0.8, DrawingArea1.H * 0.6]

' Va a calcolare l'area del Triangolo "ABC", passando alla funzione le coordinate dei vertici del triangolo:
 area = AreaTriangolo(ABC)

End


Public Sub DrawingArea1_MouseDown()

 Dim s1, s2, s3 As Single

' Calcola l'area del triangolo formato dai vertici "ABD" (D è il punto ove si è cliccato con il mouse):
 s1 = AreaTriangolo([ABC[0], ABC[1], ABC[2], ABC[3], Mouse.X, Mouse.Y])
' Calcola l'area del triangolo formato dai vertici "BCD" (D è il punto ove si è cliccato con il mouse):
 s2 = AreaTriangolo([ABC[2], ABC[3], ABC[4], ABC[5], Mouse.X, Mouse.Y])
' Calcola l'area del triangolo formato dai vertici "ACD" (D è il punto ove si è cliccato con il mouse):
 s3 = AreaTriangolo([ABC[0], ABC[1], ABC[4], ABC[5], Mouse.X, Mouse.Y])

' Verifica se è stato cliccato all'interno del Triangolo:
 If (s1 + s2 + s3) > area Then Return 

 dif = New Short[6]
 dif[0] = ABC[0] - Mouse.X
 dif[2] = ABC[2] - Mouse.X
 dif[4] = ABC[4] - Mouse.X
 dif[1] = ABC[1] - Mouse.Y
 dif[3] = ABC[3] - Mouse.Y
 dif[5] = ABC[5] - Mouse.Y

End


Public Sub DrawingArea1_MouseMove()

 If Not Object.IsValid(dif) Then Return 

 ABC[0] = Mouse.X + dif[0]
 ABC[2] = Mouse.X + dif[2] 
 ABC[4] = Mouse.X + dif[4]
 ABC[1] = Mouse.Y + dif[1]
 ABC[3] = Mouse.Y + dif[3]
 ABC[5] = Mouse.Y + dif[5]
 With DrawingArea1
   .Mouse = 18
   .Refresh
 End With

End


Public Sub DrawingArea1_MouseUp()

' Distrugge l'Oggetto array assegnandogli il valore "Null":
 dif = Null

 DrawingArea1.Mouse = Mouse.Default

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Brush = .Color(Color.Red)
   .Polygon(ABC)
   .Stroke          ' Se si preferisce un triangolo "pieno", usare il Metodo ".Fill"
   .End
 End With

End


Private Function AreaTriangolo(tria As Integer[]) As Single

' Calcola il "Determinante" delle coordinate della figura del triangolo:
 Return CSingle(Abs((tria[4] * tria[3] + tria[5] * tria[0] + 1 * tria[2] * tria[1]) - (tria[0] * tria[3] + tria[1] * tria[4] + tria[2] * tria[5]))) / 2

End


Note

[1] La formula per il Determinante è la seguente:

         1  |      ⎡x₁ y₁ 1⎤ |
area =  ‒―‒ | det. ⎜x₂ y₂ 1⎥ |
         2  |      ⎣x₃ y₃ 1⎦ |

che si sviluppa come segue:

         1   |                                                                                     |
area =  ‒―‒ ·|(x₃ · y₂ · 1 + y₃ · 1 · x₁ + 1 · x₂ · y₁) - (x₁ · y₂ · 1 + y₁ · 1 · x₃ + x₂ · y₃ · 1)|
         2   |                                                                                     |

laddove:
x₁ y₁ sono le coordinate del primo vertice;
x₂ y₂ sono le coordinate del secondo vertice;
x₃ y₃ sono le coordinate del terzo vertice.