poj 3304

本文探讨了一个涉及线段投影的问题,通过使用浮点数运算来判断是否存在一条直线能够穿过所有给定线段,并确保其投影有一个共同交点。文章提供了具体的C++实现代码,展示了如何通过计算几何的方法解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浮点数真的是日了狗了,我操,
题意:给出n个线段,求是否有一条直线,使得这n个线段在这条直线上的投影 有一个公共点。其实就是问有没有一条直线可以穿过所有的线段,该直线的垂线就是 n个线段的投影线。 TMD沙比的不行啊,浮点数判0 ,要用fabs < eps; `

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

using namespace std;
int n;
struct point{
    double x,y;
};
struct line{
    double a,b,c;
};
struct seg {
    point a;
    point b;
};
seg data[200]={}; point ans[300]={};
void Coeffcient(line &L,point a,point b) {
    L.a = (a.y-b.y);
    L.b = (b.x-a.x);
    L.c = -L.a*a.x-L.b*a.y;
}
bool jiao(line L,point a,point b) { // 线段ab  在直线L的两侧;
    double A = a.x*L.a+a.y*L.b+L.c;
    double B = b.x*L.a+b.y*L.b+L.c;
    ***if(A*B <= 0 || (fabs(A) < 0.00000001 || fabs(B) < 0.00000001)) return 1;***
    return 0;
}
bool solve() {
    int len = n*2;
    for(int i = 0; i < len; i++) {
        for(int j = i + 1; j < len; j++) {
            line L; Coeffcient(L,ans[i],ans[j]);
            bool flag = 1;
            if(fabs(ans[i].x-ans[j].x) < 0.00000001 && fabs(ans[i].y-ans[j].y) < 0.00000001)
              continue;
            for(int k = 0; k < n; k++) {
                if(jiao(L,data[k].a,data[k].b))
                  continue;
                else {
                    flag = 0;
                    break;
                }
            }
            if(flag) return 1;
        }
    }
    return 0;
}
int main() {
    int t;scanf("%d",&t);

    while(t--) {
        scanf("%d",&n);
        int co = 0;
        for(int i = 0; i < n; i++) {
            scanf("%lf %lf %lf %lf",&data[i].a.x,&data[i].a.y,&data[i].b.x,&data[i].b.y);
            ans[co++] = data[i].a;ans[co++] = data[i].b;
        }
        if(solve()) printf("Yes!\n");
        else printf("No!\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值