計算幾何常用公式與技巧歸納之系列一:點與線

double eps=1e-8;
struct P
{
    double x,y;
    P(){}
    P(double x,double y):x(x),y(y){}
    P operator -(const P& p){return P(x-p.x,y-p.y);}
    P operator +(const P& p){return P(x+p.x,y+p.y);}
    P operator *(double d){return P(x*d,y*d);}
    P operator /(double d){return P(x/d,y/d);}
    double operator *(const P& p){return x*p.y-y*p.x;}// 叉積
    double operator &(const P& p){return x*p.x+y*p.y;}// 點積
    P rot(double th){return P(x*cos(th)-y*sin(th),x*sin(th)+y*cos(th));}// 逆時針旋轉
    double dis(){return sqrt(x*x+y*y);}// 與原點的距離
    double angle(){return atan2(y,x);}// 極角
    void read(){scanf("%lf%lf",&x,&y);}
};
struct Line
{
    P a,b;// 當表示有向時,將a作爲起始點
    Line(){}
    Line(P a,P b):a(a),b(b){}
    void read(){a.read();b.read();}
    double dis(){  return (a-b).dis(); }
}L;
ps:上面重載了點的相關操作,會在下面的代碼中遇到。

首先介紹下叉積與點積:

叉積(*): a*b=|a|*|b|*sin(th)(注意:th爲向量a繞原點旋轉到b的角度,逆時針方向爲正)

性質: 我們可以用叉積來判斷點在向量的哪一邊

性質二:用來求三角形的面積

性質三: asina*b / (|a|*|b|) )可以得到a,b之間的夾角,但是一定要注意asin()的返回範圍是:[-pi/2, pi/2], 因此如果兩者之間成鈍角,會出現問題,因而可以用來求銳角的角度

點積(&):a&b=|a|*|b|*cos(th),

性質一:基於cos(th)在90°~180°爲負,可以判向量之間是否爲鈍角

性質二:向量之間的度數,這裏就保證了範圍爲0°~180°





《明天繼續更新》








點在直線上

點在線段上

點到直線的距離

點到直線的垂足

點到線段的最近距離

點關於直線的對稱點

兩直線的交點






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章