Spostare con il mouse un triangolo in una DrawingArea
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_Activate() ' 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.