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
Quellcode |
|
1 2 3 4 5 6 7 8 |
bool LineHitsLine(const Vector2D& p, const Vector2D& u, const Vector2D& q, const Vector2D& v, Vector2D* const pHit = 0) if(pHit) *pHit = p + s * u; return true; |
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 |
public bool IsTrue(Vektoren.Vektoren2 StartVektor, Baum ZielVektor) { double t, D, Dt, s, Ds; double pHit = 0; Baum ZielTemp = ZielVektor; // Die Determinante D berechnen D = (StartVektor.b * ZielTemp.a) - (StartVektor.a * ZielTemp.b); // Wenn D null ist, sind die Linien parallel. if (D < 0.0001f && D > -0.0001f) return false; // Determinante Ds berechnen Ds = (ZielTemp.y - StartVektor.y) * ZielTemp.a - (ZielTemp.x - StartVektor.x) * ZielTemp.b; // s = Ds / D berechnen und prüfen, ob s in den Grenzen liegt s = Ds / D; if (s < 0.0f || s > 1.0f) return false; // Jetzt berechnen wir Dt und t. Dt = (ZielTemp.y - StartVektor.y) * StartVektor.a - (ZielTemp.x - StartVektor.x) * StartVektor.y; 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; } |
Alter Hase
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 |
// Schneiden sich zwei 2D-Linien? public bool LineHitsLine(const Vector2D p, const Vector2D u, const Vector2D q, const Vector2D v, out Vector2D pHit) { // 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; phit = p + s * u; return true; } |
Zitat von »"Phil_GDM"«
Durch Vector2D* const phit ist es möglich, dass wenn man den Wert für phit in der Funktion ändert, dieser sich auch ausserhalb der Funktion mitändert, da man nicht auf einen lokale Variable zugreift, sonder über dein Zeiger auf eine Speicherstelle ausserhalb der Funktion referenziert.
*pHit ist die Dereferenzierung, denn du willst den Wert der Speicherstelle auf der der Zeiger zeigt ändern, und nicht den Zeiger an sich.
In C# würde der Code wohl ungefähr so aussehen
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 // Schneiden sich zwei 2D-Linien? public bool LineHitsLine(const Vector2D p, const Vector2D u, const Vector2D q, const Vector2D v, out Vector2D pHit) { // 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; phit = p + s * u; return true; }
C-/C++-Quelltext |
|
1 2 3 4 |
int myFunc(int Value) { return 0; } |
C-/C++-Quelltext |
|
1 2 3 4 |
void myFunc(MyClass Object) { Object.Method(11); } |
C-/C++-Quelltext |
|
1 2 3 4 |
void myFunc(ref MyClass Object) { Object = new MyClass(); } |
C-/C++-Quelltext |
|
1 2 3 |
MyClass ObjectMain = null;
myFunc(ref ObjectMain);
|
C-/C++-Quelltext |
|
1 2 3 4 |
void myFunc(ref int Value) { Value = 5; } |
C-/C++-Quelltext |
|
1 2 3 |
int MyInt = 2; myFunc(ref MyInt); |
Alter Hase
Werbeanzeige