Modiz 《幾何模板》

2021-06-25 23:47:04 字數 3895 閱讀 8731

#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...