`
demojava
  • 浏览: 540771 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

向量-内积与外积(转载)

 
阅读更多
struct Vector {int x, y;};  // 二维向量的资料结构    
// 内积运算    
int dot(Vector& v1, Vector& v2)    
{    
    return v1.x * v2.x + v1.y * v2.y;   // 没有除法,尽量避免误差。    
}   
// 外积运算,回传纯量(除去方向)    
int cross(Vector& v1, Vector& v2)    
{    
    return v1.x * v2.y - v1.y * v2.x;   // 没有除法,尽量避免误差。    
}   

 

内积、外积跟长度的关系

内积后取绝对值,求得的是投影量,再除以投影标的的单位向量,则得到投影长度。

外积后取绝对值,求得的是平行四边形的面积量,再除以底的单位向量,则得到高。


 

struct Point {double x, y;};    // 点的资料结构    
typedef Point Vector;           // 向量的资料结构,和点一样    
// 内积运算    
double dot(Vector& v1, Vector& v2)    
{    
    return v1.x * v2.x + v1.y * v2.y;    
}    
// 外积运算,回传纯量(去除方向)    
double cross(Vector& v1, Vector& v2)    
{    
    return v1.x * v2.y - v1.y * v2.x;    
}    
// 向量的长度    
double length(Vector& v)    
{    
    return sqrt(v1.x * v1.x + v2.y * v2.y);    
//  return sqrt(dot(v, v));    
}    
void print_d1_and_d2()    
{    
    Point p, p1, p2;    
    Vector v1 = p1 - p, v2 = p2 - p;    
    cout << "d1:" << fabs(dot(v1, v2)) / length(v1);    
    cout << "d2:" << fabs(cross(v1, v2)) / length(v1);    
}   

 

 

void print_θ()    
{    
    Point p, p1, p2;    
    Vector v1 = p1 - p, v2 = p2 - p;    
    double l1 = length(v1), l2 = length(v2);    
    cout << "cos(θ):" << dot(v1, v2) / l1 / l2;    
    cout << "sin(θ):" << cross(v1, v2) / l1 / l2;    
    cout << "θ:" << acos(dot(v1, v2) / l1 / l2);    // [0, π]    
    cout << "θ:" << asin(cross(v1, v2) / l1 / l2);  // [-π/2, π/2]    
} 

 

注意到acos与asin的回传值,回传的结果是弪度量(radian)而非度度量(grade),而且回传值的范围也不同。一般都以内积与acos求得介于0˚到180˚之间的夹角大小。

 

内积与向量夹角

      利用内积的性质,可以粗略判断夹角大小:内积大于0时,两向量夹角小于90˚;等于0时,夹角等于90˚;小于零时,夹角大于90˚且小于180˚。

 

外积与向量旋转

      外积大于0时,两向量前后顺序为逆时针顺序(在180˚之内);等于0时,两向量平行,也就是指夹角等于0˚或180˚;小于0时,两向量前后顺序为顺时针顺序(在180˚之内)。

 

转载链接:http://blog.sina.com.cn/s/blog_7506816f0100qfv0.html

  • 大小: 1.8 KB
  • 大小: 1.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics