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

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

21

08.05.2012, 18:41

Zitat

Was passiert wenn das letzte if false ist?
Hast du deine Warnungen ausgeschaltet?


Was meinst du damit?

@David: Ja stimmt schon, muss das ma ändern, glaub aber nit, dass es was ändert..
Hast du denn noch irgendwas falsches gefunden?
Bzw. wie würdest du das machen?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

22

08.05.2012, 18:43

Das was NachoMan schreibt ist nicht nur vereinfacht, sondern dient auch oft der Übersicht und merzt Fehlerquellen aus. Vor allem in Verbindung mit dem Fragezeichen-Operator fällt mir sowas sehr häufig auf.

Code wie

Quellcode

1
return (Bedingung)?true:false;


sind halt einfach totaler Kappes;) Dann wundere ich mich, warum du AB direkt übergibst und CD erst innerhalb der Funktion berechnest. An sich würde es doch reichen nur die 4 Punkte zu übergeben. Würde da versuchen möglichst einheitlich zu arbeiten. Je eher man sich sowas angewöhnt umso besser.


edit:
Das Problem ist, dass du falls das letzte if fehl schlägt nichts zurück gibst.
Davids Tipp ist sehr wichtig. Du kannst mir zwei Floats hin und her rechnen und auch wenn sie theoretisch am Ende gleich sein sollten, müssen sie das noch lange nicht. Bau da auf jeden Fall eine Abweichung mit ein. Einfach +- irgendein Wert für die Schranken.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

23

08.05.2012, 19:55

Zitat

Was passiert wenn das letzte if false ist?
Hast du deine Warnungen ausgeschaltet?

Was meinst du damit?

Wenn die Bedingung in Zeile 66 false ist, was wird dann zurückgegeben? true oder false?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

24

11.05.2012, 19:04

Danke für eure Hilfe!

Ich will mal beschreiben, wofür ich das brauche, vll hilft das ja.
Ich bin dabei mit Ogre das Spiel GLTron nachzuprogrammieren.
Den Schnittpunkt von zei Strecken brauche ich dabei, um herauszufinde, ob ein Tron gegen ein anderes bzw. gegen dessen Mauer gefahren ist.
Ich hab die einzelnen Strecken punkte in vectoren gespeichert und erstelle mit dann immer durch zwei eine Strecke und die andere Strecke ist dann
die Position des zu testenden Trons und dessen Position + die Richting mal die Zeit.

Das heißt aber auch, dass sich die Strecken eig immer nur senkrecht schneiden können, wobei immer eine parallel zur y-achse ist.
Speziell dafür soll meine Funktion dann letzten Endes sein:

So hier poste ich mal die Funktion, so wie ich sie jetzt nochmal geändert hab.
Es ist so, dass der Schnittpunkt in fast allen Fällen gefunden wird, aber auch manchmal nicht.
kann da auch leider keine Regelmässigkeit feststellen. :(

Hab versucht alle Verbesserungsvorschläge auch zu benutzen!

C-/C++-Quelltext

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#define EPSILON 0.01

// Bestrag rausfinden
float Abs (float AbsIn){return AbsIn < 0.0f ? (-1*AbsIn) : AbsIn;};

// testen, ob Point, der auf der geraden der strecke liegt, auch innerhalb vin ihr liegt
bool PointInSphere (Ogre::Vector3 &Q, Ogre::Vector3 &P, float fRadius)
{
    return (Q-P).squaredLength() <= fRadius;
}

// testen, ob zwei strecken, die auf der gleichen geraden liegen, aufeinnder liegen
bool SphereHitsSphere (Ogre::Vector3 &Q, Ogre::Vector3 &P, float fRadiusQ, float fRadiusP)
{
    return (Q-P).squaredLength() <= fRadiusQ + fRadiusP;
}

bool StreckenSchneidenSich (const Ogre::Vector3 A, const Ogre::Vector3 B, const Ogre::Vector3 AB, const Ogre::Vector3 C, const Ogre::Vector3 D)
{       
    // verbindungsvektor von C und D
    Ogre::Vector3 CD = D-C;

    // testen ob einer der Graphen parallel zur y achse ist
    bool ABP = Abs(B.x-A.x) < EPSILON ? true : false;
    bool CDP = Abs(D.x-C.x) < EPSILON ? true : false;

    // alle Variablen deklarieren
    float ABm=0;
    float CDm=0;
    float ABb=0;
    float CDb=0;
    float x = 0;
    float y = 0;

    // Fals AB nicht parallel zur Y-Achse ist, gibnt es eine Steigung und auch ein y-achsensabschitt
    if(!ABP)
    { 
        // Steigung und y-Achsenabschnitt berechnen
        ABm = (B.z-A.z) / (B.x-A.x); 
        ABb = A.z - ABm*A.x; 
    }
    // Fals CD nicht parallel zur Y-Achse ist, gibnt es eine Steigung und auch ein y-achsensabschitt
    if(!CDP) 
    {
        // Steigung und y-Achsenabschnitt berechnen
        CDm = (D.z-C.z) / (D.x-C.x);
        CDb = C.z - CDm*C.x;
    }

    // fals beide parallel zur z-achse sind
    if(ABP && CDP)
    {
        // wenn sie andere z Werte haben, schneiden sie sich nicht
        if(Abs(C.x-A.x) > EPSILON)
            return false;
        else // falls, alle Punkte teste
            return SphereHitsSphere(A+AB*0.5, C+CD*0.5, (AB*0.5).squaredLength(), (CD*0.5).squaredLength());
    }

    // wenn Ab parallel zur y-Achse ist
    if(ABP)
    {
        x = A.x;
        y = CDm*x+CDb;
    }
    else if(CDP) // Wenn CD parallel zur y-Achse ist
    {
        x = C.x;
        y = ABm*x+ABb;
    }
    else // wenn keine von beiden parallel ist
    {
        //wenn sie gleiche Steigung und ungleichen y-achsenabschnitt haben, abbrechen
        if(Abs(ABm -CDm) < EPSILON && Abs(ABb-CDb) > EPSILON)
            return false;
        // Wenn sie auf der gleichen gerden liegen
        if(Abs(ABm -CDm) < EPSILON && Abs(ABb-CDb) < EPSILON)
        {
            return SphereHitsSphere(A+AB*0.5, C+CD*0.5, (AB*0.5).squaredLength(), (CD*0.5).squaredLength());
        }

        // ansonsten, x|y ausrechnen 
        x = (CDb-ABb)/(ABb-CDb);
        y = ABm*x + ABb;
    }

    Ogre::Vector3 Point (x,0,y);

    // testen, ob schnittpunkt innerhalb der beiden Strecken liegt.
    return PointInSphere(A+AB*0.5, Point, (AB*0.5).squaredLength()) && PointInSphere(C+CD*0.5, Point, (CD*0.5).squaredLength());
}; 


Also ich bin jetzt fast mit meinem Latein am Ende (obwohl das eig schon recht gut ist :P).
Vll kat ja jemand einen besondere lösung für diese Spezielle Art von Anordnung..

ProAmateur
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Werbeanzeige