Differenze tra le versioni di "Spostare con il mouse un'ellisse in una DrawingArea"

Da Gambas-it.org - Wikipedia.
 
Riga 1: Riga 1:
Nel seguente esempio si potrà spostare con il mouse sulla superficie di una ''DrawingArea'' un'ellisse precedentemente disegnata. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
Nel seguente esempio si potrà spostare con il mouse sulla superficie di una ''DrawingArea'' un'ellisse precedentemente disegnata. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
Per sapere se il punto cliccato con il mouse è <SPAN Style="text-decoration:underline">esterno</span> all'ellisse, si verificherà se la somma delle distanze dei Fuochi dell'ellisse dal punto cliccato è <SPAN Style="text-decoration:underline">superiore</span> alla somma costante delle distanze dei predetti Fuochi da qualsiasi punto ''appartenente'' all'ellisse.  
+
Per sapere se il punto cliccato con il mouse è <U>esterno</u> all'ellisse, si verificherà se la somma delle distanze dei Fuochi dell'ellisse dal punto cliccato è <SPAN Style="text-decoration:underline">superiore</span> alla somma costante delle distanze dei predetti Fuochi da qualsiasi punto ''appartenente'' all'ellisse.  
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private Const ASSE_MAGGIORE As Float = 200.0
 
  Private Const ASSE_MAGGIORE As Float = 200.0
Riga 10: Riga 10:
 
  Private dify As Short
 
  Private dify As Short
 
   
 
   
  '''Public''' Sub _new()
+
   
 +
Public Sub _new()
 
   
 
   
 
   With Me
 
   With Me
Riga 21: Riga 22:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Form_Arrange()
+
   
 +
Public Sub Form_Arrange()
 
   
 
   
 
  <FONT Color=gray>' ''Il centro dell'ellisse è posto - ad esempio - al centro della DrawingArea:''</font>
 
  <FONT Color=gray>' ''Il centro dell'ellisse è posto - ad esempio - al centro della DrawingArea:''</font>
Riga 30: Riga 32:
 
   y = (DrawingArea1.H / 2) - (ASSE_MINORE / 2)    <FONT Color=gray>' ''Estremità visualmente superiore dell'Asse Minore''</font>
 
   y = (DrawingArea1.H / 2) - (ASSE_MINORE / 2)    <FONT Color=gray>' ''Estremità visualmente superiore dell'Asse Minore''</font>
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseDown()
+
  Public Sub DrawingArea1_MouseDown()
 
   
 
   
 
   Dim a, b, fuo, f1x, f2x, ct1, ct2, ct3, ipo1, ipo2 As Single
 
   Dim a, b, fuo, f1x, f2x, ct1, ct2, ct3, ipo1, ipo2 As Single
Riga 55: Riga 58:
 
   dify = y - Mouse.Y
 
   dify = y - Mouse.Y
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseMove()
+
  Public Sub DrawingArea1_MouseMove()
 
   
 
   
 
  <FONT Color=gray>' ''Se il punto, ove si è cliccato con il mouse è esterno al rettangolo di selezione dell'ellisse, allora la variabile "difx" non ha cambiato il valore assegnatogli dall'ultimo Evento "_MouseUp()":''</font>
 
  <FONT Color=gray>' ''Se il punto, ove si è cliccato con il mouse è esterno al rettangolo di selezione dell'ellisse, allora la variabile "difx" non ha cambiato il valore assegnatogli dall'ultimo Evento "_MouseUp()":''</font>
Riga 69: Riga 73:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseUp()
+
   
 +
Public Sub DrawingArea1_MouseUp()
 
   
 
   
 
   difx = -1
 
   difx = -1
 
   DrawingArea1.Mouse = Mouse.Default
 
   DrawingArea1.Mouse = Mouse.Default
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 86: Riga 92:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 92: Riga 98:
 
=Note=
 
=Note=
 
[1] Vedere anche:
 
[1] Vedere anche:
<BR> - [[Spostare_con_il_mouse_un_rettangolo_in_una_DrawingArea|Spostare con il mouse un rettangolo in una DrawingArea]]
+
<BR> - [[Spostare con il mouse un rettangolo in una DrawingArea]]
<BR> - [[Spostare_con_il_mouse_un_cerchio_in_una_DrawingArea|Spostare con il mouse un cerchio in una DrawingArea]]
+
<BR> - [[Spostare con il mouse un cerchio in una DrawingArea]]

Versione attuale delle 14:58, 27 giu 2024

Nel seguente esempio si potrà spostare con il mouse sulla superficie di una DrawingArea un'ellisse precedentemente disegnata. [nota 1]

Per sapere se il punto cliccato con il mouse è esterno all'ellisse, si verificherà se la somma delle distanze dei Fuochi dell'ellisse dal punto cliccato è superiore alla somma costante delle distanze dei predetti Fuochi da qualsiasi punto appartenente all'ellisse.

Private DrawingArea1 As DrawingArea
Private Const ASSE_MAGGIORE As Float = 200.0
Private Const ASSE_MINORE As Float = 100.0
Private x As Short
Private y As Short
Private difx As Short = -1
Private dify 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()

' Il centro dell'ellisse è posto - ad esempio - al centro della DrawingArea:

 x = (DrawingArea1.W / 2) - (ASSE_MAGGIORE / 2)  ' Estremità destra dell'Asse Maggiore
 y = (DrawingArea1.H / 2) - (ASSE_MINORE / 2)    ' Estremità visualmente superiore dell'Asse Minore

End


Public Sub DrawingArea1_MouseDown()

 Dim a, b, fuo, f1x, f2x, ct1, ct2, ct3, ipo1, ipo2 As Single

 a = ASSE_MAGGIORE / 2                   ' Il semi-asse maggiore
 b = ASSE_MINORE / 2                     ' Il semi-asse minore
 fuo = Sqr((a ^ 2) - (b ^ 2))            ' Distanza di ciascun fuoco dell'ellisse dal centro
 f1x = (x + (ASSE_MAGGIORE / 2)) - fuo   ' Coordinata x del fuoco sul semi-asse di sinistra
 f2x = (x + (ASSE_MAGGIORE / 2)) + fuo   ' Coordinata x del fuoco sul semi-asse di destra

' Calcola la distanza dei segmenti da ciascun fuoco al punto cliccato con il mouse:
 ct1 = Abs(f1x - Mouse.X)
 ct2 = Abs((y + (ASSE_MINORE / 2)) - Mouse.Y)
 ipo1 = Sqr((ct1 ^ 2) + (ct2 ^ 2))
 ct3 = Abs(f2x - Mouse.X)
 ipo2 = Sqr((ct2 ^ 2) + (ct3 ^ 2))

' Se la somma dei due segmenti che uniscono ciascun fuoco con il punto cliccato con il mouse è maggiore dell'Asse Maggiore, allora vuol dire che il punto è esterno all'ellisse, e si esce dalla routine:
 If ipo1 + ipo2 > ASSE_MAGGIORE Then Return

 difx = x - Mouse.X
 dify = y - Mouse.Y

End


Public Sub DrawingArea1_MouseMove()

' Se il punto, ove si è cliccato con il mouse è esterno al rettangolo di selezione dell'ellisse, allora la variabile "difx" non ha cambiato il valore assegnatogli dall'ultimo Evento "_MouseUp()":
 If difx == -1 Then Return

 x = Mouse.X + difx
 y = Mouse.Y + dify
 With DrawingArea1
   .Mouse = 18
   .Refresh
 End With

End


Public Sub DrawingArea1_MouseUp()

 difx = -1
 DrawingArea1.Mouse = Mouse.Default

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Ellipse(x, y, ASSE_MAGGIORE, ASSE_MINORE, Rad(0), Rad(360), False)
   .Stroke
   .End
 End With

End


Note

[1] Vedere anche:
- Spostare con il mouse un rettangolo in una DrawingArea
- Spostare con il mouse un cerchio in una DrawingArea