計算幾何模板

2021-10-21 20:05:33 字數 4108 閱讀 2195

#include

//使用scanf和printf的標頭檔案

#include

//使用c風格字串函式的標頭檔案

#include

//使用演算法庫的標頭檔案,max,min,swap,sort等

#include

//使用cin,cout的標頭檔案

#include

//數學標頭檔案

#include

//使用memset函式的標頭檔案

#define ll long long

#define ull unsigned long long

#define df double

#define rep(i,a,b) for(int i=(a);i<=(b);++i)

#define fep(i,a,b) for(int i=(b);i>=(a);--i)

#define scf(x) scanf("%d",&x)

#define prf(x) printf("%d\n",x)

#define ddprf(x,y) printf("\n",x,y)

#define deprf(x) printf("[%d]\n",x)

#define dect(x) cout<<'['<#define mset(x,y) memset(x,y,sizeof(x))

#define fopen freopen("t2.in","r",stdin);

#define ac return 0

#define prf1(x) printf("! %d\n",x)

#define prf2(x) printf("? %d\n",x);

const

int maxn=

1e5+10;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

const

double eps=

1e-8

;const

double pi=

3.1415926535

;const ull base=

233;

using

namespace std;

struct pot//點

//建構函式初始化 };

typedef pot vec;

double

check

(vec a,vec b)

//(α×β=∣α∣∣β∣sinθ)叉積

double

operator

^(pot a,pot b)

vec operator

-(pot b,pot a)

vec operator

+(pot a,pot b)

//(根據兩個點返回向量);

vec operator

*(vec a,

double k)

//向量乘以乙個常數(及對向量的拉伸,返回向量)

vec operator

/(vec a,

double k)

//向量除以乙個常數(及對向量的收縮,返回向量)!!注意k不為0 !!

bool

operator

<

(const pot a,

const pot b)

//判斷兩個點之間的大小(橫座標作為第一縱座標作為第二引數進行判斷)

bool

operator==(

const pot a,

const pot b)

//(判斷點或向量是否相等)

//(點積滿**換律)

double

dot(vec a,vec b)

//對向量取模求長度

double

length

(vec a)

;//(判斷a向量是否在b向量逆時針方向上)

bool

toleft

(pot a,pot b,pot c)

//用三態函式減小精度問題(判斷double正負)

intsgn

(double x)

struct line//線(點和方向向量構成)

pot get_pot_in_line

(double x)};

//判斷點和直線的位置

intrelation

(pot a,pot b,pot c)

//一定要保證兩直線有交點並且 check(v1,w)!=0

pot line_sp

(pot a1,vec v1,pot a2,vec v2)

//直線到點的距離

double

dis_pot_line

(pot a,pot b,pot c)

//求點在直線上的投影點

pot foot_pot

(pot a,pot b,pot p)

//求點到直線的對稱點

pot sy_pl

(pot a,pot b,pot p)

bool

on_s

(pot a,pot b,pot p)

//點p到線段ab的距離

double

dis_to_s

(pot a,pot b,pot p)

//兩點之間的距離

double

dis_p

(pot a,pot b)

//向量逆時針(向下轉)旋轉90。

vec normal

(vec a)

//向量逆時針旋轉p度|x y|x|cos0 -sin0|

// |sin0 cos0|

vec rotate

(vec a,

double p)

//判斷兩個線段是否相交//算端點加等號

bool

s_inter

(pot a1,pot b1,pot a2,pot b2)

//求多邊形面積,點要逆時針存不然有問題

double

area

(pot p,

int n)

return ans/

2.0;

}//交換兩點座標

inline

void

psp(pot &a,pot &b)

//凸包

pot tp[maxn]

;//tp[1]是y值最小的點

bool

tpcmp

(pot p1,pot p2)

pot s[maxn]

;//凸包上的點

bool

is_tpo

(pot p,

int n)

//判斷是否形成凸包

return1;

}int top;

void

tpo(

)//printf("***");

sort

(tp+

2,tp+

1+n,tpcmp)

; s[1]

=tp[1]

;top=1;

for(

int i=

2;i<=n;i++

) s[top+1]

=tp[1]

;//形成閉圈

}//旋轉卡殼

void

r_cl()

}//圓

struct cir

;double

area()

intis_relation

(cir a)};

//求三角形重心

cir tri_g

(pot a,pot b,pot c)

//求三角心外心

cir tri_p

(pot a,pot b,pot c)

//判斷點是否在凸多邊形內

intin_pn

(pot a,pot p,

int n)

}void

solve()

intmain()

計算幾何模板

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