找到来自任意原点的两个向量之间的角度

时间:2015-06-26 03:07:20

标签: c++ math vector 3d angle

我想知道当原点不是O(0,0,0)时如何获得图片上的角度,但是(a,b,c)其中a,b和c是变量。

B是与A(d,e,f)和原点成90度的点。

图片在这里:

screenshot

3 个答案:

答案 0 :(得分:8)

首先,从A和B中减去原点:

A = A / ||A||
B = B / ||B||

然后,规范化向量:

dot = A . B

然后找到A和B的点积:

angle = acos(dot)

然后找到反余弦。这是你的角度:

float angleBetween(
 glm::vec3 a,
 glm::vec3 b,
 glm::vec3 origin
){
 glm::vec3 da=glm::normalize(a-origin);
 glm::vec3 db=glm::normalize(b-origin);
 return glm::acos(glm::dot(da, db));
}

(注意结果是弧度。要转换为度数,乘以180除以π。)

以下是使用GLM实现此方法的C ++源代码:

require 'json'

chart_data = { 
  series: [{ 
    data: @show.map do |i| 
      { x: i.year, y: i.maturity, myData: i.extraData } 
    end
  }] 
}
chart_data.to_json

# => "{\"series\":[{\"data\":[{\"x\":0,\"y\":0,\"myData\":\"origin\"},{\"x\":1,\"y\":1,\"myData\":\"I'm linear... so far\"}]}]}"

答案 1 :(得分:2)

首先,从A和B中减去原点:

A = A - origin
B = B - origin

然后取它们的大小比例的反余弦:

angle = acos(|B|/|A|)

答案 2 :(得分:1)

然后签署角:

 double degrees(double radians)
{
    return (radians*180.0)/M_PI;
}

 double angle=atan2(v1.x*v2.x+v1.y*v2.y,v1.x*v2.y-v1.y*v2.x);
             angle=degrees(angle);