文章目录

  • 1. 原理
  • 2. 实现
  • 3. 参考

1. 原理

这个问题的算法思路挺简单的。分成两步来判断:

  1. 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。
  2. 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。因为两个端点都不在矩形内的线段有可能会切割矩形的角,这时会与矩形的对角线相交。

那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。

2. 实现

关键的C++实现代码如下:

//空间直线
template <class T>
class LineSegment
{public:Vec3<T> startPoint;Vec3<T> endPoint;Vec3<T> direction;Vec3<T> min;Vec3<T> max;LineSegment(){}LineSegment(Vec3<T> start, Vec3<T> end){startPoint = start;endPoint = end;direction = end - start;      }inline void Set(Vec3<T> start, Vec3<T> end){startPoint = start;endPoint = end;direction = end - start;      }//两条线段相交inline static bool Intersection2D(LineSegment & line1, LineSegment & line2, Vec3<T>& insPoint){double D = -line1.direction.x() * line2.direction.y() + line1.direction.y() * line2.direction.x();if(D == 0.0){return false;}auto O12 = line2.startPoint - line1.startPoint;T D1 = -O12.x() * line2.direction.y() + O12.y() * line2.direction.x();T D2 = line1.direction.x() * O12.y() - line1.direction.y() * O12.x();T t1 = D1 / D;if(t1<0 || t1 > 1){return false;}T t2 = D2 / D;if(t2<0 || t2 > 1){return false;}insPoint = line1.startPoint + line1.direction * t1;     //这样计算得到的Z值是不准确的return true;}//线段与矩形相交inline bool static IsIntersectsOrthogon2D(LineSegment & line, Orthogon<T> orthogon){if (orthogon.IsContainsPoint(line.startPoint.x(), line.startPoint.y()) ||orthogon.IsContainsPoint(line.endPoint.x(), line.endPoint.y())){return true;}LineSegment diagonal1(Vec3<T>(orthogon.minX(), orthogon.minY(), 0),Vec3<T>(orthogon.maxX(), orthogon.maxY(), 0));LineSegment diagonal2(Vec3<T>(orthogon.minX(), orthogon.maxY(), 0),Vec3<T>(orthogon.maxX(), orthogon.minY(), 0));Vec3<T> point(0,0,0);return Intersection2D(line, diagonal1, point) || Intersection2D(line, diagonal2, point);}
};

3. 参考

  1. 如何判断一条线段和一个矩形或者圆相交? - 叶飞影的回答 - 知乎

平面中判断线段与矩形是否相交相关推荐

  1. java判断两个矩形是否相交_判断矩形相交以及求出相交的区域

    问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...

  2. Intersection - POJ 1410(线段与矩形是否相交)

    题目大意:给一个线段和一个矩形,判断线段是否和矩形有公共点.   分析:用矩形的四个边当线段判断与所给的线段是否有交点,需要注意的是给的矩形是不标准的,需要自己转换,还需要注意线段有可能在矩形内部. ...

  3. java平面内有n个矩形_JAVA 相交矩形面积  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点...

    共回答了17个问题采纳率:88.2% 100%符合你的要求,其中inputstr1/2随便你怎么弄,可以通过args传入,或者System.in传入,甚至通过文件传入. import java.mat ...

  4. java判断线与矩形相交_判断任意多边形与矩形的相交(线段与矩形相交或线段与线段相交)...

    任意多边形与矩形的相交,其实就是判断多条线段是否与这个矩形相交,再简单点就是判断线段是否与矩形的每一条边相交了.那现在,我们先来看看判断一条线段与矩形的其中一条线段的相交的情况(上方水平线): (图形 ...

  5. Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)

    题目: 经过激烈的争夺,Lele终于把那块地从Yueyue的手里抢了回来.接下来,Lele要开始建造他的灌溉系统. 通过咨询Lele的好友--化学系的TT,Lele决定在田里挖出N条沟渠,每条沟渠输送 ...

  6. 几何常用算法与判断线段相交【转】

    下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心   -   代码角   找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...

  7. [面试]——用一行代码判断两矩形是否相交

    typedef struct {int left;// leftmost: 最左int top;// topmost: 最上int right;// rightmost: 最右int bottom;/ ...

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

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

  9. hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交

    题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为'#',每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交 ...

最新文章

  1. yum mysql mariadb 目录_CentOS用yum安装、配置MariaDB
  2. 第三方网站实现绑定微信登陆
  3. liunx 上传 代码到github
  4. 深度学习:Neural Network Layers Understanding
  5. file_get_contents请求失败处理_SpringCloud Gateway网关处理请求过程中遇到400Bad Request问题解决方案...
  6. 2015年《大数据》高被引论文Top10文章No.2——大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(上)...
  7. springboot static访问不到_Spring Boot 的静态资源处理
  8. 所有的胜利,与征服自己的胜利比起来,都是微不足道。
  9. 零基础(转行,应届生、在校生)前端开发学习计划
  10. 解决iSlider的一些问题(滑动组件)
  11. 企业微信应用设置可信域名_企业微信更新版本 全平台内容可设置成英文
  12. 解决问题--mysql可以远程通过IP访问,不能通过localhost与127.0.0.1访问
  13. 第四章 广告投放系统——数据库设计与实体类
  14. EasyDarwin开源流媒体云平台支持EasyCamera摄像机、EasyCamera手机直播监控、EasyNVR等多终端接入
  15. 3D打印机之Marlin固件配置
  16. ggplot2|详解八大基本绘图要素,你需要的都在这-目录版
  17. 听说今年金三银四变成金一银二了。。
  18. 金蝶KIS商贸版实现'条码标签打印'功能进行商品条码打印
  19. 云原生架构总览,发展定义架构及趋势
  20. 怎么在bios中禁用独显

热门文章

  1. 把毛选和鲁迅全集喂给AI后,写出来的作文太对味了
  2. Elasticsearch集群搭建手册及配置详情(基于elasticsearch-8.5.2版本)
  3. 转载:如何用Aspen Plus软件低版本打开高版本保存过的文件
  4. 学习笔记三(STM32串口程序下载新建工程模板)
  5. UART(一)——起始位,停止位,奇偶校验位,数据位等概念
  6. Gouraud Shading(高洛德着色/高氏着色)
  7. Android 2.3.5源码 更新至android 4.4,能够下载,度娘网盘
  8. 不能打印机与计算机,为什么打印机不能打印(打印机为什么不能打印?)
  9. 第十届极客大挑战——部分web和RE的WP
  10. Python代码阅读(第21篇):将变量名称转换为蛇式命名风格