计算几何-判断线段相交

判断两线段是否相交:

快速排斥

跨立实验(这两个词也是我看博客的时候看到的,觉得挺高大上的就拿过来用了,哈哈哈)

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判断线段是否相交函数_计算几何-判断线段是否相交相关推荐

  1. java判断线段是否相交函数_判断线段是否相交… | 学步园

    判断直线是否相交,貌似很容易,直接用一个向量叉乘公式:x1*y2-x2*y1.如果结果为0,则直线是平行或者重合,否则必然相交... 但如何判断两条线段是否相交呢?我们给出了两条线段的四个端点,这两条 ...

  2. 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)

    原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...

  3. java 判断int是几位_快速判断一个int值是几位数

    快速判断一个int值是几位数 判断一个int值是几位数,想到除法和模运算了,偶然在Java标准API源码中发现的写法,很强大. 文艺青年(存在Integer包中) public class Test ...

  4. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  5. java后台传一个对象到前台_前台判断对象中的一个布尔值_springMVC面试题

    1:springMVC工作原理 springMVC架构.png [用户发送请求到前端控制器dispatcherservlet,前端控制器接收到请求之后调用处理器映射器,根据请求url找到具体的处理器, ...

  6. java输入星期几的字母_输入字母判断星期几java编程答案

    你知道如何用java编程来实现输入第一个字母判断星期几吗?下面的编程题目就是解决的这个问题,一起来具体的看一下题目和答案吧. 一.题目 请输入星期几的第一个字母,来判断一下是星期几. 假如,第一个字母 ...

  7. java 点与线的距离_点与线段之间的最短距离

    这是为有限线段而做的实现,而不是像这里的大多数其他函数那样的无限行(这就是我做这个的原因). Python:def dist(x1, y1, x2, y2, x3, y3): # x3,y3 is t ...

  8. python不允许使用关键字作为变量名、允许使用内置函数_【判断题】Python不允许使用关键字作为变量名,但是允许使用内置函数名作为变量名,不过这会改变函数名的含义,所以不建议这样做...

    [判断题]Python不允许使用关键字作为变量名,但是允许使用内置函数名作为变量名,不过这会改变函数名的含义,所以不建议这样做 更多相关问题 [单选,A2型题,A1/A2型题] <十四经发挥&g ...

  9. java分数变小数的函数_分数化小数

    题目 求 a / b 的小数表现形式.如果 a 可以整除 b 则不需要小数点. 如果是有限小数,则可以直接输出. 如果是无限循环小数,则需要把小数循环的部分用 "()" 括起来. ...

最新文章

  1. ISAIR2022征稿【中国・上海​, 2022年10月21-23日】
  2. 一次看懂RIP协议。
  3. Numpy中的random模块中的seed方法的作用
  4. C# 学习笔记(6) 多态
  5. python之csv模块(part1)--写入csv文件
  6. shiro使用jdbc_realm登录验证
  7. display属性_Numpy知识点(1)讲解实操安装/属性/数组创建/运算
  8. python pandas 排序_python – pandas:单独对每列进行排序
  9. 计算机基础第1次作业,计算机应用基础 第一次作业
  10. java中set语句_数据步骤中的多个SET / MERGE语句
  11. eclipse修改工作的目录顺序
  12. 第十六周进度报告总结
  13. 大学生程序员被勒索比特币后,绝地反击! | 原力计划
  14. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档
  15. st8s003 c语言编译器,stm8s003f3p6
  16. 通过串口波特率计算bit时间
  17. 【资料分享】STM32配置TB6612驱动程序详解
  18. 【Linux实验】Linux操作基础
  19. 解读随着教育改革的深入steam教育
  20. C++ 侯捷系列视频汇总

热门文章

  1. phpStudy配置站点 解决You don't have permission to access / on this server
  2. Eclipse安装aptana
  3. Jakarta-ORO正则表达式的运用
  4. window tomcat 端口冲突问题解决
  5. 寻宝机器人电路板焊接_专业维修宿迁市史陶比尔STAUBLI机器人维修{苏州罗韦维修}...
  6. python测试嵌入式_用Python测试嵌入式系统的测试框架
  7. ajax跨域请求wcf,ajax wcf 指定某个域名 进行跨域访问
  8. WordPress ProfilePress插件多个严重漏洞
  9. Jupyter运行GitHub里的MXNet源代码
  10. python遍历数组的两种方法及将print的内容写入文件中