ZBT的计算几何模板

Basic template

一个基础型模板包括一个向量的实现

DATE: 2015-06-01

#define op operator
#define __ while
#define _0 return
typedef long long ll;
inline ll _(ll a,ll b){ll t;__(a){t=a;a=b%a;b=t;}_0 b;}
struct frac{
	ll u,d;
	frac(ll u=0,ll d=1):u(u),d(d){}
	frac op()(){ll _1=_(u,d);_0 frac(u/_1,d/_1);}
	frac op*(frac b){_0 (frac(u*b.u,d*b.d))();}
	frac op/(frac b){_0 (frac(u*b.d,d*b.u))();}
	frac op*(ll n){_0 (frac(u*n,d))();}
	frac op/(ll n){_0 (frac(u,d*n))();}
	frac op[](ll n){_0 frac(u*n,d*n);}
	frac op+(ll n){_0 frac(u+d*n,d);}
	frac op-(ll n){_0 frac(u-d*n,d);}
	frac op+(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u+_2.u,_1.d))();}
	frac op-(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u-_2.u,_1.d))();}
	void op=(ll b){d=1,u=b;}
	ll op()(frac b){return u*b.d-d*b.u;}//<=>
	bool op==(frac b){return u==b.u&&d==b.d;}
	bool op>(frac b){return b(*this)<0;}
	bool op<(frac b){return b(*this)>0;}
};
frac op/(ll a,frac b){_0 (frac(b.d*a,b.u))();}
frac op-(ll a,frac b){_0 frac(a)-b;}
frac op+(ll a,frac b){_0 frac(a)+b;}
frac op*(ll a,frac b){_0 (frac(a*b.u,b.d))();}
typedef struct vec{
	frac x,y;
	vec(frac x,frac y):x(x),y(y){};
	vec op+(vec b){_0 vec(x+b.x,y+b.y);}
	vec op-(vec b){_0 vec(x-b.x,y-b.y);}
	vec op*(frac b){_0 vec(x*b,y*b);}
	vec op/(frac b){_0 vec(x/b,y/b);}
	vec op*(ll b){_0 vec(x*b,y*b);}
	vec op/(ll b){_0 vec(x/b,y/b);}
	frac op*(vec b){_0 x*b.y-y*b.x;}//cross product
	frac op[](vec b){_0 x*b.x+y*b.y;}//dot product
	bool op==(vec b){_0 x==b.x&&y==b.y;}//equality test
} point;

本模板风格可能引起不适>_<

其实,用‘[]‘做dot product是因为C++中无法重载‘.‘运算符,而在大多数动态语言(比如javascript)中‘.‘与‘[]‘的作用几乎相等,且在javascript‘.‘是一个‘[]‘的语法糖.

frac里就直接乱凑剩下的符号了>_<

有错误的话请提出来>_<...

时间: 2024-10-13 21:21:31

ZBT的计算几何模板的相关文章

【模板整合】【及时更新】【天坑】计算几何模板

计算几何模板要写的内容真多- 我写烦了-先写这些放上来吧- #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #define MAXDBL 1e20 #define eps 1e-9 #define pi acos(-1) using namespace std; stru

【转】计算几何模板

[转载注明出处 @AOQNRMGYXLMV ] #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; //lrj计算几何模板 struct Point { double x, y; Point(double x=0, double y=0) :x(x),y(y) {} }; typedef Point Vector; Poi

lrj计算几何模板

整理了一下大白书上的计算几何模板. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 //lrj计算几何模板 6 struct Point 7 { 8 double x, y; 9 Point(double x=0, double y=0) :x(x),y(y) {} 10 }; 11 typedef Point Vector; 12 const

计算几何模板(刘汝佳本)(转载)

转载自: 计算几何模板(仿照刘汝佳大白书风格) 想想自己一个学期连紫皮都没看完就想自杀 // Geometry.cpp #include <bits/stdc++.h> #define LL long long #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define PI 3.1415926535897932384626 #define EXIT exit(0); #define DEBUG puts(

计算几何模板

是时候贴一些几何模板了.. #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<algorithm> #include<queue> #include<cmath> #include<vector> using namespace std; #define mnx 50050 #define LL lon

hdu 3060 Area2 (计算几何模板)

Problem Description 小白最近又被空军特招为飞行员,参与一项实战演习.演习的内容还是轰炸某个岛屿(这次的岛屿很大,很大很大很大,大到炸弹怎么扔都能完全在岛屿上引爆),看来小白确实是飞行员的命...这一次,小白扔的炸弹比较奇怪,爆炸的覆盖区域不是圆形,而是一个不规则的简单多边形,请你再次帮助小白,计算出炸到了多少面积.需要注意的是,这次小白一共扔了两枚炸弹,但是两枚炸弹炸到的公共部分的面积只能计算一次. Input 首先输入两个数n,m,分别代表两枚炸弹爆炸覆盖到的图形的顶点数:

LA 3263 好看的一笔画 欧拉几何+计算几何模板

题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> using namespace std; struct Point { double x, y; Point(double x = 0, double y = 0) : x(x) , y(y) { } }; typedef Point V

计算几何模板 (bzoj 1336,poj 2451 ,poj3968)

poj 3968 (bzoj 2642) 二分+半平面交,每次不用排序,这是几个算几版综合. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<deque> using namespace std; #define MAXN 100000 na

3维计算几何模板

#include <iostream> #include <cmath> #include <vector> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define MAX_N 110 /*------------------常量区-------------------*/ const double INF =