Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
njubee Mini JLI'ler
Anmeldedatum: 17.06.2006 Beiträge: 16
Medaillen: Keine
|
Verfasst am: 21.04.2007, 15:42 Titel: Ist der Punkt im Rechteck? |
|
|
Welches ist eine effektive Methode, um festzustellen, ob sich ein Punkt innerhalb eines Rechtecks befindet. Momentan mach ich das folgendermaßen:
Code: |
if(punkt.x>=rect.left) {
if(punkt.x<=rect.right) {
{if(punkt.y>=rect.top) {
if(punkt.y<=rect.bottom) {return true;}}}
...
|
Das ist wahrscheinlich nicht sehr schnell, aber wie macht man's besser? |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 21.04.2007, 15:52 Titel: |
|
|
Naja, ob es schneller geht weiß ich nicht. Vieleicht ist das schneller:
CPP: | bool point_in_rect(...)
{
return ( punkt.x >= rect.left && punkt.x <=rect.right && punkt.y>=rect.top && punkt.y<=rect.bottom );
} |
Das ist aber im Prinzip das selbe wie deins. Nur halt anders geschrieben. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
njubee Mini JLI'ler
Anmeldedatum: 17.06.2006 Beiträge: 16
Medaillen: Keine
|
Verfasst am: 21.04.2007, 16:13 Titel: |
|
|
Danke für die schnelle Antwort.
Ich hätte es vielleicht gleich oben dazuschreiben sollen. Ich dachte an so etwas wie ein Makro oder eine Betriebssystemfunktion, ob es so etwas schon gibt. Die ist dann wahrscheinlich in Assembler und hoch-optimiert.
z.B. bool IsPointInRect (point,rect)
Mir gehts gar nicht so sehr um Geschwindigkeit, ich müsste mir halt sonst eine eigene Funktion schreiben. |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 21.04.2007, 16:16 Titel: |
|
|
Ach das ist pille-palle, eine handvoll Vergleiche sind kein Problem für gängige Recheneinheiten, wenn irgendeine API so eine Funktion bietet, wird die intern auch nicht anders implementiert sein als Dragon seine Funktion.
Ich würde das Ding wahrscheinlich als Template definieren und in irgendeiner Header mit unterbringen und fertig. |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 21.04.2007, 18:34 Titel: |
|
|
also bei einer Point-In-Rect Überprüfung brauchst du dir überhaupt keine Sorgen zu machen, dass macht ne gänginge CPU in 1-3 QPC-circles (zum Vergleich: 1 QPC-circle entspricht normalerweise 0.3 Mikrosekunden, also 0,0000003 sek). Da gibt es zig Berechnungen die wesentlich komplizierter sind und trotzdem weniger als 1. Millisekunde brauchen. Es gibt aber, um deine "2." Frage zu beantworten, auch eine Funktion in der WinAPI vorimplementiert, die genau so arbeitet wie deine, damit Programmierer die nicht immer neu implementieren müssen: CPP: | BOOL PtInRect(
CONST RECT *lprc, // rectangle
POINT pt // point
); | unter: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/rectangl_1644.asp
aber diese Methode, die da und oben bei dir benutzt wird, funktioniert nur bei achsen-ausgerichteten Rechtecken wie die normalen Windows-RECTs. Bei gedrehten, die in Spielen z.B. als BoundingBox verwendet werden, musst du auf eine andere Formel zurückgreifen.
btw: zu der Assembler-optimierung, die ist in solchen fällen wirklich nicht nötig (s.o.) und hätte davon abgesehen auch nicht viel sinn, da letztendlich eh die ALU der CPU zur Integer-Vergleichung (s. "rect.x <= x" etc.) und verwendet wird, die für sowas generell optimiert und einzig ist.
Gruß DXer |
|
Nach oben |
|
 |
njubee Mini JLI'ler
Anmeldedatum: 17.06.2006 Beiträge: 16
Medaillen: Keine
|
Verfasst am: 21.04.2007, 18:41 Titel: |
|
|
Genau das habe ich gesucht,danke. Es muss ohnehin nur in 2D arbeiten. |
|
Nach oben |
|
 |
|