Differenze tra le versioni di "Spostare con il mouse un'ellisse in una DrawingArea"
Da Gambas-it.org - Wikipedia.
(5 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Nel seguente esempio si potrà spostare con il mouse sulla superficie di una ''DrawingArea'' un'ellisse precedentemente disegnata. <SUP>[[[#Note| | + | Nel seguente esempio si potrà spostare con il mouse sulla superficie di una ''DrawingArea'' un'ellisse precedentemente disegnata. <SUP>[[[#Note|nota 1]]]</sup> |
+ | |||
+ | 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 | + | Private Const ASSE_MAGGIORE As Float = 200.0 |
− | Private Const | + | Private Const ASSE_MINORE As Float = 100.0 |
Private x As Short | Private x As Short | ||
Private y As Short | Private y As Short | ||
Riga 8: | Riga 10: | ||
Private dify As Short | Private dify As Short | ||
− | + | ||
+ | Public Sub _new() | ||
With Me | With Me | ||
Riga 16: | Riga 19: | ||
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 Form_Arrange() | ||
+ | |||
+ | <FONT Color=gray>' ''Il centro dell'ellisse è posto - ad esempio - al centro della DrawingArea:''</font> | ||
+ | |||
+ | x = (DrawingArea1.W / 2) - (ASSE_MAGGIORE / 2) <FONT Color=gray>' ''Estremità destra dell'Asse Maggiore''</font> | ||
+ | y = (DrawingArea1.H / 2) - (ASSE_MINORE / 2) <FONT Color=gray>' ''Estremità visualmente superiore dell'Asse Minore''</font> | ||
+ | |||
+ | End | ||
− | |||
− | + | Public Sub DrawingArea1_MouseDown() | |
− | |||
− | + | Dim a, b, fuo, f1x, f2x, ct1, ct2, ct3, ipo1, ipo2 As Single | |
− | + | a = ASSE_MAGGIORE / 2 <FONT Color=gray>' ''Il semi-asse maggiore''</font> | |
+ | b = ASSE_MINORE / 2 <FONT Color=gray>' ''Il semi-asse minore''</font> | ||
+ | fuo = Sqr((a ^ 2) - (b ^ 2)) <FONT Color=gray>' ''Distanza di ciascun fuoco dell'ellisse dal centro''</font> | ||
+ | f1x = (x + (ASSE_MAGGIORE / 2)) - fuo <FONT Color=gray>' ''Coordinata x del fuoco sul semi-asse di sinistra''</font> | ||
+ | f2x = (x + (ASSE_MAGGIORE / 2)) + fuo <FONT Color=gray>' ''Coordinata x del fuoco sul semi-asse di destra''</font> | ||
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Calcola la distanza dei segmenti da ciascun fuoco al punto cliccato con il mouse:''</font> |
− | + | 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)) | ||
+ | |||
+ | <FONT Color=gray>' ''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:''</font> | ||
+ | If ipo1 + ipo2 > ASSE_MAGGIORE Then Return | ||
difx = x - Mouse.X | difx = x - Mouse.X | ||
dify = y - Mouse.Y | dify = y - Mouse.Y | ||
− | |||
− | |||
− | + | End | |
+ | |||
+ | |||
+ | 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 52: | Riga 73: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub DrawingArea1_MouseUp() | ||
difx = -1 | difx = -1 | ||
DrawingArea1.Mouse = Mouse.Default | DrawingArea1.Mouse = Mouse.Default | ||
− | + | End | |
+ | |||
− | + | Public Sub DrawingArea1_Draw() | |
With Paint | With Paint | ||
− | .Ellipse(x, y, | + | .Ellipse(x, y, ASSE_MAGGIORE, ASSE_MINORE, Rad(0), Rad(360), False) |
.Stroke | .Stroke | ||
.End | .End | ||
End With | End With | ||
− | + | End | |
Riga 75: | Riga 98: | ||
=Note= | =Note= | ||
[1] Vedere anche: | [1] Vedere anche: | ||
− | <BR> - [[ | + | <BR> - [[Spostare con il mouse un rettangolo in una DrawingArea]] |
− | <BR> - [[ | + | <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