Differenze tra le versioni di "Disegnare in una DrawingArea l'intersezione perpendicolare di due linee"
(14 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
Conoscendo le coordinate di due punti ("xa, ya" e "xb, yb") di una linea retta e quelle di un punto (xc, yc) di una seconda linea retta, si dovranno calcolare le coordinate (x, y) del punto di intersezione perpendicolare (90°) tra le due linee rette, nonché il [https://www.youmath.it/formulari/formulari-di-geometria-analitica/432-coefficiente-angolare.html coefficiente angolare]. | Conoscendo le coordinate di due punti ("xa, ya" e "xb, yb") di una linea retta e quelle di un punto (xc, yc) di una seconda linea retta, si dovranno calcolare le coordinate (x, y) del punto di intersezione perpendicolare (90°) tra le due linee rette, nonché il [https://www.youmath.it/formulari/formulari-di-geometria-analitica/432-coefficiente-angolare.html coefficiente angolare]. | ||
+ | <BR>Il calcolo del ''Coefficiente angolare'' non sarà necessario, se la prima linea di coordinate "xa,ya" e "xb, yb" sia perpendicolare all'asse delle Ascisse (e quindi parallela all'asse delle Ordinate). | ||
A tal fine si procederà come segue: | A tal fine si procederà come segue: | ||
Riga 33: | Riga 34: | ||
Poniamo in pratica quanto sopra esposto, usando il seguente codice, con il quale cliccando su una ''DrawingArea'' si imposteranno le due estremità di una una prima linea che verrà immediatamente disegnata. Successivamente si cliccherà su un altro punto nella ''DrawingArea'' per impostare le coordinate di un'estremità di una seconda linea. Il codice calcolerà le coordinate della seconda estremità di questa seconda linea, che coinciderà con il punto di intersezione perpendicolare (90°) tra la prima e la seconda linea. | Poniamo in pratica quanto sopra esposto, usando il seguente codice, con il quale cliccando su una ''DrawingArea'' si imposteranno le due estremità di una una prima linea che verrà immediatamente disegnata. Successivamente si cliccherà su un altro punto nella ''DrawingArea'' per impostare le coordinate di un'estremità di una seconda linea. Il codice calcolerà le coordinate della seconda estremità di questa seconda linea, che coinciderà con il punto di intersezione perpendicolare (90°) tra la prima e la seconda linea. | ||
Private DrawingArea1 As DrawingArea | Private DrawingArea1 As DrawingArea | ||
− | Private vertix As New | + | Private vertix As New Float[] |
− | Private x As | + | Private x As Float |
− | Private y As | + | Private y As Float |
− | + | Public Sub _new() | |
With Me | With Me | ||
Riga 46: | Riga 47: | ||
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 | ||
− | + | End | |
− | + | ||
+ | Public Sub DrawingArea1_Draw() | ||
If vertix.Count == 0 Then Return | If vertix.Count == 0 Then Return | ||
Riga 76: | Riga 76: | ||
.LineTo(x, y) | .LineTo(x, y) | ||
.Stroke | .Stroke | ||
− | + | Endif | |
.End | .End | ||
End With | End With | ||
− | + | End | |
− | |||
− | Dim m As | + | Public Sub DrawingArea1_MouseUp() |
+ | |||
+ | Dim m As Float | ||
<FONT Color=gray>' ''Sei il numero di elementi del "Vettore" è 6, allora lo azzera, per consentire un nuovo disegno:''</font> | <FONT Color=gray>' ''Sei il numero di elementi del "Vettore" è 6, allora lo azzera, per consentire un nuovo disegno:''</font> | ||
Riga 93: | Riga 94: | ||
If vertix.Count == 6 Then | If vertix.Count == 6 Then | ||
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Verifica se le coordinate dell'estremità della prima linea hanno il medesimo valore relativo all'Ascisse, ossia se i valori degli elementi di indice [0] e [2] sono uguali: la prima linea impostata è perpendicolare all'asse delle Ascisse. In tal caso le coordinate x,y dell'estremità della seconda linea, coincidente con il punto di intersezione saranno uguali rispettivamente al valore delle coordinate x della prima linea e al valore della coordinata y della estremità, impostata con il clic del mouse, della seconda linea. |
− | + | ' In questo caso, in cui la prima linea impostata è perpendicolare all'asse delle Ascisse, si evita di effettuare il calcolo del "coefficiente angolare", per impedire che sia sollevato un errore di "divisione per zero".''</font> | |
+ | If vertix[0] == vertix[2] Then | ||
+ | x = vertix[0] | ||
+ | y = vertix[5] | ||
+ | Else | ||
+ | <FONT Color=gray>' ''In quest'altra condizione calcola il coefficiente angolare:''</font> | ||
+ | <FONT Color=#B22222>'''m'''</font> = (vertix[3] - vertix[1]) / (vertix[2] - vertix[0]) | ||
<FONT Color=gray>' ''Ottiene i valori della "x" e della "y" della coordinata del punto di intersezione:''</font> | <FONT Color=gray>' ''Ottiene i valori della "x" e della "y" della coordinata del punto di intersezione:''</font> | ||
− | + | <FONT Color=#B22222>'''x'''</font> = (m ^ 2 * vertix[0] - m * vertix[1] + vertix[4] + m * vertix[5]) / (m ^ 2 + 1) | |
− | + | <FONT Color=#B22222>'''y'''</font> = m * (x - vertix[0]) + vertix[1] | |
+ | Endif | ||
Endif | Endif | ||
− | + | ||
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
− | + | End |
Versione attuale delle 11:38, 27 giu 2024
Conoscendo le coordinate di due punti ("xa, ya" e "xb, yb") di una linea retta e quelle di un punto (xc, yc) di una seconda linea retta, si dovranno calcolare le coordinate (x, y) del punto di intersezione perpendicolare (90°) tra le due linee rette, nonché il coefficiente angolare.
Il calcolo del Coefficiente angolare non sarà necessario, se la prima linea di coordinate "xa,ya" e "xb, yb" sia perpendicolare all'asse delle Ascisse (e quindi parallela all'asse delle Ordinate).
A tal fine si procederà come segue:
y - ya = m (x - xa) ---> y = m (x - xa) + ya 1 1 y - yc = ― ――― (x - xc) ---> y = ― ――― (x - xc) + yc m m 1 m (x - xa) + ya = ― ――― (x - xc) + yc m m² (x - xa) + m * ya = -1 (x - xc) + m * yc m² * x - m² * xa + m * ya = -x + xc + m * yc m² * x + x = m² * xa - m * ya + xc + m * yc x (m² + 1) = m² * xa - m * ya + xc + m * yc Si otterranno dunque: yb - ya m = ――――――――― (coefficiente angolare) xb - xa m² * xa - m * ya + xc + m * yc x = ―――――――――――――――――――――――――――――――― (coordinata x del punto d'intersezione) m² + 1 y = m (x - xa) + ya (coordinata y del punto d'intersezione)
Poniamo in pratica quanto sopra esposto, usando il seguente codice, con il quale cliccando su una DrawingArea si imposteranno le due estremità di una una prima linea che verrà immediatamente disegnata. Successivamente si cliccherà su un altro punto nella DrawingArea per impostare le coordinate di un'estremità di una seconda linea. Il codice calcolerà le coordinate della seconda estremità di questa seconda linea, che coinciderà con il punto di intersezione perpendicolare (90°) tra la prima e la seconda linea.
Private DrawingArea1 As DrawingArea Private vertix As New Float[] Private x As Float Private y As Float 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 DrawingArea1_Draw() If vertix.Count == 0 Then Return With Paint If vertix.Count < 4 Then ' Disegna soltanto il primo punto della prima linea: .Arc(vertix[0], vertix[1], 1.5, Rad(0), Rad(360)) .fill .End Return Endif .LineWidth = 1.5 ' Disegna la prima linea: .MoveTo(vertix[0], vertix[1]) .LineTo(vertix[2], vertix[3]) .Stroke If vertix.Count == 6 Then ' Disegna la seconda linea che interseca perpendicolarmente la prima linea: .Brush = .Color(Color.Red) .MoveTo(vertix[4], vertix[5]) .LineTo(x, y) .Stroke Endif .End End With End Public Sub DrawingArea1_MouseUp() Dim m As Float ' Sei il numero di elementi del "Vettore" è 6, allora lo azzera, per consentire un nuovo disegno: If vertix.Count == 6 Then vertix.Clear vertix.Push(Mouse.X) vertix.Push(Mouse.Y) If vertix.Count == 6 Then ' Verifica se le coordinate dell'estremità della prima linea hanno il medesimo valore relativo all'Ascisse, ossia se i valori degli elementi di indice [0] e [2] sono uguali: la prima linea impostata è perpendicolare all'asse delle Ascisse. In tal caso le coordinate x,y dell'estremità della seconda linea, coincidente con il punto di intersezione saranno uguali rispettivamente al valore delle coordinate x della prima linea e al valore della coordinata y della estremità, impostata con il clic del mouse, della seconda linea. ' In questo caso, in cui la prima linea impostata è perpendicolare all'asse delle Ascisse, si evita di effettuare il calcolo del "coefficiente angolare", per impedire che sia sollevato un errore di "divisione per zero". If vertix[0] == vertix[2] Then x = vertix[0] y = vertix[5] Else ' In quest'altra condizione calcola il coefficiente angolare: m = (vertix[3] - vertix[1]) / (vertix[2] - vertix[0]) ' Ottiene i valori della "x" e della "y" della coordinata del punto di intersezione: x = (m ^ 2 * vertix[0] - m * vertix[1] + vertix[4] + m * vertix[5]) / (m ^ 2 + 1) y = m * (x - vertix[0]) + vertix[1] Endif Endif DrawingArea1.Refresh End