最近遇到一个问题,
- 求两条区间的交集(重合)部分
- 求两个区间并集∪
以下 的内容就是解决这一问题的思路以及相应的matlab程序。
求交集
求两条一直线段的重合部分,也就是求两个线段的交集。对于两条线段,已知线段的两个端点,重合部分的两个端点肯定都在这两个线段的区间之内。所以对4个点逐一进行判断,若端点均在两个线段的区间内,也就是重合部分的端点。
根据的这个思路代码如下:
function [interSect,flag] = coincide(line1,line2)
% line1是一个1*2的矩阵,分别代表线段的两端。line2同上。
% interSect是两个两个线段重合的两个端点,
% 如果两个线段没有重合的点,那么interSect = -1
% flag = -1,两个线段相离
% flag = 0,两个线段有交集
% 以上
% % 两个线段
% a = [2 5];
% b = [3 4];
% % 所有线段的端点,并进行了排序
a = line1;
b = line2;
c = [a b];
c = sort(c);
flag = -1;
result = -1;
index = 1;
for i = 1:length(c)
if( ((c(i) >= a(1) ) && ( c(i) <= a(2) )) && ( ( c(i)>=b(1) ) && (c(i)<=b(2)) ) )
result(index) = c(i);
index = index+1;
flag = 0;
end
end
% for debug
if( flag == -1 )
% disp 两个线段相离!
interSect = result;
else
% 把重复的端点剔除
interSect = unique(result);
% disp 重合的线段是:
% interSect
end
求并集
两个区间的并集大致分为两种情况:
- 两个区间如果相交(有公共的区域),则并集只有一个
下面 举一个简单的例子
[1400.0, 1404.7]∪[1402.0, 1405] = [1400.0, 1405]
- 若两个区间每天公共的部分,那个并集也就有两部分组成
下面 举一个简单的例子
[1400.0, 1404]∪[1408, 1409] = [1400.0, 1404] + [1408, 1409]
这两个例子也就列举了这两个情况,所示求两个区间并集的关键就是判断两个区间是否有交集
下面的就写代码了
clc;clear;close all
%% 求两个区间的并集
a = [1398.7, 1404.7];
b = [1405.0, 1408.7];
endPoints = [a, b];
c = sort(endPoints);
% 首先判断两个区间是否相交,若两个区间相交则,两个区间的并集为最大值和最小值
% 若两个区间相离,则说明两个区间没有共同的点,并集就是两个区间
flag = -1;
index = 1;
for i = 1:length(c)
if ( ((c(i) >= a(1) ) && ( c(i) <= a(2) )) && (( c(i)>=b(1) ) && (c(i)<=b(2) )) )
flag = 0;
end
end
% 有交集
if(flag == 0)
unionSet = [c(1), c(length(c))];
% 无交集
else
unionSet = [a;b];
end
以上,写的有点仓促。