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 }
  • 相关阅读:
    SQL注入(手工篇)
    sed命令
    交互输入与for语句
    编程原理
    grep与正则表达式
    重定向和管道符
    shell_oneday_历史命令相关
    python_01_初识python
    C# 上传文件
    C# in 参数化处理 (记)
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3424039.html
Copyright © 2011-2022 走看看