TA的每日心情![](source/plugin/dsu_paulsign/img/emot/kx.gif) | 开心 昨天 15:23 |
---|
签到天数: 69 天 [LV.6]常住居民II
管理员
- 积分
- 2704
|
在图形开发过程中,需要求最小闭合区域,当获得了所有的闭合区域后,有一部分区域是重叠的,现设计算法将重叠的区域删除。(此算法类似于 删除无序数组中重复的元素)
一、去除重叠的图形[code]//去除重叠的图形
std::vector> removeOverlapArea(vector> ClosedArea)
{
//> 表示一个闭合区域,有多条线段围成
//vector> 表示闭合区域的集合
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 AreaLeft,vector 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;
}[/code] |
|