001
12.07.2008, 22:36 Uhr
0xdeadbeef
Gott (Operator)
|
Dass der untere Code nicht funktioniert, wird daran liegen, dass ^ die binäre XOR-Operation ist. Wenn du potenzieren willst, im Header <cmath> ist eine Funktion std::pow.
Was den oberen Code angeht, so sind sowohl Potenzierung als auch sqrt vergleichsweise langsame Operationen, dementsprechend würde ich eher die Quadrate vergleichen:
C++: |
double dx = x_ich - x_2, dy = y_ich - y_2, dz = z_ich - z_2, rad_sum = radius_ich + radius_1;
distanz = dx * dx + dy * dy + dz * dz; if(distanz <= rad_sum * rad_sum) { // Kollision }
|
Wie dem auch sei, der eigentliche Fehler ist im oberen Code nicht direkt ersichtlich, obwohl es mir äußerst seltsam vorkommt, dass du in eine by-value übergebene Variable schreibst. Ich hätte mehr sowas wie
C++: |
bool sphere::collision(sphere const &s) { double dx = x_ + s.x(), dy = y_ + s.y(), dz = z_ + s.z(), r_sum = radius_ + s.radius();
double distanz = dx * dx + dy * dy + dz * dz;
return distanz <= rad_sum * rad_sum; }
|
erwartet. Möglicherweise auch ein
C++: |
bool collision(sphere const &s1, sphere const &s2);
|
in einer physics-Klasse oder so; sonst ist immer ein bisschen die Frage, welche Kugel jetzt mit welcher kollidiert, und warum nicht andersherum.
Oh, und du solltest deine Klassenmethoden wirklich von der Deklaration abgetrennt implementieren, in einer eigenen Übersetzungseinheit.
Nachtrag:
Da dieses Problem nicht OpenGL-spezifisch ist, verschiebe ich den Thread mal ins ANSI-Forum. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 12.07.2008 um 22:37 Uhr von 0xdeadbeef editiert. |