[綜] 判斷兩向量夾角是否大於180°即0~360°


http://huanghs16.bokee.com/2019692.html

求取向量A逆時針到向量B的夾角


算法思路:通過余弦定理求取向量夾角的cosa,然后判斷夾角是否大於180,如果大於,則向量夾角為360-arccosa*180/Pi(單位為°);否則夾角為arccosa*180/Pi。(Pi為常量3.14159265)。實驗代碼如下:

1、先定義Point頭文件(Point.h)

# ifndef POINT_H_
# define POINT_H_
class Point
{
public:
Point()
{
x=0.0;
y=0.0;
}

Point(float inx, float iny)
{
x=inx;
y=iny;
}
//析構函數
~Point(){}
float getX() {return x;}
float getY() {return y;}

//重載=操作符,實現兩向量變量的賦值
Point operator =(Point& inPoint)
{
Point temp;
temp.x=inPoint.x;
temp.y=inPoint.y;
return temp;
}

//重載+操作符,實現兩向量變量的相加
Point operator+(const Point& inPoint)
{
//返回相加的結果
return Point(inPoint.x + x, inPoint.y + y);
}

//重載-操作符,實現兩向量變量的相減
Point operator-(const Point& inPoint)
{
//返回相減的結果
return Point(x - inPoint.x, y - inPoint.y);
}

//重載*操作符,實現一個向量變量和一個浮點數的乘法
Point operator*(float num)
{
//返回縮放了的向量
return Point(x * num, y * num);
}

//重載/操作符,實現一個向量變量和一個浮點數的除法
Point operator/(float num)
{
//返回縮放了的向量
return Point(x / num, y / num);
}

//得到一個向量的絕對長度,即距原點的距離
float Length();

private:
float x;
float y;
};

# endif

2、定義相應的cpp文件,並進行算法實驗。

# include "point.h"
# include
# include
# include
using namespace std;
const float Pi=3.14159265;

//返回點到原點的距離
float Point::Length()
{
return sqrt(x*x + y*y);
}

//得到兩點的距離
float Distance(Point& pPoint1, Point& pPoint2)
{
float subX=pPoint1.getX()-pPoint2.getX();
float subY=pPoint1.getY()-pPoint2.getY();
return sqrt(subX * subX + subY * subY);
}

//得到兩向量的點積(即內積)
float DotProduct(Point& pPoint1, Point& pPoint2)
{
return pPoint1.getX() * pPoint2.getX() + pPoint1.getY() * pPoint2.getY();
}

//判斷兩向量夾角是否大於180°,大於180°返回真,否則返回假
bool AngleLargeThanPi(Point& point1, Point& point2)
{
float temp=point1.getX() * point2.getY() - point2.getX()* point1.getY();
return ( temp < 0);
}

//得到兩向量的夾角
float AngleBetweenPoints(Point& pPoint1, Point& pPoint2)
{
float cos_theta = DotProduct(pPoint1,pPoint2) / (pPoint1.Length() * pPoint2.Length());
if( AngleLargeThanPi(pPoint1,pPoint2) )
return 360-acos(cos_theta)*180/Pi;
else
return acos(cos_theta)*180/Pi;
}

//測試程序
int main()
{
Point A(5,0); //可以換不同象限的點,測試夾角。
Point B(-1,-1);

bool largeThanPi = AngleLargeThanPi(A,B);
cout< cout<<"the angle between vector A and B is: "< return 0;
}

如果要投入使用,還需要對邊界條件進行處理,添加當向量長度為0時的處理。

 

 

點積 叉積

點積的值由以下三個值確定:   u的大小v的大小u,v夾角的余弦。在u,v非零的前提下,點積如果為負,則u,v形成的角大於90度;如果為零,那么u,v垂直;如果為正,那么u,v形成的角為銳角。   點積得到兩個向量的夾角的cos值,通過它可以知道兩個向量的相似性,利用點積可判斷一個多邊形是否面向攝像機還是背向攝像機
  向量的點積與它們夾角的余弦成正比,因此在聚光燈的效果計算中,可以根據點積來得到光照效果,如果點積越大,說明夾角越小,則物理離光照的軸線越近,光照越強。

點積的結果為一個數值。
數值計算方法AB * CD = x3*x4 + y3*y4。
幾何意義AB * CD = |AB| * |CD| * cos(a),a為向量AB逆時針轉向CD的角度,0<=a<360,也可以認為是兩向量的夾角,0<=a<=180。一般用於求夾角,a = acos( (AB * CD) / (|AB| * |CD|) )。也可:|CD| * cos(a) = AB * CD / |AB|,即向量CD在AB上的投影。

>> a=[2 4 5 3 1];
>> b=[3 8 10 12 13];
>> c=dot(a,b)
c =
137


叉積。

叉積的結果為一個向量。
AB×CD數值= x3*y4 – x4*y3。
方向由右手螺旋定則判定。
幾何意義:AB×CD = |AB| * |CD| * sin(a),取絕對值即是以AB和CD為邊的平行四邊形面積。
>> a=[2 3 4];
>> b=[3 4 6];
>> c=cross(a,b)
c =
2 0 -1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM