poj1410(线段相交问题判断)
题意:给一个线段的两个端点坐标(确定线段),再给一个矩形的左上角的坐标和右下角的坐标(确定矩形),问判断该线段是否和矩形相交,在矩形内也算和矩形相交。直接用线段和矩形的四条边判断是否相交即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e5+10;
const double esp=1e-8;
struct node{double x,y;
};
struct point{node p1;node p2;
};
point t[maxx];
double muilt(node a,node b,node c){//叉乘 double x1=a.x-c.x;double x2=b.x-c.x;double y1=a.y-c.y;double y2=b.y-c.y;return (double)(x1*y2-x2*y1);
}
int Intersect2(point a,point b){// 排斥实验判断线段相交 return ((max(a.p1.x,a.p2.x)>=min(b.p1.x,b.p2.x))&&(max(b.p1.x,b.p2.x)>=min(a.p1.x,a.p2.x))&&(max(a.p1.y,a.p2.y)>=min(b.p1.x,b.p2.y))&&(max(b.p1.y,b.p2.y)>=min(a.p1.y,a.p2.y)));
}
int Intersect3(point a,point b){//跨立实验判断线段相交 double x1=muilt(b.p1,a.p2,a.p1);double x2=muilt(b.p2,a.p2,a.p1);double y1=muilt(a.p1,b.p2,b.p1);double y2=muilt(a.p2,b.p2,b.p1);if((x1*x2<=esp)&&(y1*y2<=esp&&Intersect2(a,b))){//线段相交判断return 1;}else{return 0;}
}
double Dist(node a,node b){//计算距离double x=a.x-b.x;double y=a.y-b.y;return (double)sqrt(x*x+y*y);
}
int Judge(point a,point b){//相交则返回1,否则返回0if(Intersect3(a,b)){return 1;}else{return 0;}
}
void swap(int&a,int&b){//交换函数int temp=a;a=b;b=temp;
}
int main(){int ts;cin>>ts;while(ts--){for(int i=1;i<=2;i++){cin>>t[i].p1.x>>t[i].p1.y;cin>>t[i].p2.x>>t[i].p2.y;}int a=t[1].p1.x,b=t[1].p1.y;int c=t[1].p2.x,d=t[1].p2.y;int e=t[2].p1.x,f=t[2].p1.y;int g=t[2].p2.x,h=t[2].p2.y;if(e>g){//保证左上角的在右下角的坐标之上swap(e,g);swap(t[2].p1.x,t[2].p2.x);}if(f<h){swap(f,h);swap(t[2].p1.y,t[2].p2.y);}t[4].p1.x=t[2].p1.x;t[4].p1.y=t[2].p1.y;t[4].p2.x=t[2].p2.x;t[4].p2.y=t[2].p1.y;t[5].p1.x=t[2].p2.x;t[5].p1.y=t[2].p1.y;t[5].p2.x=t[2].p2.x;t[5].p2.y=t[2].p2.y;t[6].p1.x=t[2].p2.x;t[6].p1.y=t[2].p2.y;t[6].p2.x=t[2].p1.x;t[6].p2.y=t[2].p2.y;t[7].p1.x=t[2].p1.x;t[7].p1.y=t[2].p2.y;t[7].p2.x=t[2].p1.x;t[7].p2.y=t[2].p1.y;int flag=0;for(int i=4;i<=7;i++){if(Judge(t[1],t[i])){flag=1;break;}}if(min(a,c)>=e&&max(a,c)<=g&&min(b,d)>=h&&max(b,d)<=f){//判断是否在矩形内(矩形内也算相交)flag=1;}if(flag==0){cout<<"F"<<endl;}else{cout<<"T"<<endl;}}return 0;
}
poj1410(线段相交问题判断)相关推荐
- POJ1410线段相交、快速排斥实验、跨立实验
题目 Intersection 给出二维平面中一条线段和一个矩形,问线段和矩形是否有交点,矩形包括边和内部. 解题思路 先判断线段和四条边是否相交,如果没交点,再继续判断线段是否在矩形内. 判断线段相 ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- 几何基础之判断线段相交问题
1.判断两线段相交 只要判断q1,q2在线段s1s2的两侧和s1,s2在线段q1q2的两侧. q1s1q2s1>0就是在两侧. 2.矩形里有n条直线,一条直线的终点是另一条直线的起点.问矩形被分 ...
- [51nod1264]线段相交
给定两个点: typedef struct { double x, y; } Point; Point A1,A2,B1,B2; 首先引入两个实验: a.快速排斥实验 设以线段A1A2和线段B1B ...
- Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)
题目: 经过激烈的争夺,Lele终于把那块地从Yueyue的手里抢了回来.接下来,Lele要开始建造他的灌溉系统. 通过咨询Lele的好友--化学系的TT,Lele决定在田里挖出N条沟渠,每条沟渠输送 ...
- 几何常用算法与判断线段相交【转】
下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心 - 代码角 找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...
- 德莱联盟[判断线段相交]
德莱联盟 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也 ...
- NYOJ1016(德莱联盟)(判断线段相交)
德莱联盟 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也 ...
- 如何判断2个线段相交
判断 2 个线段相交有很多方法,最直接的方法就是直接计算两条直线的交点,然后看看交点是否分别在这两条线段上.这样的方法很容易理解,但是代码实现比较麻烦. 还有一种常用的方法是通过向量叉积来判断的,这种 ...
最新文章
- 分享做LOGO 的方法和思维方式 -liuleihai
- css文字背景虚化,通过实现背景模糊、文字颜色流光渐变、边框扩展等效果学习transition、transform、@keyframes等属性及伪元素的使用...
- java JDBC连接Oracle数据库的方法
- 【C++】34. gflags中的 --flagfile= 用法
- python sklearn.decomposition.PCA 主成分分析, 原理详解
- boost::search_n相关的测试程序
- 数据结构杂谈番外篇——时间复杂度计算
- Flutter Trying to embed a platform view but the PrerollContext does not support embedding
- 国产性能车天花板?145万买极星1,认真的么?
- flex接收java返回集合,前台的的flex对Java返回list类型的处理
- 解决了!联邦学习+推荐系统,冷启动和数据隐私问题双双K.O
- (二)洞悉linux下的Netfilteriptables:内核中的ip_tables小觑
- php 汉字拼音字典排序,按拼音排序的小技巧
- JS通过高德地图将经纬度转换为地理位置
- IndexError: index 0 is out of bounds for axis 0 with size 0
- kubectl 命令详解(三十三):rollout resume
- Java集合类ArrayList线程不安全验证和解决
- tyvj 火焰巨魔的惆怅
- phpstorm多出屏幕代码换行/自动换行
- 在北京西单图书大厦签名售书