Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.09.2010, 22:02

(gelöst) Prüfen, ob Punkt innerhalb eines Bereiches liegt

Hi,
erst mal war ich mir bei der Wahl der Rubrik nicht ganz sicher. Sorry also, wenn ich den Thread in die falsche Rubrik gepostet hab.

Ich bin heute bei meinem Projekt an eine Stelle gekommen, bei der ich prüfen muss, ob sich ein Punkt innerhalb eines bestimmten Bereiches befindet, wobei ich hier nur zweidimensional arbeite. Dieser Bereich wird durch zwei Vektoren festgelegt, die unabhängig voneinander sind.
Normalerweise würde man diese Prüfung ja etwa so schreiben:

C-/C++-Quelltext

1
2
3
4
5
//Die Variablen vPoint, vRectBegin, vRectEnd sind Instanzen einer normalen Vektor-Klasse
if (vPoint.x >= vRectBegin.x && vPoint.x <= vRectEnd.x && vPoint.y >= vRectBegin.y && vPoint.y <= vRectEnd.y)
{
    //Punkt ist innen
}

Mein Problem ist aber, dass der Vektor vRectEnd auch kleinere Werte, als vRectBegin haben kann. Wenn das der Fall ist, funktioniert die obere Abfrage aber nicht mehr. Mir ist bisher nur eine Lösung eingefallen, die aber mehr als umständlich ist.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Vector *pvLeft = &vRectBegin, *pvRight = &vRectEnd, *pvTop = &vRectBegin, *pvBottom = &vRectEnd;
if (vRectBegin.x > vRectEnd.x)
{
    pvLeft = &vRectEnd;
    pvRight = &vRectBegin;
}
if (vRectBegin.y > vRectEnd.y)
{
    pvTop = &vRectEnd;
    pvBottom = &vRectBegin;
}
if (vPoint.x >= pvLeft->x && vPoint.x <= pvRight->x && vPoint.y >= pvTop->y && vPoint.y <= pvBottom->y)
{
    //Punkt ist innen
}

Ich weiß, man könnte beim zweiten Code auf Zeiger verzichten und stattdessen für jede Kante jeweils ein float nutzen. Aber würde das eigentliche Problem auch nicht lösen. Ich hab auch schon fleißig Google genutzt und es mit mathematischen Raten versucht, vergeblich natürlich :D

Kann mir da jemand helfen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »saiez« (16.09.2010, 22:37)


KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

16.09.2010, 22:14

Hi!

Also ich würde es im Prinzip genauso machen,
allerdings gibt es natürlich noch andere Schreibweisen.

C-/C++-Quelltext

1
2
Up = RectEndY < RectBeginY ? RectEndY : RectBeginY;
Down = RectEndY > RectBeginY ? RectEndY : RectBeginY;

Würde mir da z.B. einfallen.

Aber andere Lösungsvorgänge kenne ich jetzt nicht - das sieht mir auch nicht nach ner Lösung aus, die total umständlich ist(die Variante die mir eingefallen ist, ist aber etwas doof imho. Nicht allzu schön zu lesen.)
WIP Website: kevinheese.de

3

16.09.2010, 22:27

Hallo saiez,

an dieser Stelle könntest du mit lokalen Koordinaten arbeiten. Einen Vektor würde man dann als den Koordinaten Ursprung nehmen, und dann prüfst du ob dein Punkt einen kleineren Abstand (wichtig: vom Betrag her kleiner! - also Abs(...) ) vom Ursprung hat als als der zweite Vektor.


Hier ein kleines Beispiel:


(Link)


Gruß
SaRu_

4

16.09.2010, 22:36

Yeah wie genial, danke euch Beiden :D

5

17.09.2010, 09:57

Streng genommen handelt es sich bei Vektor RectBegin um keinen Vektor sondern um einen Punkt!
Lernt eure Terminologie Leute .... Punkt != Vektor.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

17.09.2010, 12:17

Naja aber die Punkte sind in einem vector gespeichert. Wenn man es ganz genau nimmt, stimmt das aber natürlich nicht, da hast du recht..
Aber es ist wohl ein std::vector in dem einzelne "Punkt"-Werte gespeichert werden.
WIP Website: kevinheese.de

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

7

17.09.2010, 12:17

Das nennt man Ortsvektor ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

8

17.09.2010, 16:36

Zitat

Das nennt man Ortsvektor ;)
Jup, genau! Kommt immer auf die Interpretation des Vektors an, ob als Bewegungsvektor oder Ortsvektor .


Gruß
SaRu_

Werbeanzeige