Differenze tra le versioni di "Spostare con il mouse un triangolo in una DrawingArea"
(Creata pagina con "Il presente caso è quello in cui si intende spostare un qualunque Triangolo, disegnato in una ''DrawingArea'', <SPAN Style="text-decoration:underline>soltanto</span> qualora...") |
|||
(2 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
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'<SPAN Style="text-decoration:underline>interno</span> del Triangolo, si procederà nel modo seguente: | 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'<SPAN Style="text-decoration:underline>interno</span> del Triangolo, si procederà nel modo seguente: | ||
− | <BR>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 [https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/767-calcolo-del-determinante.html Determinante] delle coordinate dei tre vertici del Triangolo in questione; | + | <BR>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 [https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/767-calcolo-del-determinante.html Determinante] delle coordinate dei tre vertici <SUP>[[[#Note|Nota 1]]]</sup> del Triangolo in questione; |
<BR>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 - è <SPAN Style="text-decoration:underline>esterno</span> al Triangolo "ABC". | <BR>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 - è <SPAN Style="text-decoration:underline>esterno</span> al Triangolo "ABC". | ||
Riga 19: | Riga 19: | ||
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 | ||
Riga 26: | Riga 24: | ||
'''End''' | '''End''' | ||
− | '''Public''' Sub | + | '''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 104: | Riga 102: | ||
'''End''' | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] La formula per il ''Determinante'' è la seguente:<FONT Color=#B22222> | ||
+ | 1 | ⎡x₁ y₁ 1⎤ | | ||
+ | area = ‒―‒ | det. ⎜x₂ y₂ 1⎥ | | ||
+ | 2 | ⎣x₃ y₃ 1⎦ |</font> | ||
+ | |||
+ | 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: | ||
+ | <BR>x₁ y₁ sono le coordinate del primo vertice; | ||
+ | <BR>x₂ y₂ sono le coordinate del secondo vertice; | ||
+ | <BR>x₃ y₃ sono le coordinate del terzo vertice. |
Versione attuale delle 22:22, 3 gen 2022
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.