平面計算幾何模版集合

2021-06-25 07:15:19 字數 3126 閱讀 1677

這幾天學計算幾何,感覺自己很適合做這種型別的題目。。畢竟數學還算學的不錯。。尤其是幾何。。

模版是照著白書上敲的,會用就好,原理也都很簡單,能寫成函式並且運用就是好的。

模版如下,方便以後自己用

#include #include #include #include #include #include using namespace std;

const double pi = acos(-1.0);

const double maxn = 1000000.0;

struct point

};typedef point vec;

//向量+向量 = 向量,點+向量 = 點

vec operator +(vec a,vec b)

//點-點 = 向量

vec operator -(point a,point b)

//向量*數 = 向量

vec operator *(vec a,double p)

//向量/數 = 向量

vec operator /(vec a,double p)

bool operator <(const point& a,const point& b)

//點在直線上的投影

point getlineprojection(point p,line a)

//判斷兩條線段是否相交 此處必須為規範相交

bool segmentproperintersection(point a1,point a2,point b1,point b2)

//如果允許端點相交,則用以下**,判斷乙個點是否在一條線段上

bool onsegment(point p,point a1,point a2)

/******====以上為點和直線,直線和直線關係的內容*****===*/

//判斷點和多邊形位置關係

int ispointinpolygon(point p, const vector& poly)

if(w != 0)return 1;

return 0;

}//多邊形有向面積

double polygonarea(vectorp)

point getintersection(line a, line b)

int halfplaneintersection(line* l,int n,point* poly)

int k = m;

for(int i = n-2;i>=0;i--)

if(n > 1)m--;

ch.resize(m);

return ch;

}/***********===以上為凸包***********/

double earthdis(point a,point b)

/******==給出經緯度,算出球體上兩點之間的角度******/

//判斷圓和直線交點,方程法

int getlinecircleintersection(line l, circle c, double& t1,double& t2,vector& sol)

//相交

t1 = (-f - sqrt(delta)) / (2*e); sol.push_back(l.point(t1));

t2 = (-f + sqrt(delta)) / (2*e); sol.push_back(l.point(t2));

return 2;

}//圓和直線交點,幾何法

int getlinecircleintersection(line l, circle c,vector& sol)

//相交

double len = sqrt(c.r*c.r-d*d);

vec v = l.v / length(l.v);

sol.push_back(ans + v * len),sol.push_back(ans - v * len);

return 2;

}//判斷兩圓相交

int getcirclecircleintersection(circle c1, circle c2, vector& sol)

if(dcmp(c1.r + c2.r -d) < 0) return 0;//外離

if(dcmp(fabs(c1.r-c2.r)-d)>0)return 0;//內含

if(dcmp(c1.r + c2.r - d) == 0 || dcmp(fabs(c1.r - c2.r)-d) == 0)//外切或內切

double a = ang(c2.c - c1.c);

double da = acos((c1.r * c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));

point p1 = c1.point(a-da),p2 = c1.point(a+da);

sol.push_back(p1);

sol.push_back(p2);

return 2;//相交

}//過點p到圓c的切線

int gettangents(point p,circle c,vector& l)else

}//兩圓公切線,返回切線條數,-1表示無窮多條

//sol裡存的是切線,p為a上切點,p+v為b上切點

int gettangents(circle a,circle b,vector& sol)

//有外切線

double ang = acos((a.r-b.r) / sqrt(d2));

a = a.point(base+ang),b = b.point(base+ang),sol.push_back(line(a,b-a)),cnt++;

a = a.point(base-ang),b = b.point(base-ang),sol.push_back(line(a,b-a)),cnt++;

if(dcmp(d2 - rsum * rsum)==0)else if(dcmp(d2 - rsum * rsum)>0)

return cnt;

}/***********以上為圓的常用函式及計算***********/

int main()

計算幾何 半平面交

la 4992 hdu 3761 jungle outpost 杭電的有點坑啊。一直爆記憶體,後來發現大白的半平面交模板那裡 point p new point n line q new line n 這裡出了問題,應該是在函式裡面申請不了比較大的陣列,所以爆記憶體。我在全域性定義了兩個陣列就不會爆...

計算幾何 半平面交

step1.將所有半平面按極角排序,對於極角相同的,選擇性的保留乙個。o nlogn step2.使用乙個雙端佇列 deque 加入最開始2個半平面。step3.每次考慮乙個新的半平面 a.while deque頂端的兩個半平面的交點在當前半平面外 刪除deque頂端的半平面 b.while deq...

計算幾何 半平面交

平面內的一條直線把這個平面分成兩部分,每一部分對這個平面來說,都叫做半平面。包括這條直線的半平面叫做閉半平面,否則叫做開半平面。解析式為 ax by c 0 或 ax by c 0 在計算幾何中用向量表示,整個題統一以向量的左側或右側為半平面。半平面交就是多個半平面的交集。半平面交是乙個點集。它可以...