Differenze tra le versioni di "Disegnare in una DrawingArea l'intersezione perpendicolare di due linee"

Da Gambas-it.org - Wikipedia.
Riga 33: Riga 33:
 
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 Single[]
+
  Private vertix As New Float[]
  Private x As Single
+
  Private x As Float
  Private y As Single
+
  Private y As Float
 
   
 
   
 
   
 
   
Riga 84: Riga 84:
 
  '''Public''' Sub DrawingArea1_MouseUp()
 
  '''Public''' Sub DrawingArea1_MouseUp()
 
   
 
   
   Dim m As Single
+
   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 93:
 
    
 
    
 
   If vertix.Count == 6 Then
 
   If vertix.Count == 6 Then
  <FONT Color=gray>' ''Ottiene il coefficiente angolare.''</font>
+
  <FONT Color=gray>' ''Ottiene il coefficiente angolare.
     <FONT Color=#B22222>'''m'''</font> = (vertix[3] - vertix[1]) / (vertix[2] - vertix[0])
+
' Si aggiunge un piccolissimo valore al 1° vettore del divisore, per impedire che sia sollevato un errore di "divisione per zero", qualora i valori degli elementi di indice [0] e [2] siano uguali.</font>
 +
     <FONT Color=#B22222>'''m'''</font> = (vertix[3] - vertix[1]) / ((vertix[2] + 1E-10) - 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>'''x'''</font> = (m ^ 2 * vertix[0] - m * vertix[1] + vertix[4] + m * vertix[5]) / (m ^ 2 + 1)

Versione delle 22:40, 15 nov 2021

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 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"
   .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 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
' Ottiene il coefficiente angolare.
' Si aggiunge un piccolissimo valore al 1° vettore del divisore, per impedire che sia sollevato un errore di "divisione per zero", qualora i valori degli elementi di indice [0] e [2] siano uguali.
   m = (vertix[3] - vertix[1]) / ((vertix[2] + 1E-10) - 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