求两条区间的交集∩和并集∪

最近遇到一个问题,

  • 求两条区间的交集(重合)部分
  • 求两个区间并集∪
    以下 的内容就是解决这一问题的思路以及相应的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

以上,写的有点仓促。

你可能感兴趣的:(求两条区间的交集∩和并集∪)