POJ3304 Computation Geometry

本文深入探讨了计算几何领域的核心算法,包括点、线段、向量等基本元素的定义与操作,以及如何判断线段相交等关键问题。通过具体的代码实现,详细解析了几何计算中的距离、角度和交叉点等计算方法。

计算几何

//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
typedef double db;
const db eps=1e-8;
const db pi=acos(-1);
int sign(db x){if(x>eps)return 1;if(x<-eps)return -1;return 0;}
int cmp(db x,db y){return sign(x-y);}
int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=0;}
struct Point{
    db x,y;
    Point operator + (const Point &a)const{return Point{a.x+x,a.y+y};}
    Point operator - (const Point &a)const{return Point{a.x-x,a.y-y};}
    Point operator * (db a) const{return (Point){x*a,y*a};}
    Point operator / (db a) const{return (Point){x/a,y/a};}
};
db cross(Point p1,Point p2){return p1.x*p2.y-p1.y*p2.x;}
db cross(Point p0,Point p1,Point p2){return cross(p1-p0,p2-p0);}
db dot(Point p1,Point p2){return p1.x*p2.x+p1.y*p2.y;}
struct Line{
    Point s,e;
    db length(){return sqrt(dot(s-e,s-e));}
};
bool intersect(Line l1,Line l2){
    return sign(cross(l2.s,l1.s,l1.e))*sign(cross(l2.e,l1.s,l1.e))<=0;
}

Line A[1000];
int n;
int check(Line x){
    if(sign(x.length())==0)return 0;
    for(int i=1;i<=n;++i)if(intersect(x,A[i])==0)return 0;
    return 1;
}
int main(){
    int T;cin>>T;while(T--){
        cin>>n;
        db x1,y1,x2,y2;
        for(int i=1;i<=n;++i){
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            A[i]=Line{Point{x1,y1},Point{x2,y2}};
        }
        int ans=0;
        for(int i=1;i<=n&&ans==0;++i){
            for(int j=1;j<=n&&ans==0;++j){
                if(check(Line{A[i].s, A[j].s}) || check(Line{A[i].s, A[j].e}) ||
                    check(Line{A[i].e, A[j].s}) || check(Line{A[i].e, A[j].e})){
                    ans=1;
                }
            }
        }
        cout<<(ans?"Yes!":"No!")<<endl;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值