1 原理

在其中一个矩形上建立局部坐标系,并计算出不干涉边界上8个顶点在局部坐标系下的坐标。再将另一个矩形形心的坐标换算到局部坐标系下,判断该形心是否在不干涉边界内。若形心落在不干涉边界内部,则两平面矩形干涉,否则不干涉。

不干涉边界上8个顶点的坐标计算参考:滕弘飞,刘峻,王秀梅,冯恩民,杨宏宇,孙治国.一种矩形的动态不干涉算法[J].中国图象图形学报,2001(03):57-61.

采用射线法判断形心是否落在不干涉边界内部,参考:王燕平, 刘永和. 射线法判断平面中的点在多边形内外的算法 [J]. 山西建筑, 2007, 33): 364-5.

计算点到线段的最小距离参看:https://www.cnblogs.com/flyinggod/p/9359534.html。

2 代码

2.1 判断两矩形是否相交

%% 函数定义
% 不适合多边形法判断两矩形是否干涉
function tf = IsRectanglesInterference(rec_1,rec_2)
%% 参数定义
% rec_1 矩形1的结构体参数;
% rec_2 矩形2的结构体参数;
% tf 矩形1与矩形2是否干涉;
% rec_1.p 矩形的形心坐标,[x,y];
% rec_1.L 矩形的长宽,[length,width];
% rec_1.a 矩形长边与x轴的夹角,逆时针为正,[0,pi);
% 矩形坐标系定义:原点位于形心,长边向右为x+,宽边向上为y+;
%% 函数体
% 计算矩形1坐标系下的不干涉边界
polygon = NoninterferenceBoundary_local(rec_1,rec_2);
% 计算全局坐标系下的不干涉边界
polygon_w(:,1) = polygon(:,1).*cos(rec_1.a) - polygon(:,2).*sin(rec_1.a) + rec_1.p(1);
polygon_w(:,2) = polygon(:,1).*sin(rec_1.a) + polygon(:,2).*cos(rec_1.a) + rec_1.p(2);
% 判断矩形2形心是否在不干涉边界中
tf = IsPointInPolygon(rec_2.p, polygon_w);
end%% 函数定义
% 计算矩形1坐标系下的不干涉边界
function point = NoninterferenceBoundary_local(rec_1,rec_2)
%% 参数定义
% rec_1 矩形1的结构体参数;
% rec_2 矩形2的结构体参数;
a_rec = rec_2.a - rec_1.a; % 矩形坐标系间夹角
a_i1 = rec_1.L(1)/2;
a_i2 = rec_1.L(2)/2;
a_j1 = rec_2.L(1)/2;
a_j2 = rec_2.L(2)/2;
T_j = a_rec;
while (T_j>=pi)||(T_j<0)T_j = T_j - sign(T_j)*pi;
end
if (T_j>=0)&&(T_j<=pi/2)lambda = 1;
elseif (T_j>pi/2)&&(T_j<pi)lambda = -1;
end
L = sqrt(a_j1^2+a_j2^2);
U_j = atan(a_j2/a_j1);
%% 函数体
x_v11 = a_i1 + lambda*L*cos(T_j-lambda*U_j);
x_v12 = a_i2 + lambda*L*sin(T_j-lambda*U_j);
x_v21 = a_i1 + L*cos(T_j+lambda*U_j);
x_v22 = a_i2 + L*sin(T_j+lambda*U_j);
x_v31 = -a_i1 + L*cos(T_j+lambda*U_j);
x_v32 = x_v22;
x_v41 = -x_v11;
x_v42 = a_i2 - lambda*L*sin(T_j-lambda*U_j);
x_v51 = -x_v11;
x_v52 = -x_v12;
x_v61 = -x_v21;
x_v62 = -x_v22;
x_v71 = -x_v31;
x_v72 = -x_v32;
x_v81 = -x_v41;
x_v82 = -x_v42;
point = [x_v11,x_v12; x_v21,x_v22; x_v31,x_v32; x_v41,x_v42;...x_v51,x_v52; x_v61,x_v62; x_v71,x_v72; x_v81,x_v82;];
end

2.2 判断点是否位于多边形内

%% 函数定义
% 射线法判断点是否位于多边形内
function tf = IsPointInPolygon(point, polygon)
%% 参考
% 王燕平, 刘永和. 射线法判断平面中的点在多边形内外的算法 [J]. 山西建筑, 2007, 33): 364-5.
%% 参数定义
% point 点坐标,[x,y];
% polygon 多边形点坐标,[x_1,y_1; x_2,y_2; ... x_n,y_n];
num_l = 0; % 左射线与多边形的交点个数
num_r = 0; % 右射线与多边形的交点个数
line = [polygon; polygon(1,:)];
%% 函数体
% 计算射线与多边形的交点个数
for id_l = 1:size(polygon,1)line_t = [line(id_l,:); line(id_l+1,:)];% 点位于多边形上if PointSegmentDistance(point,line_t)<=0.001tf = 1; return;endnum_r = num_r + IsRightRayIntersectSide(point,line_t);num_l = num_l + IsLeftRayIntersectSide(point,line_t);
end
% 射线穿过多边形顶点
p_x = polygon(point(2) == polygon(:,2),1); % 与点同y坐标的多边形顶点,它们的x坐标
for id_p = 1:length(p_x)if p_x(id_p)<point(1)num_l = num_l - 1;elsenum_r = num_r - 1;end
end
% 判断点是否位于多边形内
if (rem(num_r,2)~=0)&&(rem(num_l,2)~=0)tf = 1;
elsetf = 0;
end
endfunction num = IsRightRayIntersectSide(point,line)
%% 函数定义
% 判断右射线与边是否相交
%% 参数定义
% point 射线起点坐标,[x,y];
% line 边的端点坐标,[x_1,y_1; x_2,y_2];
% num 射线与边是否相交
%% 函数体
num = 0;
if point(1)>max(line(1,1),line(2,1))% 点位于边的右侧 return;
elseif point(2)<min(line(1,2),line(2,2))% 点位于边的下侧return;
elseif point(2)>max(line(1,2),line(2,2))% 点位于边的上侧return;
elseif point(1)<min(line(1,1),line(2,1))% 点位于边的左侧num = 1; return;
elsex_i = (line(2,1)-line(1,1))/(line(2,2)-line(1,2))*(point(2)-line(1,2)) + line(1,1);if x_i<point(1)return;elsenum = 1; return;end
end
endfunction num = IsLeftRayIntersectSide(point,line)
%% 函数定义
% 判断左射线与边是否相交
%% 参数定义
% point 射线起点坐标,[x,y];
% line 边的端点坐标,[x_1,y_1; x_2,y_2];
% num 射线与边是否相交
%% 函数体
num = 0;
if point(1)<min(line(1,1),line(2,1))% 点位于边的左侧 return;
elseif point(2)<min(line(1,2),line(2,2))% 点位于边的下侧return;
elseif point(2)>max(line(1,2),line(2,2))% 点位于边的上侧return;
elseif point(1)>max(line(1,1),line(2,1))% 点位于边的右侧num = 1; return;
elsex_i = (line(2,1)-line(1,1))/(line(2,2)-line(1,2))*(point(2)-line(1,2)) + line(1,1);if x_i>point(1)return;elsenum = 1; return;end
end
end

2.3 计算点到线段的最小距离

%% 函数定义
% 计算点到线段的距离
function d = PointSegmentDistance(p,s)
%% 参考
% https://www.cnblogs.com/flyinggod/p/9359534.html
%% 参数定义
% p 点坐标,[x,y];
% s 线段两端点坐标,[x_1,y_1; x_2,y_2];
x=p(1); x1=s(1,1); x2=s(2,1);
y=p(2); y1=s(1,2); y2=s(2,2);
%% 函数体
cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
if (cross <= 0)d = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); return;
end
d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
if (cross >= d2)d = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); return;
end
r = cross / d2;
px = x1 + (x2 - x1) * r;
py = y1 + (y2 - y1) * r;
d = sqrt((x - px) * (x - px) + (py - y) * (py - y));

MATLAB_平面几何_判断两平面矩形是否干涉相关推荐

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

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

  2. 判断两个矩形相交以及求出相交的区域

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

  3. 不使用物理系统判断两个矩形是否碰撞

    如图所示,不使用物理系统去检测两个物体是否碰撞的效果. 注意:两个物体如果一直相交,在Update中处理的时候会一直输出,在实际使用时需要注意相交时的处理. 直接上代码: 检测碰撞使用的是两个节点,节 ...

  4. C++ 如何判断两个矩形框有交集

    矩形框是否有交集的判断 本人也查找了一些方法,发现直接套用公式,无法满足需求,主要是自己没有花一点时间去思考: 矩形框的判断,主要方法是判断两个矩形没有交集,然后再取反,就能判断出矩形框是否存在交集: ...

  5. 判断两个矩形是否有重合部分

    最近在做人工智能项目,需要对两个矩形是否有重合做出判读 但注意的是,不是判断两个检测目标是否重合,检测目标的矩形只要左上角点和右下角点就可表示一个矩形,判断是否重合比较简单,但是现在是两个矩形是有一定 ...

  6. 如何判断两个矩形相交

    假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形        rect1{(minx1, miny1)(maxx1, maxy1)}        rect2 ...

  7. 判断两个矩形是否重叠

    题目(2018-11-20) 用一个对象的数据来表示一个矩形的位置和大小: {x: 100,y: 100,width: 150,height: 250 } 它表示一个宽为150高为250的矩形在页面上 ...

  8. vue 判断两对象是否一致_判断两个对象的值是否相等

    判断两个对象的值是否相等 源代码 function isEqual (a, b) { const classNameA = toString.call(a) const classNameB = to ...

  9. java 年月跨度_判断两个日期的跨度是否超过一年(12个月)

    判断两个日期的跨度是否超过一年 写这个工具类是因为在处理查询业务的时候遇到了一个问题, 要求是查询的时间范围不能超过十二个月,自己找了一下没有比较简单的实现方法, 就自己理了一下思路自己写了这个工具类 ...

最新文章

  1. 用GAN来做图像生成,这是最好的方法
  2. Android的BroadcastReceiver 广播 短信拦截
  3. Perl,Python,Ruby,Javascript 四种脚本语言比较
  4. 配置Ubuntu系统环境变量
  5. bash快捷键(防忘)
  6. asp.net IsPostBack属性
  7. mybatis-plus主键生成策略
  8. php7.1.1一键安装/配置文件简单优化
  9. python安装PIL模块
  10. oracle11g shrink,shrink lob
  11. 【嵌入式学习-STM32F103-EXTI外部中断】
  12. 【旧资料整理】8086汇编 鼠标操作
  13. vue专题之vue项目端口号修改【四】
  14. 封禁恶意IP访问在我司实践总结
  15. OSPF与BGP联动
  16. 读刘文鹏之《古代埃及史》
  17. 浏览器打不开服务器网页,浏览器打不开某几个网页,这样来解决
  18. HotSwap和JRebel原理
  19. CODE[VS] 1219 骑士游历
  20. 低成本实现三联屏拼接

热门文章

  1. MySQL的使用笔记
  2. xlsx文件和csv文件的相互转化
  3. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解
  4. zabbix mysql安装配置_ZABBIX4.4 安装及配置
  5. 树莓派的使用(一、安装系统)
  6. C语言课后习题(9)
  7. 资源放送丨《Oracle PDB Refresh实战分享》PPT视频
  8. 线上活动预告丨拥抱金融科技 洞见数据未来
  9. 直播丨 SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈
  10. MySQL 5.7 update误操作后数据恢复详解