Spostare con il mouse un'ellisse in una DrawingArea
Vai alla navigazione
Vai alla ricerca
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 della distanza dei due segmenti, che uniscono ciascun Fuoco dell'ellisse al punto cliccato, è superiore alla somma costante delle distanze 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