Disegnare in una DrawingArea l'intersezione perpendicolare di due linee
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.
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 Single[]
Private x As Single
Private y As Single
Public Sub _new()
With Me
.W = Screen.AvailableWidth
.H = Screen.AvailableHeight
.Arrangement = Arrange.Fill
End With
With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
.W = 0
.Y = 0
.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 Single
' 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
' Ottiene 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
DrawingArea1.Refresh
End