Differenze tra le versioni di "Ruotare un triangolo in una DrawingArea"
(Creata pagina con "Mostriamo un possibile codice per far ruotare su se stesso, e più specificatamente <SPAN Style="text-decoration:underline">intorno al proprio ''[https://it.wikipedia.org/wiki...") |
|||
(4 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Mostriamo | + | Mostriamo due possibili codice per far ruotare su se stesso un Triangolo disegnato su una ''DrawingArea''. <SUP>[[[#Note|Nota 1]]]</sup> |
+ | |||
+ | ==Ruotare un Triangolo intorno al suo Baricentro== | ||
+ | Di seguito mostreremo un possibile codice per ruotare un Triangolo intorno al suo <SPAN Style="text-decoration:underline">''[https://it.wikipedia.org/wiki/Baricentro_(geometria) Baricentro]''</span>. | ||
<BR>La rotazione del triangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse. | <BR>La rotazione del triangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse. | ||
<BR>Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza. | <BR>Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza. | ||
Riga 6: | Riga 9: | ||
Private ABC As Single[] = [0, 0, 200, 0, 100, 300] | Private ABC As Single[] = [0, 0, 200, 0, 100, 300] | ||
<FONT Color=gray>' ''Calcoli per ottenere il "Baricentro" del triangolo:''</font> | <FONT Color=gray>' ''Calcoli per ottenere il "Baricentro" del triangolo:''</font> | ||
− | Private | + | Private xb As Single = (ABC[0] + ABC[2] + ABC[4]) / 3 |
− | Private | + | Private yb As Single = (ABC[1] + ABC[3] + ABC[5]) / 3 |
<FONT Color=gray>' ''Memorizza i gradi dell'angolo:''</font> | <FONT Color=gray>' ''Memorizza i gradi dell'angolo:''</font> | ||
Private ang As Float | 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 | With Paint | ||
Riga 38: | Riga 41: | ||
.LineWidth = 2.0 | .LineWidth = 2.0 | ||
<FONT Color=gray>' ''Disegna il Triangolo.'' | <FONT Color=gray>' ''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.'' | + | ' ''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.''</font> | ' ''Non si devono modificare i valori né i segni dei quattro argomenti qui riportati.''</font> | ||
− | .Polygon([ABC[0] - | + | .Polygon([ABC[0] - xb, ABC[1] - yb, ABC[2] - xb, ABC[3] - yb, ABC[4] - xb, ABC[5] - yb]) |
.Stroke | .Stroke | ||
.End | .End | ||
End With | End With | ||
− | + | End | |
+ | |||
− | + | Public Sub Form_KeyPress() | |
Select Case Key.Code | Select Case Key.Code | ||
Riga 60: | Riga 64: | ||
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
− | + | End | |
+ | |||
− | + | Public Sub Form_MouseWheel() | |
ang += Mouse.Delta | ang += Mouse.Delta | ||
Riga 74: | 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> | ||
+ | |||
+ | DrawingArea1.Refresh | ||
+ | |||
+ | End | ||
+ | |||
+ | ==Ruotare un Triangolo intorno al suo Incentro== | ||
+ | Quest'altro codice servirà per far ruotare un Triangolo intorno al suo <SPAN Style="text-decoration:underline">''[https://it.wikipedia.org/wiki/Incentro Incentro]''</span>. | ||
+ | <BR>La rotazione del triangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse. | ||
+ | <BR>Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza. | ||
+ | Private DrawingArea1 As DrawingArea | ||
+ | <FONT Color=gray>' ''Imposta le coordinate dei tre vertici del triangolo, con il primo vertice nel punto di rotazione (0, 0):''</font> | ||
+ | Private ABC As Single[] = [0, 0, 200, 0, 100, 300] | ||
+ | <FONT Color=gray>' ''Calcola la [https://www.youmath.it/formulari/formulari-di-geometria-analitica/426-distanza-tra-due-punti-nel-piano.html distanza euclidea] fra due punti, per ottenere la lunghezza di ciascun lato del triangolo:''</font> | ||
+ | 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)) | ||
+ | <FONT Color=gray>' ''Calcoli per ottenere il "Incentro" del triangolo:''</font> | ||
+ | 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) | ||
+ | <FONT Color=gray>' ''Memorizza i gradi dell'angolo:''</font> | ||
+ | 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) | ||
+ | <FONT Color=gray>' ''Imposta il fulcro/punto della rotazione - ad esempio - al centro dell'area di disegno:''</font> | ||
+ | .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) | ||
+ | .Rotate(Rad(ang)) | ||
+ | .LineWidth = 2.0 | ||
+ | <FONT Color=gray>' ''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.''</font> | ||
+ | .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() <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno non va perso.''</font> | ||
+ | |||
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
− | + | End | |
Riga 86: | Riga 183: | ||
=Note= | =Note= | ||
[1] Vedere anche queste pagine: | [1] Vedere anche queste pagine: | ||
− | * [[ | + | * [[Ruotare un cerchio disegnato in una DrawingArea]] |
− | * [[ | + | * [[Ruotare un quadrato ed un rettangolo in una DrawingArea]] |
− | * [[ | + | * [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]] |
− | * [[ | + | * [[Ruotare una immagine sul proprio asse centrale]] |
Versione attuale delle 04: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: