欢迎大家访问我的老师的OJ———caioj.cn

题面描述

传送门

思考

看完视频之后,

发现SCY讲得真(mo)好(hu)。

下面我来总结一下规律:

我们以 p 1 p_1 p1​为原点,判断 p 3 p_3 p3​到 p 2 p_2 p2​, p 2 p_2 p2​到 p 4 p_4 p4​是否是同一个方向旋转(注意是 p 3 p_3 p3​到 p 2 p_2 p2​, p 2 p_2 p2​到 p 4 p_4 p4​),可以利用叉乘来理解。

以 p 3 p_3 p3​为原点的情况同理。

像上图就很好理解。

主要处理下列这种特殊情况。


这是以 p 1 p_1 p1​为原点, p 2 , p 3 p_2,p_3 p2​,p3​共点,它们叉乘之积为0。

我们再来一种普遍情况。

类似这样的, p 2 , p 3 p_2,p_3 p2​,p3​共线,或其它两点或两点以上共线的,我们肯定有一个两两叉乘之积为 0 0 0的结果,那么可以判断,现作为原点(即SCY中的标准点),以上图为例,我们可以判断

if(mul(p3,p2,p1)==0&&mymin(p1.x,p2.x)<=p3.x&&mymax(p1.x,p2.x)>=p3.x)return true;

p 3 . x p_3.x p3​.x是否在 [ m i n ( p 1 . x , p 2 . x ) , m a x ( p 1 . x , p 2 . x ) ] [min(p_1.x,p_2.x),max(p_1.x,p_2.x)] [min(p1​.x,p2​.x),max(p1​.x,p2​.x)]这个范围之中,证明它是否有被覆盖。

但是这样还不行。

比如说:


所以我们还要再判断一下 y y y是否在范围才行。

AC code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=1e4+10;
struct node{double x,y;};
struct line{node p1,p2;}a[N];
double mul(node p1,node p2,node p0)
{double x1=p1.x-p0.x,x2=p2.x-p0.x;double y1=p1.y-p0.y,y2=p2.y-p0.y;return x1*y2-x2*y1;
}
double mymin(double x,double y){return x<y?x:y;}
double mymax(double x,double y){return x>y?x:y;}
bool pd(line l1,line l2)
{node p1=l1.p1;node p2=l1.p2;node p3=l2.p1;node p4=l2.p2;if(mul(p3,p2,p1)*mul(p2,p4,p1)>0&&mul(p1,p4,p3)*mul(p4,p2,p3)>0)return true;if(mul(p3,p2,p1)==0&&mymin(p1.x,p2.x)<=p3.x&&mymax(p1.x,p2.x)>=p3.x&&mymin(p1.y,p2.y)<=p3.y&&mymax(p1.y,p2.y)>=p3.y)return true;if(mul(p2,p4,p1)==0&&mymin(p1.x,p2.x)<=p4.x&&mymax(p1.x,p2.x)>=p4.x&&mymin(p1.y,p2.y)<=p4.y&&mymax(p1.y,p2.y)>=p4.y)return true;if(mul(p1,p4,p3)==0&&mymin(p3.x,p4.x)<=p1.x&&mymax(p3.x,p4.x)>=p1.x&&mymin(p3.y,p4.y)<=p1.y&&mymax(p3.y,p4.y)>=p1.y)return true;if(mul(p4,p2,p3)==0&&mymin(p3.x,p4.x)<=p2.x&&mymax(p3.x,p4.x)>=p2.x&&mymin(p3.y,p4.y)<=p2.y&&mymax(p3.y,p4.y)>=p2.y)return true;return false;
}
int b[N];
int main()
{int n;scanf("%d",&n);int tot=0;for(int i=1;i<=n;i++)scanf("%lf%lf%lf%lf",&a[i].p1.x,&a[i].p1.y,&a[i].p2.x,&a[i].p2.y);for(int i=1;i<=n;i++){bool bk=true;for(int j=i+1;j<=n;j++)if(pd(a[i],a[j])){bk=false;break;}if(bk)b[++tot]=i;}for(int i=1;i<tot;i++)printf("%d ",b[i]);printf("%d\n",b[tot]);return 0;
}

[计算几何]判断线段相交(跨立实验)相关推荐

  1. 51nod 1264 线段相交(跨立实验)

    51nod1264:线段相交 判断线段相交: 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202 在快 ...

  2. 计算几何 快速排斥和跨立实验 判断两线段相交

    线段P1P2, Q1Q2,判断其是否相交,通过快速排斥和跨立实验则说明相交 首先要知道:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的逆时针方向:若结果大于0,表示向量b在向量a的 ...

  3. 快速排斥、跨立实验判断线段是否相交

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  4. java判断线段是否相交函数_计算几何-判断线段是否相交

    计算几何-判断线段相交 判断两线段是否相交: 快速排斥 跨立实验(这两个词也是我看博客的时候看到的,觉得挺高大上的就拿过来用了,哈哈哈) 1. 快速排斥:就是初步的判断一下,两条线段是不是相交,以两条 ...

  5. 【计算几何】判断线段相交(跨立实验)

    题意:有n条线段(编号为1n),按1n的顺序放在二维坐标系上(就是先放1号,再放2号--),要求输出最上面的那些线段的编号.(就是没有其他线段压在它上面的那些线段) 注意:有交点即为被压. 1.叉积 ...

  6. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  7. 跨立实验判断线段是否相交-POJ3304

    在二维坐标下介绍一些定义: 点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y ...

  8. 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)

    一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...

  9. [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现

    文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...

最新文章

  1. 卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)
  2. Windows Server 2012正式版RDS系列⑦
  3. VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)
  4. Android邮件发送详解
  5. 征集对Oracle的问题
  6. linux 终端显示白底,mac终端使用Item2无法显示颜色的解决方法
  7. 第一次执行时没有问题,重复执行会出错、GP循环
  8. python 并行_python并行处理任务时 该用多进程?还是该用多线程?
  9. 啦啦啦-我又来了!!!
  10. java对象 引用 原理,java对象引用和对象值得行为
  11. java json 转数据_Java解析(读取)Json数据{}、[{}](转)
  12. android框架xUtils使用介绍
  13. 关于如何修复任务栏图标变白色的问题
  14. python微信加人_python实现微信自动加好友
  15. 生成开端原著小说词云
  16. 【毕业设计】基于单片机的火灾报警系统 -stm32 单片机物联网
  17. 负载均衡设备oracle,高可用的Oracle数据库负载均衡技术--深信服AD系列应用交付平台...
  18. 在Visual Basic6.0中,如何实现简单加减乘除的程序编写?
  19. 2023最新苹果APP上架App Store流程(超详细)
  20. b站尚硅谷springmvc学习视频:springmvc文档

热门文章

  1. 中国风道德教学课件PPT模板
  2. zookeeper的zab协议工作原理
  3. 36岁程序员如何赚钱?分享近几年收入来源
  4. Joomla安装设置教程(转)
  5. iOS 使用UITextField隐藏键盘
  6. 联想android刷机教程,联想X2-TO(VIBE X2 移动4G 安卓5.0)一键刷机教程,看教程刷机...
  7. mac上好用的压缩_macOS下最常用也最好用的几款解压缩软件,你值得拥有
  8. 解压缩软件——360压缩国际版
  9. RabbitMq 配置分离 - 职责单一原则
  10. 电子商务(电销)平台中订单模块(Order)数据库设计明细