zoukankan      html  css  js  c++  java
  • 已知三角形的两点坐标,和三个边长,求第三点的坐标

    前几天做一个功能,实现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 ((vA.x-vC.x)*(vB.y-vC.y) - (vB.x-vC.x)*(vA.y-vC.y) > 0.0f)
    14     {
    15         sinA = -sinA;
    16     }
    17 
    18     Vector2 vAB = vB - vA;
    19 
    20     // 对向量AB旋转A的角度,即得到AC的向量
    21     Vector2 vAC;
    22     vAC.x =  cosA*vAB.x + sinA*vAB.y;
    23     vAC.y = -sinA*vAB.x + cosA*vAB.y;
    24     D3DXVec2Normalize(&vAC, &vAC);
    25 
    26     vC = vA + vAC*b;
    27 
    28     /*
    29     // 验证用
    30     Vector2 vBC = vC - vB;
    31     float disBC = sqrtf(vBC.x*vBC.x + vBC.y*vBC.y);
    32     */
    33 
    34     return true;
    35 }
  • 相关阅读:
    HDU 6034
    HDU 6047
    CodeForces 830B
    HDU 4972
    HDU 4408
    CodeForces 788B
    CodeForces 788A
    CodeForces 792C
    uva 1658 Admiral 最小费最大流
    hdu 5391 Zball in Tina Town 威尔逊定理
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3424039.html
Copyright © 2011-2022 走看看