NEFU 922 判断线段相交

本文介绍了一种用于检测和判断几何形状是否相交或共线的算法,通过计算点与线段之间的关系来实现。该算法适用于多边形检测、碰撞检测等领域。

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=922

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef struct
{
    int x,y;
}sa;
int chaji(sa a,sa b,sa c)//计算ca和cb
{
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
bool online(sa a,sa b,sa c) //判断点c是否在线段ab上
{
    if(min(a.x,b.x)<=c.x&&c.x<=max(a.x,b.x))
    {
        if(min(a.y,b.y)<=c.y&&c.y<=max(a.y,b.y))
        {
            return 1;
        }
    }
    return 0;
}
bool xj(sa a,sa b,sa c,sa d)
{
    int d1=chaji(c,d,a);//计算ac,ad
    int d2=chaji(c,d,b);//bc,bd
    int d3=chaji(a,b,c);//ca,cb
    int d4=chaji(a,b,d);//db,da
    if(d1*d2<0&&d3*d4<0)
        return 1;
    else if(d1==0&&online(c,d,a))
        return 1;
    else if(d2==0&&online(c,d,b))
        return 1;
    else if(d3==0&&online(a,b,c))
        return 1;
    else if(d4==0&&online(a,b,d))
        return 1;
    return 0;
}
int main()
{
    sa data[5];
    int m;
    while(cin>>m&&m)
    {
        while(m--)
        {
            for(int i=0;i<4;i++)
               cin>>data[i].x>>data[i].y;
            if(xj(data[0],data[1],data[2],data[3]))
               cout<<"YES"<<endl;
            else
               cout<<"no"<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值