Update CheckCollisionSpheres() to avoid sqrt
Square root calls are computationally expensive. In this case, they can be avoided. Instead of checking distance<RadA+RadB, check distance squared against (RadA+RadB) squared. The dot product of Vector3Subtract(B,A) with itself gives distance squared, so I used this code instead of an element-by-element computation of distance squared. The only downside is that your geometric code is very readable, whereas this is less so.
This commit is contained in:
parent
97c8a28aaa
commit
d3dae38449
1 changed files with 1 additions and 11 deletions
12
src/models.c
12
src/models.c
|
@ -2472,17 +2472,7 @@ void DrawBoundingBox(BoundingBox box, Color color)
|
||||||
// Detect collision between two spheres
|
// Detect collision between two spheres
|
||||||
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB)
|
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB)
|
||||||
{
|
{
|
||||||
bool collision = false;
|
return Vector3DotProduct(Vector3Subtract(B,A),Vector3Subtract(B,A))<=(RadA+RadB)*(RadA+RadB);
|
||||||
|
|
||||||
float dx = centerA.x - centerB.x; // X distance between centers
|
|
||||||
float dy = centerA.y - centerB.y; // Y distance between centers
|
|
||||||
float dz = centerA.z - centerB.z; // Y distance between centers
|
|
||||||
|
|
||||||
float distance = sqrtf(dx*dx + dy*dy + dz*dz); // Distance between centers
|
|
||||||
|
|
||||||
if (distance <= (radiusA + radiusB)) collision = true;
|
|
||||||
|
|
||||||
return collision;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect collision between two boxes
|
// Detect collision between two boxes
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue