Save the Students! UVALive - 5984 (几何判断点在三角形、圆、矩形)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>

using namespace std;
struct point{
    double x,y;
};
struct TRI{
    int x1,x2,x3,y1,y2,y3;
}Tri[60];
struct CIR{
    int x,y,r;
}Cir[60];
struct SQU{
    int x,y,l;
}Squ[60];
int numT,numC,numS;
void init(){
    numT = numC = numS = 0;
}
double cross(point A,point B){
    return fabs(A.x*B.y-A.y*B.x);
}
bool judgeT(int x,int y){
    double s1,s2,s3,s;
    point q,p;
    for(int i = 1;i<=numT;i++){
        q.x = (double)(Tri[i].x1-x);
        q.y = (double)(Tri[i].y1-y);
        p.x = (double)(Tri[i].x2-x);
        p.y = (double)(Tri[i].y2-y);
        s1 = cross(q,p);

        q.x = (double)(Tri[i].x1-x);
        q.y = (double)(Tri[i].y1-y);
        p.x = (double)(Tri[i].x3-x);
        p.y = (double)(Tri[i].y3-y);
        s2 = cross(q,p);

        q.x = (double)(Tri[i].x3-x);
        q.y = (double)(Tri[i].y3-y);
        p.x = (double)(Tri[i].x2-x);
        p.y = (double)(Tri[i].y2-y);
        s3 = cross(q,p);

        q.x = (double)(Tri[i].x1-Tri[i].x3);
        q.y = (double)(Tri[i].y1-Tri[i].y3);
        p.x = (double)(Tri[i].x2-Tri[i].x3);
        p.y = (double)(Tri[i].y2-Tri[i].y3);
        s = cross(q,p);
        if(s1+s2+s3==s)return true;
    }
    return false;
}
bool judgeC(int x,int y){
    for(int i=1;i<=numC;i++){
        if((x-Cir[i].x)*(x-Cir[i].x)+(y-Cir[i].y)*(y-Cir[i].y)<=Cir[i].r*Cir[i].r)return true;
    }
    return false;
}
bool judgeS(int x,int y){
    for(int i=1;i<=numS;i++){
        if(x>=Squ[i].x&&x<=Squ[i].x+Squ[i].l&&y>=Squ[i].y&&y<=Squ[i].y+Squ[i].l)return true;
    }
    return false;
}
int main(){
    int T,n;
    char ch[5];
    scanf("%d",&T);
    while(T--){
        init();
        scanf("%d",&n);
        while(n--){
            scanf("%s",ch);
            if(ch[0]=='T'){
                numT++;
                scanf("%d%d%d%d%d%d",&Tri[numT].x1,
                      &Tri[numT].y1,&Tri[numT].x2,
                      &Tri[numT].y2,&Tri[numT].x3,&Tri[numT].y3);
            }
            else if(ch[0]=='C'){
                numC++;
                scanf("%d%d%d",&Cir[numC].x,&Cir[numC].y,&Cir[numC].r);
            }
            else{
                numS ++;
                scanf("%d%d%d",&Squ[numS].x,&Squ[numS].y,&Squ[numS].l);
            }
        }
        int num = 0;
        for(int x = -200;x<=200;x++){
            for(int y = -200;y<=200;y++){
                if(judgeT(x,y)){
                    num++;
                    continue;
                }
                else if(judgeC(x,y)){
                    num++;
                    continue;
                }
                else if(judgeS(x,y)){
                    num++;
                    continue;
                }
            }
        }
        printf("%d\n",num);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值