C# - Egér mozgásának korlátozása egy ellipszis területére

forráskód letöltése
Ebben a példában azzal foglalkozunk, hogy miként lehet az egérkurzor mozgását alkalmazásunk egy adott területére korlátozni. A feladatot nehezíti, hogy ez a terület nem téglalap, hanem ellipszis alakú.
Az ellipszis körvonala olyan pontok halmaza a síkban, amelyek két megadott ponttól egyenlő távolságra vannak. Az ellipszisnek van két fókuszpontja, F1 és F2. Ha vesszük a körvonal bármely pontját, és megmérjük annak F1-től mért távolságát, majd hozzáadjuk az F2-től mért távolságát, akkor egy állandó számot kapunk.
A Form Load eseményében megadjuk az ellipszis középpontjának, szélességének és magasságának adatait.
A CalculateEllipsePoints függvény segítségével, a feljegyzett adatokból meghatározzuk az ellipszis két fókuszpontját és azt az állandót, amely az ellipszis körvonalát jellemzi.
private void CalculateEllipsePoints()
A számítási művelet elvégzésénél különbséget kell tennünk a fekvő és az álló ellipszisek között. Az első esetben az ellipszis vízszintes tengelye, míg a másodiknál a függőleges tengely a hosszabb. A fókuszpontok mindig a hosszabb tengelyen helyezkednek el.
A fókuszpontok koordinátáinak kiszámolásához a Pitagorasz tételt használhatjuk.
if (ellipseWidth >= ellipseHeight)
{
  c = ellipseWidth /2;
  b = ellipseHeight /2;
  a = System.Math.Sqrt(System.Math.Pow(c, 2) - System.Math.Pow(b, 2));
  f1.X = ellipseCenterX - (int)a;
  f1.Y = ellipseCenterY;
  f2.X = ellipseCenterX + (int)a;
  f2.Y = ellipseCenterY;
  maxDistance = ellipseWidth;
}
Az ellipszis körvonalát jellemző állandót feljegyezzük a maxDistance változóba. Ez az érték megegyezik az ellipszis hosszabbik tengelyének méretével.
Az IsCursorInEllipse függvény segítségével eldönthetjük, hogy az egér éppen az ellipszis területén tartózkodik-e.
private bool IsMouseInEllipse()
Le kell kérdeznünk az egér aktuális pozícióját, majd a kapott pontot át kell alakítanunk a Form1-hez viszonyított koordinátákká.
Point p = PointToClient(Cursor.Position);
Ha a lekérdezett pont és az F1 fókuszpont távolságának, valamint a pont és az F2 fókuszpont távolságának összege kisebb vagy egyenlő, mint az maxDistance-ban letárolt érték, akkor az adott pont az ellipszis területén található.
A távolság megméréséhez a koordinátageometriában használt két pont távolsága képletet használjuk fel.
A pont és F1 távolsága.
distance = System.Math.Sqrt(System.Math.Pow(f1.X - p.X, 2) + System.Math.Pow(f1.Y - p.Y, 2));
Az előbb kiszámított távolság + a pont és F2 távolsága.
distance += System.Math.Sqrt(System.Math.Pow(f2.X - p.X, 2) + System.Math.Pow(f2.Y - p.Y, 2));
A Form1 MouseMove eseményében figyeljük az egér elmozdulását. Ha az egér elmozdul, ellenőriznünk kell, hogy az ellipszis területén maradt-e.
Ilyenkor mindig megnézzük az egér jelenlegi helyét. Az egér előző koordinátáit az lastMousePos változóban tároljuk el. Ha a felhasználó kihúzza az egeret az ellipszis területéről, akkor azt azonnal visszaküldjük az előző helyére.