#include#include#include#include#include#include#define eps 1e-9
#include#define pi acos(-1)
using namespace std;
const double pi = acos(-1.0);
int dcmp( double x )
struct point
}node[112];
typedef point vector;
struct segment
segment(point _a,point _b)
};struct circle
circle(point _c, double _r):c(_c),r(_r) {}
point ppp(double a)const
};struct line
line( const point &_p, const point &_v):p(_p),v(_v)
inline bool operator < (const line &l)const
};point operator + (point a,point b)
point operator - (point a,point b)
point operator * (point a,double b)
point operator / (point a,double b)
bool operator < (const point &a, const point &b )
bool operator == (const point &a, const point &b )
bool operator != (const point &a,const point &b )
double dot( point a,point b ) // 點到點的距離 //點積 ab=|a||b|cos@
double length( point a ) // 向量長度
double angle( point a,point b ) // 兩個向量的角度
double d_t_d(const double deg) //弧度轉換成角度
// 向量旋轉 rad 度數 rad>0逆時針,rad<0順時針
point rotate( point a, double rad )
// 向量的 法線向量 的單位向量 ==向量逆時針旋轉90度
point normal( point a )
// 叉積計算 a*b=|a||b|sin@;
double cross( point a,point b )
// 獲取 兩個向量叉積 判斷點pot在直線ab的位置,結果為正在左邊,結果為負在右邊
double get_mix( point a,point b,point pot )
// 直線相交求交點
point get_line_inter( point p,point v, point q,point w )
// p點到直線 的距離
double dis_p_line( point p,point a,point b )
//點在直線上的投影
inline point getlineprojection(const point &p,const point &a,const point &b)
// 點到線段的距離
double dis_p_segm( point p,point a,point b )
//海**式 三條邊
double heron(double a,double b,double c)
// 多邊形面積 從p[0] 開始,p[n] 結束
double ploy_area( vectorp,int n )
// 線段相交判斷 先必須去掉不相交的狀態;再判斷方向
bool get_set(const point& a1, const point& a2, const point& b1, const point& b2)
return 0;
}// 線段 直線 平行判斷只需要對應向量平行;
bool get_pall( point a,point b,point c,point d )
// 直線 重合判斷 只需要 一條直線的兩點都在直線方向
bool get_doub( point a,point b,point c,point d )
// 獲取 線段 交點;依據 叉積判斷
point get_pot( point a,point b,point c,point d )
//獲取直線的交點 同時也可以是線段的交點;
point get_ppp( point a,point b,point c,point d )
bool online( point a,point b,point pot )
//p為點,poly為多邊形 點在多邊形內判定
int ispointinpolygon(const point& p, const vectorpoly)
if (wn != 0) return 1; //內部
return 0; //外部
}int top,res[1123456]; // 凸包 ( 起點 0 ) ( n 個點 ) 自己寫的,,需要改進 改進;
void gra( int n )
int k = top;
for( int i = n-2; i >= 0; i-- )
top--; // 會新增進去最後乙個點
}//求兩圓相交
int c_t_c( circle c1,circle c2,point &p1,point &p2 )
if( dcmp( c1.r + c2.r - d ) < 0 ) return 0;
if( dcmp( fabs( c1.r - c2.r ) - d ) > 0 ) return 0;
double a = angle( c2.c - c1.c,point( 1,0 ) );
double da = acos(( c1.r * c1.r + d * d - c2.r * c2.r )/( 2 * c1.r * d ) );
p1 = c1.ppp( a - da ); p2 = c1.ppp( a + da );
if( p1 == p2 ) return 1;
return 2;
}//圓與直線交點 返回交點個數
int c_t_l( line l,circle c,point &p1,point &p2)//相交
p1 = ( l.p + l.v * ( -f-sqrt(delta) )/( 2*e ) );
p2 = ( l.p + l.v * ( -f+sqrt(delta) )/( 2*e ) );
return 2;
}//點與圓的切線;
int get_p_c_inter( point p,circle c, point *v )
else
return -1;
}//判斷點d是否在三角形a,b,c內
bool inthree(const point a,const point b,const point c,const point d)
//大圓包含小圓
double a1=acos((d*d+a.r*a.r-b.r*b.r)/(2*a.r*d));
double b1=acos((d*d+b.r*b.r-a.r*a.r)/(2*b.r*d));
double s=a1*a.r*a.r+b1*b.r*b.r;
double s1=a.r*d*sin(a1);
return s-s1;
}int main()
計算幾何模板
sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...
計算幾何模板
include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...
計算幾何模板
多圓面積交 typedef long long ll typedef unsigned long long ull typedef vector vi const int inf 0x3f3f3f3f const double eps 1e 10 const int mod 100000007 co...