题目描述:
在图形开发过程中,需要求最小闭合区域,当获得了所有的闭合区域后,有一部分区域是重叠的,现设计算法将重叠的区域删除。(此算法类似于 删除无序数组中重复的元素)
//去除重叠的图形
std::vector<std::vector<CLine>> removeOverlapArea(vector<vector<CLine>> ClosedArea)
{
//<vector<CLine>> 表示一个闭合区域,有多条线段围成
//vector<vector<CLine>> 表示闭合区域的集合
unsigned int nSize = ClosedArea.size();
if (nSize < 2) //只有一個閉合區域
{
return ClosedArea;
}
//去除重叠的区域
size_t n = ClosedArea.size();
size_t j = 0;
for (size_t i=0; i < n; i++)
{
for(size_t j=0;j<i;j++)
{
//if(arr[i]==arr[j])
if(IsOverlap(ClosedArea[i],ClosedArea[j]))
{
n--;
for (size_t k=i; k<n; k++)
{
ClosedArea[k]=ClosedArea[k+1];
}
i--;
}
}
}
vector<vector<CLine>>::iterator it1,it2;
it1 = ClosedArea.begin() + n;
it2 = ClosedArea.end();
ClosedArea.erase(it1,it2);
return ClosedArea;
}
//判断是否是重合的图形
bool IsOverlap(vector<CLine> AreaLeft,vector<CLine> AreaRight)
{
for (unsigned int i = 0;i < AreaLeft.size(); i++)
{
CLine m_lineLeft = AreaLeft[i];
bool bEqualLine = false;
for (unsigned int j = 0;j < AreaRight.size();j++)
{
if (m_lineLeft.isEqual(AreaRight[j]))
{
bEqualLine = true;
}
}
if (bEqualLine == false)
{
return false; //只要有一条线段不相同,必然不重合
}
}
return true;
}