直線的正交/平行判定
/*兩個向量a,b正交,等價於,向量a,b的點積為0*/
bool isorthogonal(vector a,vector b){
return equals(dot(a,b),0.0);
bool isorthogonal(point a1,point a2,point b1,point b2){
return isorthogonal(a1-a2,b1-b2);
bool isorthogonal(segment s1,segment s2){
return equals(dot(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
/*兩個向量a,b平行,等價於,向量a,b的叉積為0*/
bool isparallel(vector a,vector b){
return equals(cross(a,b),0.0);
bool isparallel(point a1,point a2,point b1,point b2){
return isparallel(a1-a2,b1-b2);
bool isparallel(segment s1,segment s2){
return equals(cross(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
point project(segment s,point p){
vector base=s.p2-s,p1;
double r=dot(p-s.p1,base)/norm(base);
return s.p1+base*r;
/*\以線段s為對稱軸與點p成線對稱的點*/
point reflect(segment s,point p){
return p+(project(s,p)-p)*2.0;
/*兩點間的距離*/
double getdistance(point a,point b){
return abs(a-b);
/*直線l與點p的距離*/
double getdistancelp(line l,point p){
return abs(cross(l.p2-l.p1)/abs(l.p2-l.p1));
/*線段s與點p的距離*/
double getdistancesp(segment s,point p){
if(dot(s.p2-s.p1,p-s.p1)<0.0)return abs(p-s.p1);
if(dot(s.p1-s.p2,p-s.p2)<0.0)return abs(p-s.p2);
`return getdistancelp(s,p);
/*線段s1與線段s2的距離*/
double getdistance(segment s1,segment s2){
if(intersect(s1,s2))return 0.0;
return min(min(getdistance(s1,s2.p1),getdistance(s1,s2.p2)),min(getdistance(s2,s1.p1),getdistance(s2,s1.p2)));
計算幾何 模板總結
計算幾何終極模板 總結 pragma comment linker,stack 102400000,102400000 include bits stdc h define pb push back define ls l,m,now 1 define rs m 1,r,now 1 1 define...
計算幾何模板總結(一)
這一部分主要總結一下在 挑戰程式設計競賽 二 中的一些 常用預處理 define eps 1e 10 設定精度 define pi acos 1 精確圓周率 define inf 1e20 設定無限大 define equals a,b fabs a b 利用c 和stl,對一些基本圖形進行了封裝 ...
計算幾何 二維幾何 模板
幾何意義 向量的點積 a b a b a b cos cos 若cos cos 為正,兩向量之間的夾角為銳角 為負,兩向量夾角為鈍角 為量,兩向量夾角為直角。b在a方向上的投影 向量的叉積 a b a b a b sin sin 數值上表示a和b構成的平行四邊形的面積。include using n...