去除重叠的闭合区域
题目描述
在图形开发过程中,需要求最小闭合区域,当获得了所有的闭合区域后,有一部分区域是重叠的,现设计算法将重叠的区域删除。(此算法类似于 删除无序数组中重复的元素)
一、去除重叠的图形
//去除重叠的图形 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; }