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

    xiaoxiao2022-07-13  162

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

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

    样例输入

    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; }

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

    最新回复(0)