Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Prüfen ob auf einen Kreis geklickt wurde (https://www.delphipraxis.net/148041-pruefen-ob-auf-einen-kreis-geklickt-wurde.html)

KahPee 21. Feb 2010 09:48


Prüfen ob auf einen Kreis geklickt wurde
 
Hallo,

ich habe ein Zeichenprogramm bei dem verschiedene geometrische Objekte gezeichnet werden. Unter anderem werden Kreise gezeichnet. Die Einzigen Informationen die ich über den Kreis zur Verfügung habe sind Mittelpunkt und ein beliebiger Punkt auf dem Kreisbogen. Mittels dieser Informationen wird im Verlauf des Programms auch der Kreis gezeichnet (Radius wird ermittelt und dann angepasst mit canvas.ellipse). Das Problem das ich jetzt habe ist folgendes:
Wenn man mit der Maus auf die Zeichenfläche klickt soll überprüft werden ob auf den Kreis geklickt wurde.Dazu müsste ich ja im Prinzip erstmal jeden einzelnen Pixel des Kreisbogen berechnen (bzw. ein Viertel [achtel wäre auch möglich] und dann über Spiegelungen) und in ein Array schreiben. Oder gibt es da einen geschickteren Weg?

Bei anderen geometrischen Figuren (Rechteck, Linie [f(x)=m*x+b]) gestaltet sich das ganze ja etwas einfacher.

mfg KahPee

SirThornberry 21. Feb 2010 09:52

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Ich glaube so kompliziert muss es gar nicht sein. Du weißt den Mittelpunkt vom Kreis und hoffentlich auch den Radius des Kreises. Wenn jetzt jemand auf die Zeichenfläche klickt brauchst du nur die Entfernung zwischen Klickpunkt und Mittelpunkt des Kreises berechnen und prüfen ob diese Strecke kleiner oder gleich dem Radius des Kreises ist.

KahPee 21. Feb 2010 09:58

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Hey genau so eine Idee hab ich gesucht ;) das macht echt vieles einfacher!! Auch ermöglicht diese Variante eine gewisse Toleranz (wenn man nicht genau auf den Kreisbogen klickt sondern knapp daneben. Ich denke mal, dass die Variante auch schneller ist als mit f(x)=sqrt(radius^2-x^2) [für x=0 bis x=rad] alle Pixel zu errechnen.
Bei dem Rechteck dürfte der Logarithmus auch recht simpel sein.
Hat jemand eine Idee wie ich bei einer Linie das errechnen jeden einzelnen Pixels vermeiden kann?

mfg Kahpee

DeddyH 21. Feb 2010 10:04

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Zitat:

Zitat von KahPee
Hat jemand eine Idee wie ich bei einer Linie das errechnen jeden einzelnen Pixels vermeiden kann?

Ich kann Dir nicht ganz folgen. In welchem Zusammenhang denn?

KahPee 21. Feb 2010 10:11

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Die Momentane Idee wäre folgende. Bei der Linie habe ich als Informationen den Start und den Endwert vorliegen.

d.h. ich würde als allererstes die Steigung der Linie ausrechnen. Dann müsste man den y-Achsenabschnitt ermitteln (bei dem Ursprung oben links wird der negativ)

und dann für x=start.x bis end.x alle Punkte der Linie mittels f(x)=m*x+b errechnen. Wenn ein Punkt errechnet wurde wird dieser mit dem Punkt an den geklickt wurde verglichen. Sollte es einen Treffer geben wird die Prozedur abgebrochen und der Wert der Funktion als "true" zurückgegeben. Wenn es keinen Treffer gab wird der nächste Punkt geprüft.

Die Frage ist nun ob es eine einfacher Möglichkeit gibt zu gucken ob auf die Linie geklickt wurde.

DeddyH 21. Feb 2010 10:22

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Ich habe gerade etwas bei den Schweizern gefunden.

Progman 21. Feb 2010 10:29

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Schau doch einfach mal in diesen Thread :)

DeddyH 21. Feb 2010 10:31

Re: Prüfen ob auf einen Kreis geklickt wurde
 
Es geht aber mittlerweile um ein anderes (wenn auch ähnliches) Problem: "Liegt ein Punkt auf einer Linie?"

Progman 21. Feb 2010 10:36

Re: Prüfen ob auf einen Kreis geklickt wurde
 
hm, ich hatte mich am Thread-Titel orientiert :)

DeddyH 21. Feb 2010 10:38

Re: Prüfen ob auf einen Kreis geklickt wurde
 
[OT] Das darf man hier nicht tun, weiß ich aus eigener Erfahrung :) [/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz