计算几何知识整理

1、判断一个点是否在三角形内

  把这个点与三角形的顶点连线,算出这三个小三角形的面积之和与大三角形对比

    

double gs(double x1,double x2,double x3,double y1,double y2,double y3)
{
    return abs((x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2)));
}
int pd()
{
    double sabc=gs(po[1].x,po[2].x,po[3].x,po[1].y,po[2].y,po[3].y)*100;
    double sadb=gs(po[1].x,po[2].x,po[4].x,po[1].y,po[2].y,po[4].y)*100;
    double sadc=gs(po[1].x,po[3].x,po[4].x,po[1].y,po[3].y,po[4].y)*100;
    double sbdc=gs(po[2].x,po[3].x,po[4].x,po[2].y,po[3].y,po[4].y)*100;
    double tot=sadb+sadc+sbdc;
    if(sadb==0||sadc==0||sbdc==0)
        return 3;
    if(tot==sabc)
        return 1;
    if(tot!=sabc)
        return 2;
    return 2; 
}

2、皮克定理

  皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为2S=2a+b-2,其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积。

    

int gcd(int a,int b)
{
    while(b>0)
    {
        int c=a%b;
        a=b;
        b=c;
    }
    return a;
}
int main()
{
    cin>>n>>m>>p;
    b+=gcd(n,m);
    b+=p-1;
    b+=gcd(abs(n-p),m);
    s=(p*m);
    a=s-b+2;
    cout<<a/2;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SpeedZone/p/9338865.html