判断线段相交 -- 51nod 1264 线段相交

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264

三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;

上面得到的即是以点A,B,C三点组成的三角形面积的两倍。

如果area >0 则点A,B,C呈逆时针排列。

如果area<0  则点A,B,C呈顺时针排列。

如果area=0  则点A,B,C三点共线。

那么判断线段1(两个端点point a,b),与线段二是否相交(两个端点point c,d) 只要求 a,b,c与a,b,d的有向面积乘积是否小于0 ,并且c,d,a与c,d,b的有向面积是否小于0即可。

只有两线段相交,有向面积才会是一个为正一个为负。画一下图就知道了。

端点相交时乘积等于0。

 1 #include <cstdio>
 2
 3 struct point
 4 {
 5     double x,y;
 6 };
 7 double dir(point a, point b, point c)//三角形有向面积判断顺逆时针
 8 {
 9     return a.x*b.y + b.x*c.y + c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;
10 }
11 bool connected(point a, point b, point c, point d)//线段判交
12 {
13     if (dir(a, b, c)*dir(a, b, d) <= 0 && dir(d, c, a)*dir(d, c, b) <= 0)return 1;//注意在端点处相交时等于0
14     return 0;
15 }
16
17 int main()
18 {
19     int t;
20     point a,b,c,d;
21     scanf("%d",&t);
22     while(t--)
23     {
24         scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
25         if(connected(a,b,c,d)) printf("Yes\n");
26         else printf("No\n");
27     }
28     return 0;
29 }
时间: 2024-08-02 21:53:54

判断线段相交 -- 51nod 1264 线段相交的相关文章

51nod 1264 线段相交(几何)

题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该直线的另一边,则称p1p2跨越了这条直线p3p4.) 可以用叉乘来判断p3p1.p3p2是否在p3p4的不同方向(顺.逆时针)(线段p1p2跨越了直线p3p4)以及p1p4.p1p3是否在p1p2的不同方向(线段p3p4跨越了直线p1p2)来判断是否相交. 关于叉乘方向的判断,来,伸出你的右手...

51nod 1264 线段相交(判线段相交 包括端点和部分重合)

1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No". Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4.(-10^8 <= xi, yi 

51nod 1264 线段相交

题意:求两线段是否相交 使用叉乘与向量的方法 数论资料 :http://dev.gameres.com/Program/Abstract/Geometry.htm# ( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0 ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0 其中P1P2是一条线段的两端点,Q1Q2是另一个线段的两段点. ( P1 - Q1 ) × (

1264 线段相交

1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No". Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4.(-10^8 <= xi, yi <= 10

zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10 题意:  给定n个点的, 如果这n个点不能形成多边形 以及 n < 3 时, 输出, "Impossible",  否则 输出 多边形的面积. 分析: 这题主要在 分析  n 个点 是否形成 多边形.  枚举 每条边,  看 这条边 是否与 其他 n - 3 条边 不规范相交. (当处理 其他 边时, 我们采用 扩充线段一倍) 代码如下: con

(hdu step 5.1.3)Segment set(求与一条线段相交的线段集合中的线段的数量)

题目: Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 82   Problem Description A segment and all segments which are connected with it compose a segment set. T

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

判断两个单链表是否相交及相交的第一个节点

/* 问题: 1.判断两个单链表是否相交 2.找出第一个相交节点 解题思路: 1.若连个链表相交则从相交节点开始以后节点都是一样的 2.通过链表长度判断然后去寻找 */ #include<stdlib.h> #include<stdio.h> /* 创建节点 */ typedef struct STU { char a; struct STU *next; }*SListNode; SListNode ListA; SListNode ListB; /* 创建链表A */ SLis

51Nod 1091 线段的重叠(贪心+区间相关,板子题)

1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的.输出这个最长的距离.如果没有重叠,输出0. Input 第1行:线段的数量N(2 <= N <= 50000). 第2 - N + 1行:每行2个数,线段的起点和终点.(0