计算几何的模板

其实还是万能的模板!!!!万岁~

#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()
{


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值