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 mellékelt példában az ellipszist egy TShape komponens segítségével szemléltetjük. A Form OnCreate eseményében, a Shape1 objektum alapján feljegyezzük 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.
procedure TForm1.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 FEllipseWidth>=FEllipseHeight then begin
c:=FEllipseWidth/2;
b:=FEllipseHeight/2;
a:=Sqrt(Sqr(c)-Sqr(b));
F1.x:=FEllipseCenterX-Round(a);
F1.y:=FEllipseCenterY;
F2.x:=FEllipseCenterX+Round(a);
F2.y:=FEllipseCenterY;
FMaxDistance:=FEllipseWidth;
end
Az ellipszis körvonalát jellemző állandót feljegyezzük az FMaxDistance 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.
function IsCursorInEllipse: Boolean;
Ha létrehozunk egy példányt a TMouse osztályból, akkor annak CursorPos property-jéből mindig kiolvashatjuk az egér aktuális helyét, képernyő koordinátákban. Ezt a koordinátát a ScreenToClient metódus segítségével átalakíthatjuk a Form-unkon használt koordinátává.
p:=ScreenToClient(Mouse.CursorPos);
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 FMaxDistance-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:=Sqrt(Sqr(F1.x-p.x)+Sqr(F1.y-p.y));
Az előbb kiszámított távolság + a pont és F2 távolsága.
Distance:=Distance+Sqrt(Sqr(F2.x-p.x)+Sqr(F2.y-p.y));
Ha felülírjuk a WndProc metódust, akkor mi kezelhetjük a Form összes üzenetét.
procedure WndProc(var Message: TMessage); override;
Számunkra a WM_MOUSEMOVE, azaz az egérelmozdulásnak van jelentősége.
if Message.Msg=WM_MOUSEMOVE then begin
if IsCursorInEllipse then
FLastMousePos:=Mouse.CursorPos
else begin
Mouse.CursorPos:=FLastMousePos;
...
Ilyenkor mindig megnézzük az egér jelenlegi helyét. Az egér előző koordinátáit az FLastMousePos 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.