java判断线段是否相交函数_计算几何-判断线段是否相交
计算几何-判断线段相交
判断两线段是否相交:
快速排斥
跨立实验(这两个词也是我看博客的时候看到的,觉得挺高大上的就拿过来用了,哈哈哈)
1. 快速排斥:就是初步的判断一下,两条线段是不是相交,以两条线段为对角线的矩形,如果不重合的话,那么两条线段一定不可能相交。看下图:
1.线段ab的低点低于cd的最高点(可能重合)
2.cd的最左端小于ab的最右端(可能重合)
3.cd的最低点低于ab的最高点(加上条件1,两线段在竖直方向上重合)
4.ab的最左端小于cd的最右端(加上条件2,两直线在水平方向上重合)
综上4个条件,两条线段组成的矩形是重合的
用代码实现(c++):
if(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y))
return true;
2. 跨立实验:如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段
也就是说a b两点在线段cd的两端,c d两点在线段ab的两端
这里就用到了向量X乘的知识点,有向量X乘的物理意义知:AB x CD=-CD x AB
看下图:
(ca x cd)·(cb x cd)<=0 则说明ca cb先对于cd的方向不同,则a b在线段cd的两侧,由此可以判断其他点
代码实现:
double u,v,w,z;//分别记录两个向量
u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);return (u*v<=0.00000001 && w*z<=0.00000001);
因为double没法直接比较大小嘛,所以来看这篇博客的应该能看懂
由此就完全判断出两条线段是否相交了。
模板:
/***************************************线段相交模板****************************************/
struct Point{//点
doublex,y;
Point(){}
Point(int a,intb){
x=a;
y=b;
}void input(){//定义输入函数方便用的时候scanf("%lf%lf",&x,&y);
}
};struct Line{//线段Point a,b;
Line(){}
Line(Point x,Point y){
a=x;
b=y;
}voidinput(){
a.input();
b.input();
}
};bool judge(Point &a,Point &b,Point &c,Point &d)
{/*快速排斥:
两个线段为对角线组成的矩形,如果这两个矩形没有重叠的部分,那么两条线段是不可能出现重叠的*/
if(!(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y)))//这里的确如此,这一步是判定两矩形是否相交//1.线段ab的低点低于cd的最高点(可能重合) 2.cd的最左端小于ab的最右端(可能重合)//3.cd的最低点低于ab的最高点(加上条件1,两线段在竖直方向上重合) 4.ab的最左端小于cd的最右端(加上条件2,两直线在水平方向上重合)//综上4个条件,两条线段组成的矩形是重合的
/*特别要注意一个矩形含于另一个矩形之内的情况*/
return false;/*跨立实验:
如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段
也就是说a b两点在线段cd的两端,c d两点在线段ab的两端*/
double u,v,w,z;//分别记录两个向量u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);return (u*v<=0.00000001 && w*z<=0.00000001);
}/***************************************线段相交模板****************************************/
java判断线段是否相交函数_计算几何-判断线段是否相交相关推荐
- java判断线段是否相交函数_判断线段是否相交… | 学步园
判断直线是否相交,貌似很容易,直接用一个向量叉乘公式:x1*y2-x2*y1.如果结果为0,则直线是平行或者重合,否则必然相交... 但如何判断两条线段是否相交呢?我们给出了两条线段的四个端点,这两条 ...
- 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)
原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...
- java 判断int是几位_快速判断一个int值是几位数
快速判断一个int值是几位数 判断一个int值是几位数,想到除法和模运算了,偶然在Java标准API源码中发现的写法,很强大. 文艺青年(存在Integer包中) public class Test ...
- ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密
**PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...
- java后台传一个对象到前台_前台判断对象中的一个布尔值_springMVC面试题
1:springMVC工作原理 springMVC架构.png [用户发送请求到前端控制器dispatcherservlet,前端控制器接收到请求之后调用处理器映射器,根据请求url找到具体的处理器, ...
- java输入星期几的字母_输入字母判断星期几java编程答案
你知道如何用java编程来实现输入第一个字母判断星期几吗?下面的编程题目就是解决的这个问题,一起来具体的看一下题目和答案吧. 一.题目 请输入星期几的第一个字母,来判断一下是星期几. 假如,第一个字母 ...
- java 点与线的距离_点与线段之间的最短距离
这是为有限线段而做的实现,而不是像这里的大多数其他函数那样的无限行(这就是我做这个的原因). Python:def dist(x1, y1, x2, y2, x3, y3): # x3,y3 is t ...
- python不允许使用关键字作为变量名、允许使用内置函数_【判断题】Python不允许使用关键字作为变量名,但是允许使用内置函数名作为变量名,不过这会改变函数名的含义,所以不建议这样做...
[判断题]Python不允许使用关键字作为变量名,但是允许使用内置函数名作为变量名,不过这会改变函数名的含义,所以不建议这样做 更多相关问题 [单选,A2型题,A1/A2型题] <十四经发挥&g ...
- java分数变小数的函数_分数化小数
题目 求 a / b 的小数表现形式.如果 a 可以整除 b 则不需要小数点. 如果是有限小数,则可以直接输出. 如果是无限循环小数,则需要把小数循环的部分用 "()" 括起来. ...
最新文章
- ISAIR2022征稿【中国・上海​, 2022年10月21-23日】
- 一次看懂RIP协议。
- Numpy中的random模块中的seed方法的作用
- C# 学习笔记(6) 多态
- python之csv模块(part1)--写入csv文件
- shiro使用jdbc_realm登录验证
- display属性_Numpy知识点(1)讲解实操安装/属性/数组创建/运算
- python pandas 排序_python – pandas:单独对每列进行排序
- 计算机基础第1次作业,计算机应用基础 第一次作业
- java中set语句_数据步骤中的多个SET / MERGE语句
- eclipse修改工作的目录顺序
- 第十六周进度报告总结
- 大学生程序员被勒索比特币后,绝地反击! | 原力计划
- C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档
- st8s003 c语言编译器,stm8s003f3p6
- 通过串口波特率计算bit时间
- 【资料分享】STM32配置TB6612驱动程序详解
- 【Linux实验】Linux操作基础
- 解读随着教育改革的深入steam教育
- C++ 侯捷系列视频汇总
热门文章
- phpStudy配置站点 解决You don't have permission to access / on this server
- Eclipse安装aptana
- Jakarta-ORO正则表达式的运用
- window tomcat 端口冲突问题解决
- 寻宝机器人电路板焊接_专业维修宿迁市史陶比尔STAUBLI机器人维修{苏州罗韦维修}...
- python测试嵌入式_用Python测试嵌入式系统的测试框架
- ajax跨域请求wcf,ajax wcf 指定某个域名 进行跨域访问
- WordPress ProfilePress插件多个严重漏洞
- Jupyter运行GitHub里的MXNet源代码
- python遍历数组的两种方法及将print的内容写入文件中