给4个点求两线段相交(水)

好几天没写博客啦,我们数字逻辑课程要考试了,现在的我还啥也不会哈哈,要从头开始复习,等俺考完数字逻辑,再更嘿嘿。

好吧,这次也要拿出八百年前写的代码了。。。
题意就是给你许多个两个点,这两个点构成一条线段,求线段相交的对数
两线段不会重合的

样例输入

3
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.00
0.00 0.00 1.00 0.00

样例输出

3

我是先剪枝,考虑多种情况
1、先判断平行的情况,平行永不相交
2、对于两条线段,如果一条线段上的x值最大的点小于另一条线段上的x值最小的点的值,同理y也是,这种情况也不会相交。
3、剪完之后,求两线段所在直线方程,带入看是否相交。。。

蛮水的一道题,错了10几次哈哈,好菜呀我。。。。。。。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
struct qq{
    double x,y,x1,y1;
}q[150];
int main()
{
    int n;
    int ans=0;
    double my,mx,mmx,mmy;
    double zx,zy,zzx,zzy;
    double k1,k2,b1,b2;
    ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lf %lf %lf %lf",&q[i].x,&q[i].y,&q[i].x1,&q[i].y1);
    }
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            k1=(q[i].y1-q[i].y)/(q[i].x1-q[i].x);
            k2=(q[j].y1-q[j].y)/(q[j].x1-q[j].x);
            b1=(q[i].x*q[i].y1-q[i].x1*q[i].y)/(q[i].x-q[i].x1);
            b2=(q[j].x*q[j].y1-q[j].x1*q[j].y)/(q[j].x-q[j].x1);
            if(k1==k2)
            {continue;}
            if((q[i].x==q[j].x&&q[i].y==q[j].y)||(q[i].x==q[j].x1&&q[i].y==q[j].y1)||(q[i].x1==q[j].x&&q[i].y1==q[j].y)||(q[i].x1==q[j].x1&&q[i].y1==q[j].y1))
            {ans++;
            continue;}
            mx=min(q[i].x,q[i].x1);
            mmx=max(q[i].x,q[i].x1);
            my=min(q[i].y,q[i].y1);
            mmy=max(q[i].y,q[i].y1);
            zx=min(q[j].x,q[j].x1);
            zzx=max(q[j].x,q[j].x1);
            zy=min(q[j].y,q[j].y1);
            zzy=max(q[j].y,q[j].y1);
            if(mx>zzx||zx>mmx||my>zzy||zy>mmy)
            {continue;}
            double kk1,kk2;
            kk1=k1*q[j].x+b1;
            kk2=k1*q[j].x1+b1;
            if(kk2>q[j].y1&&kk1>q[j].y || kk2<q[j].y1&&kk1<q[j].y)
            {continue;}
            double pp1,pp2;
            pp1=k2*q[i].x+b2;
            pp2=k2*q[i].x1+b2;
            if(pp2>q[i].y1&&pp1>q[i].y || pp2<q[i].y1&&pp1<q[i].y)
            {continue;}
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

之后一个星期可能不更博了,反正没人看。。。。
备考数字逻辑了,祝我考个好成绩吧!
加油哦

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值