您的位置:首页 > 其它

计算几何的模板

2014-08-18 14:50 337 查看
其实还是万能的模板!!!!万岁~

#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const double eps=1e-8;
struct point{
double x,y;
point(double x=0,double y=0):x(x),y(y) {};
};
int dcmp(double x)
{
if(fabs(x)<eps)return 1;
if(x>0)return 0;
return -1;
}
point operator +(const point &a,const point &b){
return point(a.x+b.x,a.y+b.y);
}

point operator -(const point &a,const point &b){
return point(a.x-b.x,a.y-b.y);
}

point operator *(const point &a,const double p){
return point(a.x*p,a.y*p);
}
point operator /(const point &a,const double p){
return point(a.x/p,a.y/p);
}
bool operator < (const point &a,const point &b){
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}

bool operator ==(const point &a,const point &b)
{
return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double dot (const point a,const point b)
{
return a.x*b.x+a.y*b.y;
}
double len (const point a)
{
return a.x*a.x+a.y*a.y;
}
double ang (const point a,const point b)
{
return acos(dot(a,b)/len(a)/len(b));
}
double cross (const point a,const point b)
{
return a.x*b.y-a.y*b.x;
}
double area (const point a,const point b,const point c)
{
return cross(b-a,c-a);
}
double pointoline(const point p,const point a,const point b)
{
return fabs(cross(b-a,p-a)/len(b-a));
}
double leastoline(const point p,const point a,const point b)
{
if(a==b) return len(p-a);
point v1=b-a,v2=p-a,v3=p-a;
if(dcmp(dot(v1,v2))<0) return len(v2);
if(dcmp(dot(v1,v3))>0) return len(v3);
return fabs(cross(v1,v2))/len(v1);
}
bool standardcoss(const point a1,const point a2,const point b1,const point b2)
{
double c1 = cross(a2-a1, b1-a1), c2 = cross(a2-a1, b2-a1),c3 = cross(b2-b1, a1-b1), c4 = cross(b2-b1, a2-b1);
return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0;
}
bool OnSegment(point p,point a1,point a2)
{
return dcmp(cross(a1-p,a2-p))==0&&dcmp(dot(a1-p,a2-p))<0; //线段包含端点时改成<=
}
double PolygonArea(vector<point> p)
{
int n = p.size();
double area = 0;
for(int i = 1; i < n-1; i++)
area += cross(p[i]-p[0], p[i+1]-p[0]);
return area/2;
}
int isPointinPolygon(point p,vector<point>poly)
{
int wn=0;
int n=poly.size();
for (int i=0;i<n;i++)
{
if (OnSegment(p,poly[i],poly[(i+1)%n])) return -1;    //边界
int k=dcmp(cross(poly[(i+1)%n]-poly[i],p-poly[i]));
int d1=dcmp(poly[i].y-p.y);
int d2=dcmp(poly[(i+1)%n].y - p.y);
if (k>0&&d1<=0&&d2>0) wn++;
if (k<0&&d2<=0&&d1>0) wn--;
}
if (wn!=0) return 1;  //内部
return 0;   //外部
}
point PolyGravity(point *p,int n)
{
point ans=point(0,0);
double sumArea=0,area;
for(int i=2;i<n;i++)
{
area=cross(p[i-1]-p[0],p[i]-p[0]);
sumArea+=area;
ans.x+=(p[0].x+p[i-1].x+p[i].x)*area;
ans.y+=(p[0].y+p[i-1].y+p[i].y)*area;
}
return ans/(sumArea*3);
}

int main()
{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: