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 <= 10^8)
(直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)
Output
输出共T行,如果相交输出”Yes”,否则输出”No”。
Input示例
2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1
Output示例
Yes
No
分析:
在二维中, 对于两个线段相交, 不包括重叠, 端点可以用向量的叉积来判断,
部分重叠, 则说明必有一个点在另一条线段上(不包括端点), 则叉积为0, 点积是 < 0 的;
对于端点重叠的, 判断一下点是否相等就可以了。
实现:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
int dcmp(double x) {
return fabs(x) < eps ? 0 : (x < 0 ? -1 : 1);
}
struct Point {
double x, y;
Point(double _x = 0, double _y = 0) :\
x(_x), y(_y) {}
};
typedef Point Vector;
Vector operator - (Point A, Point B) { return Vector (A.x-B.x, A.y-B.y); }
bool operator == (Point A, Point B) { return dcmp(A.x-B.x) == 0 && dcmp(A.y-B.y) == 0; }
double Dot (Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
double Cross (Vector A, Vector B) { return A.x*B.y - A.y*B.x; }
bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2) { ///不包括端点的两线段相交。
double c1 = Cross(a2-a1, b1-a1), c2 = Cross(a2-a1, b2-a1),
c3 = Cross(b2-b1, a1-b1), c4 = Cross(b2-b1, a2-b1);
return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0;
}
bool PointOnSegment(Point p, Point a1, Point a2) { /// 判断点是否在线段上。
return dcmp(Cross(a1-p, a2-p)) == 0 && dcmp(Dot(a1-p,a2-p)) < 0;
}
Point d[4];
int main()
{
int T;
cin >> T;
while(T--) {
for(int i = 0; i < 4; ++i)
cin >> d[i].x >> d[i].y;
int cnt = 0;
cnt += (d[0] == d[2] || d[1] == d[3] || d[0] == d[3] || d[1] == d[2]);
cnt += (PointOnSegment(d[0],d[2],d[3]) || PointOnSegment(d[1],d[2],d[3]));
cnt += SegmentProperIntersection(d[0],d[1],d[2],d[3]);
if(cnt) printf("Yes\n");
else printf("No\n");
}
}
51nod--1264 线段相交 (计算几何基础, 二维)的更多相关文章
- 51nod 1264 线段相交(几何)
题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该 ...
- 51Nod 1264 线段相交(计算几何)
1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相 ...
- 判断线段相交 -- 51nod 1264 线段相交
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y ...
- 51nod 1264 线段相交——计算几何
题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1264 检查点的位置就行了,具体见注释. /* (a-c)×(d-c)*(d ...
- 51nod 1264 线段相交
题目:传送门. 题意:给两条线段,有一个公共点或有部分重合认为相交,问他们是否相交. 题解:这属于非规范相交的情况,模板题. #include <iostream> #include &l ...
- (图论)51NOD 1264 线段相交
给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No". 输入 第1行:一个 ...
- OpenJudge计算概论-二维数组右上左下遍历
/*====================================================================== 二维数组右上左下遍历 总时间限制: 1000ms 内存 ...
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...
- CodeForces 242E - XOR on Segment 二维线段树?
今天练习赛的题....又是线段树的变换..拿到题我就敲了个点更新区间查询的..果断超时...然后想到了可以将每个数与合表示成不进位的二进制数..这样就可以区间进行更新了..比赛的时候写搓了..刚重写了 ...
随机推荐
- Noisy Channel模型纠正单词拼写错误
本文介绍 Stanford<From Languages to Information>课程中讲到的 单词拼写错误 纠正.背后的数学原理主要是贝叶斯公式.单词拼写错误纠正主要涉及到两个模型 ...
- 堵上NFine SubmitForm漏洞
NFine一个隐藏的漏洞(NFine基本上模仿力软的,力软应该也有,不知道新版本改了没),就是任何登录的用户都可以进行权限修改操作.比如所有模块的SumbitForm或者其它弹出窗口上的按钮,本身只有 ...
- Idea运行web项目时,提示java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方法
今天用 idea写了个工程.结果最后报错,错误信息如下: java.lang.ClassNotFoundException: com.mysql.jdbc.Driverat org.apache.ca ...
- [译]使用Command模式和MediatR简化你的控制器
原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...
- UVAlive 6697 Homework Evaluation
借鉴了别人的博客啊,自己写写给以后的自己看吧 给出两个字符串,用第二个字符串去匹配第一个字符串,可以对第二个字符串进行删除或插入操作,一位匹配成功得8分失败-5分,如果插入或删除,对于连续插入或删除m ...
- (5)top k大的数目
一.问题 在一个很长的数组中,求出top k大小的数目 二.办法 用优先队列 时间复杂度O(nlog(k)),应该是最差的情况下是这个 三.Code package algorithm; import ...
- Cisco Common Service Platform Collector - Hardcoded Credentials(CVE-2019-1723)
Cisco Common Service Platform Collector - Hardcoded Credentials 思科公共服务平台收集器-硬编码凭证(CVE-2019-1723) htt ...
- AspectJ开发
aspectJ 是基于java语言的aop框架,提供了强大的aop功能. aspectJ的实现主要有两种,一种是基于xml的声明式aspectJ,另一种是基于注解的aspectJ. 1.基于xml的声 ...
- webpack学习笔记——打包js
1.新建一个入口js文件,如entry.js,代码如下: document.write("It works.") 2.然后编译 entry.js 并打包到 bundle.js(会自 ...
- 理解position定位
使用css布局position非常重要,语法如下: position:static | relative | absolute | fixed | center | page | sticky 默认值 ...