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

11.06.2006, 22:32

HILFE!! LineHitsLine: 2D Kollisionserkennung Teil 1

Ich schon wieder....

...vielleicht bekomme ich diesmal eine Lösung für mein Problem, ohne dass mein Thema gleich mal gesperrt wird, obwohl ich meiner Meinung nach niemanden persönlich beleidigt oder angegriffen habe, sondern nur meine Unfähigkeit deutlicher zum Ausdruck bringen wollte... aber gut.

Wenn sich jemand hier böse von mir angesprochen gefühlt hat, so möchte ich mich bei demjenigen dafür entschuldigen.

Doch nun zum eigentlichen Problem:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool LineHitsLine(const Vector2D& p,
                  const Vector2D& u,
                  const Vector2D& q,
                  const Vector2D& v,
                  Vector2D* const pHit = 0)
{
    // Die Determinante D berechnen
    const float D = u.y * v.x - u.x * v.y;

    // Wenn D null ist, sind die Linien parallel.
    if(D < 0.0001f && D > -0.0001f) return false;

    // Determinante Ds berechnen
    const float Ds = (q.y - p.y) * v.x - (q.x - p.x) * v.y;

    // s = Ds / D berechnen und prüfen, ob s in den Grenzen liegt
    const float s = Ds / D;
    if(s < 0.0f || s > 1.0f) return false;

    // Jetzt berechnen wir Dt und t.
    const float Dt = (q.y - p.y) * u.x - (q.x - p.x) * u.y;
    const float t = Dt / D;
    if(t < 0.0f || t > 1.0f) return false;

    // Die Linien schneiden sich!
    // Wir tragen den Schnittpunkt ein.
    if(pHit) *pHit = p + s * u;
    return true;
}


Füttert man diese Funktion mit den Vektoren:
p( 100, 50 ) -> u( 100, 150 )
q( 50, 100 ) -> v( 150, 100 )

so ergibt sich für s oder t = 1, obwohl sich die Vektoren in ihrer Mitte schneiden und damit 0.5 rauskommen sollte.
Ein Schnittpunkt befindet sich dann bei v(200,200), was ja damit auch völlig daneben liegt, weil der bei v(100,100) sein sollte.

Fragt mich nicht, warum welche Formel an welcher Stelle wie zum Einsatz kommt, das Ding ist aus dem Tutorial kopiert.

PS: Nochmals: Entschuldigung, wenn ich jemanden mit meinem ersten Thread auf die Füsse getreten bin.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

11.06.2006, 23:19

Des Rätsels Lösung sollte ganz einfach sein:

Anscheinend handelt es sich hier nicht um Geraden, die durch 2 Punkte definiert sind, sondern um Graden, die durch einen Punkt und eine Richtung bestimmt sind.
Wenn man mit dieser Anname anfängt ein wenig mit den Sachen rumzupsielen, erklärt sich auch warum du den Schnittpunkt 200,200 bekommst, denn p( 100, 50 ) + u( 100, 150 ) = (200, 200) und q( 50, 100 ) + v( 150, 100 ) = (200, 200)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

12.06.2006, 00:06

Re: HILFE!! LineHitsLine: 2D Kollisionserkennung Teil 1

Zitat von »"Kabelbinder"«


Wenn sich jemand hier böse von mir angesprochen gefühlt hat, so möchte ich mich bei demjenigen dafür entschuldigen.



Passt schon, Schwamm drüber und willkommen an Board ;)

4

12.06.2006, 16:26

ACHSO!

:lol: :lol: :lol:

Mit Zeigefinger die Nase seitlich reib, die Nase unten reib, schnippen und ein 'Ich habs' mit in den Himmel gestreckten Zeigefinger hinausrufen!

Ich bin immer von 2 Vektoren ausgegangen.... dass das einmal der Basis-Vektor und einmal ein davon ausgehender Richtungsvektor ist.... brrrrrbllllll... :?

Wohl dem, der den Tutorial-Text auch richtig verstanden hat und die Bilder wohlweislich korrekt interpretierte (JETZT ist es mir auch aufgefallen...)

Naja, manchmal braucht das Hirn doch einen Tritt in den Allerwertesten :roll:

Vielen Dank für den Denkanstoss, jetzt funktioniert auch meine Routine richtig!

Kabelbinder

Werbeanzeige