這幾天學計算幾何,感覺自己很適合做這種型別的題目。。畢竟數學還算學的不錯。。尤其是幾何。。
模版是照著白書上敲的,會用就好,原理也都很簡單,能寫成函式並且運用就是好的。
模版如下,方便以後自己用
#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 在計算幾何中用向量表示,整個題統一以向量的左側或右側為半平面。半平面交就是多個半平面的交集。半平面交是乙個點集。它可以...