JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=13fa9fb8931b3a4738db073c79811363Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Ist der Punkt im Rechteck?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
njubee
Mini JLI'ler



Anmeldedatum: 17.06.2006
Beiträge: 16

Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 15:42    Titel: Ist der Punkt im Rechteck? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 15:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
njubee
Mini JLI'ler



Anmeldedatum: 17.06.2006
Beiträge: 16

Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 16:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 16:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 18:34    Titel: Antworten mit Zitat

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. Smile

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. Very Happy

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
njubee
Mini JLI'ler



Anmeldedatum: 17.06.2006
Beiträge: 16

Medaillen: Keine

BeitragVerfasst am: 21.04.2007, 18:41    Titel: Antworten mit Zitat

Genau das habe ich gesucht,danke. Es muss ohnehin nur in 2D arbeiten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum