Spostare con il mouse un triangolo in una DrawingArea

Da Gambas-it.org - Wikipedia.

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"
   .X = 0
   .Y = 0
   .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.