前几天做一个功能,实现N多圆球的碰撞时,写的该算法.代码比较容易,使用了三角形的余弦定理.算法是二维的,改成三维也容易.其实三维的我也实现过,用于骨骼动画的IK处理上.
1 // 已知三角形的两点坐标,和三个边长,求第三点的坐标.
2 bool CalculateTriangleThirdPoint(const Vector2& vA, const Vector2& vB, Vector2& vC, float a, float b, float c)
3 {
4 float cosA = (b*b + c*c - a*a) / (2*b*c);
5 if (cosA > 1.0f || cosA < -1.0f)
6 {
7 return false;
8 }
9 float angleA = acosf(cosA);
10 float sinA = sinf(angleA);
11
12 // 判断C在直线AB的左边还是右边
13 if (()*() - ()*() > 0.0f)
14 {
15 sinA = -sinA;
16 }
17
18 Vector2 vAB = vB - vA;
19
20 // 对向量AB旋转A的角度,即得到AC的向量
21 Vector2 vAC;
22 = cosA* + sinA*;
23 = -sinA* + cosA*;
24 D3DXVec2Normalize(&vAC, &vAC);
25
26 vC = vA + vAC*b;
27
28 /*
29 // 验证用
30 Vector2 vBC = vC - vB;
31 float disBC = sqrtf(* + *);
32 */
33
34 return true;
35 }