C 常用計算幾何演算法

2021-07-03 13:07:58 字數 3199 閱讀 6744

從網上轉來的幾何演算法,對點線的基本演算法,有興趣的可以學習下。

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)>(b))?(b):(a))

#define sign(x) ((x)>eps?1:((x)<-eps?(-1):(0)))

using namespace std;

const int maxn=1000;

const double eps=1e-8,inf=1e50 ,pi=acos(-1.0);

struct point

point(double _x,double _y)

point operator-(const point &ne)const

point operator+(const point ne)const

point operator*(const double t)const

point operator/(const double t)const

};struct line

line(point _a,point _b)

};struct line2

line2(double _a,double _b,double _c)

};struct circle

circle(point _o,double _r)

};struct rectangle

rectangle(point _a,point _b,point _c,point _d)

};struct polygon;

inline double xmult(point a,point b)

inline double xmult(point o,point a,point b)

inline double xmult(double x1,double y1,double x2,double y2)

inline double dmult(point o,point a,point b)

inline double dmult(point a,point b)

inline double lenth(point a)

inline double dist(point a,point b)

inline double dist2(point a,point b)

//直線一般式轉兩點式

line toline(double a,double b,double c)

//直線兩點式轉一般式

line2 toline2(point a,point b)

//點p繞o逆時針旋轉alpha

point rotate(point o,point p,double alpha)

//向量u的傾斜角

double angle(point u)

//oe與os的夾角,夾角正負滿足叉積

double angle(point o,point s,point e)

//p在l上的投影與l關係

double relation(point p,line l)

//p在l上的垂足

point perpendicular(point p,line l)

//求點p到線段l的最短距離,並返回線段上距該點最近的點np

double dist_p_to_seg(point p,line l,point &np)

if(r>1)

np=perpendicular(p,l);

return dist(p,np);

}//求點p到直線l的最短距離

double dist_p_to_line(point p,line l)

//線段之間最短距離

inline double dist_seg_to_seg(line p,line q)

//求向量線段夾角的余弦

double cosine(line u,line v)

//求向量的夾角的余弦

double cosine(point a,point b)

//求線段夾角

double lsangle(line u,line v)

//求直線斜率

double slope(line2 l)

//直線傾斜角[0,pi]

double alpha(line2 l)

//點關於直線的對稱點

point symmetry(line2 l,point p)

//判多邊形是否逆時針

bool is_unclock(polygon pg)

//改變多邊形時針順序

void to_unclock(polygon &pg)

//判點在多邊形內部

inline int p_in_polygon(point a,point p,int n)

}if (count%2)return 1;

return 0;

}//多邊形內部最長線段

point stk[maxn];

double seg_max_len(line u,polygon &pg)

if (fabs(t1)>eps)

ret.x/=t1,ret.y/=t1;

return ret;

}//求多邊形面積

inline double getarea(point pg,int n)

if(blp&&!bln)

}return ;

}//判斷點p在圓c內

bool p_in_circle(point p,circle c)

//求矩形第4個點

point rect4th(point a,point b,point c)

//判圓與矩形關係,矩形水平

bool circle_in_rec(circle c,rectangle r) {

if( r.a.x < c.o.x && c.o.x < r.b.x && r.c.y < c.o.y && c.o.y < r.b.y ) {

line line1(r.a, r.b);

line line2(r.b, r.c);

line line3(r.c, r.d);

line line4(r.d, r.a);

if(c.r

計算幾何常用演算法介紹

計算幾何常用演算法介紹 1.向量減法 設二維向量 p x1,y1 q x2,y2 則向量減法定義為 p q x1 x2 y1 y2 顯然有性質 p q q p 如不加說明,下面所有的點都看作向量,兩點的減法就是向量相減 2.向量叉積 設向量p x1,y1 q x2,y2 則向量叉積定義為 p q x...

計算幾何常用演算法 ACM

複製自 1.向量減法 設二維向量 p x1,y1 q x2,y2 則向量減法定義為 p q x1 x2 y1 y2 顯然有性質 p q q p 如不加說明,下面所有的點都看作向量,兩點的減法就是向量相減 2.向量叉積 設向量p x1,y1 q x2,y2 則向量叉積定義為 p q x1 y2 x2 ...

Oracle 常用計算

時間計算 oracle 兩個時間相減預設的是天數 oracle 兩個時間相減預設的是天數 24 為相差的小時數 oracle 兩個時間相減預設的是天數 24 60 為相差的分鐘數 oracle 兩個時間相減預設的是天數 24 60 60 為相差的秒數 months between date2,dat...