平面中判断线段与矩形是否相交
文章目录
- 1. 原理
- 2. 实现
- 3. 参考
1. 原理
这个问题的算法思路挺简单的。分成两步来判断:
- 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。
- 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。因为两个端点都不在矩形内的线段有可能会切割矩形的角,这时会与矩形的对角线相交。
那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。
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. 参考
- 如何判断一条线段和一个矩形或者圆相交? - 叶飞影的回答 - 知乎
平面中判断线段与矩形是否相交相关推荐
- java判断两个矩形是否相交_判断矩形相交以及求出相交的区域
问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...
- Intersection - POJ 1410(线段与矩形是否相交)
题目大意:给一个线段和一个矩形,判断线段是否和矩形有公共点. 分析:用矩形的四个边当线段判断与所给的线段是否有交点,需要注意的是给的矩形是不标准的,需要自己转换,还需要注意线段有可能在矩形内部. ...
- java平面内有n个矩形_JAVA 相交矩形面积 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点...
共回答了17个问题采纳率:88.2% 100%符合你的要求,其中inputstr1/2随便你怎么弄,可以通过args传入,或者System.in传入,甚至通过文件传入. import java.mat ...
- java判断线与矩形相交_判断任意多边形与矩形的相交(线段与矩形相交或线段与线段相交)...
任意多边形与矩形的相交,其实就是判断多条线段是否与这个矩形相交,再简单点就是判断线段是否与矩形的每一条边相交了.那现在,我们先来看看判断一条线段与矩形的其中一条线段的相交的情况(上方水平线): (图形 ...
- Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)
题目: 经过激烈的争夺,Lele终于把那块地从Yueyue的手里抢了回来.接下来,Lele要开始建造他的灌溉系统. 通过咨询Lele的好友--化学系的TT,Lele决定在田里挖出N条沟渠,每条沟渠输送 ...
- 几何常用算法与判断线段相交【转】
下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心 - 代码角 找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...
- [面试]——用一行代码判断两矩形是否相交
typedef struct {int left;// leftmost: 最左int top;// topmost: 最上int right;// rightmost: 最右int bottom;/ ...
- 快速排斥、跨立实验判断线段是否相交
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交
题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为'#',每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交 ...
最新文章
- yum mysql mariadb 目录_CentOS用yum安装、配置MariaDB
- 第三方网站实现绑定微信登陆
- liunx 上传 代码到github
- 深度学习:Neural Network Layers Understanding
- file_get_contents请求失败处理_SpringCloud Gateway网关处理请求过程中遇到400Bad Request问题解决方案...
- 2015年《大数据》高被引论文Top10文章No.2——大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(上)...
- springboot static访问不到_Spring Boot 的静态资源处理
- 所有的胜利,与征服自己的胜利比起来,都是微不足道。
- 零基础(转行,应届生、在校生)前端开发学习计划
- 解决iSlider的一些问题(滑动组件)
- 企业微信应用设置可信域名_企业微信更新版本 全平台内容可设置成英文
- 解决问题--mysql可以远程通过IP访问,不能通过localhost与127.0.0.1访问
- 第四章 广告投放系统——数据库设计与实体类
- EasyDarwin开源流媒体云平台支持EasyCamera摄像机、EasyCamera手机直播监控、EasyNVR等多终端接入
- 3D打印机之Marlin固件配置
- ggplot2|详解八大基本绘图要素,你需要的都在这-目录版
- 听说今年金三银四变成金一银二了。。
- 金蝶KIS商贸版实现'条码标签打印'功能进行商品条码打印
- 云原生架构总览,发展定义架构及趋势
- 怎么在bios中禁用独显
热门文章
- 把毛选和鲁迅全集喂给AI后,写出来的作文太对味了
- Elasticsearch集群搭建手册及配置详情(基于elasticsearch-8.5.2版本)
- 转载:如何用Aspen Plus软件低版本打开高版本保存过的文件
- 学习笔记三(STM32串口程序下载新建工程模板)
- UART(一)——起始位,停止位,奇偶校验位,数据位等概念
- Gouraud Shading(高洛德着色/高氏着色)
- Android 2.3.5源码 更新至android 4.4,能够下载,度娘网盘
- 不能打印机与计算机,为什么打印机不能打印(打印机为什么不能打印?)
- 第十届极客大挑战——部分web和RE的WP
- Python代码阅读(第21篇):将变量名称转换为蛇式命名风格