惭愧,自己看着都头晕,权当对过去走歪路的纪念!
/**
* 挑出传入的所有点中重复的点~
*/
-(vector<b2Vec2>*)selectDuplicatedVertices2:(vector<vector<b2Vec2>*>*)allVertices
{
vector<b2Vec2> *target =
new vector<b2Vec2>();
for(uint i =
0; i < allVertices->size(); i ++) {
vector<b2Vec2> *item = allVertices->at(i);
int itemSize = item->size();
// 1。初始化权值~
int *weight = new
int[itemSize];
for(int j =
0; j < itemSize; ++ j) {
weight[j] =0;
}
// 2。统计权值~
int expectLineCount = 0;
for(uint j = i +
1; j < allVertices->size(); ++ j) {
vector<b2Vec2> *beCompared = allVertices->at(j);
int duplicatedVerticesCount = 0;
for(int k =
0; k < itemSize; ++ k) {
b2Vec2 m = item->at(k);
for(uint l =
0; l < beCompared->size(); l ++) {
b2Vec2 n = beCompared->at(l);
if((m.x == n.x && m.y == n.y) ||
(m.x <= n.x+_gCfg.floatErrorRange
&& m.x >= n.x-_gCfg.floatErrorRange &&
m.y <= n.y+_gCfg.floatErrorRange
&& m.y >= n.y-_gCfg.floatErrorRange)) {
weight[k] +=1;
duplicatedVerticesCount +=1;
}
}
}
// NSLog(@"duplicatedVerticesCount=%d", duplicatedVerticesCount);
/**
* duplicatedVerticesCount如果等于 1
的话表示当前2多边形只有1个顶点相交
*这两个多边形是不具有相邻边的
*只有当 duplicatedVerticesCount
等于 2
的时候才表示2多边形有1条相邻边~
*/
if(duplicatedVerticesCount == 2) {
expectLineCount +=1;
}
}
// 3。根据权值数据进行重复边的筛选~
int offset = 0;
vector<b2Vec2> candidates;
LoopLabel:
int *weightCopy = new
int[itemSize];
int actualLineCount = 0;
for(int j =
0; j < itemSize; ++ j) {
weightCopy[j] = weight[j];
}
for(int j =
0; j < itemSize; ++ j) {
if(weightCopy[(j+offset)%itemSize] >= 1 && weightCopy[(j+offset+1)%itemSize] >=1) {
weightCopy[(j+offset)%itemSize] -=1;
weightCopy[(j+offset+1)%itemSize] -=1;
candidates.push_back(item->at((j+offset)%itemSize));
candidates.push_back(item->at((j+offset+1)%itemSize));
actualLineCount +=1;
}
}
delete weightCopy;
/**
*开始是这么写的判断:if(actualLineCount != expectLineCount),但是我发现程序很容易就被卡住
*然后我改成下面这样:if(actualLineCount < expectLineCount)
*因为:
* expectLineCount可能小于 actualLineCount,这个最多体现为冰块儿内部出现黑线~
*但若要使 actualLineCount
一直都小于 expectLineCount
的话,将陷入死循环致使程序卡壳~
*/
if(actualLineCount < expectLineCount) {
// NSLog(@"checkValid == NO!!");
candidates.clear();
offset +=1;
goto LoopLabel;
}
for(uint j =
0; j < candidates.size(); ++ j) {
target->push_back(candidates.at(j));
}
candidates.clear();
delete weight;
}
return target;
}
分享到:
相关推荐
凸多边形面积 【问题描述】 给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积. 输入数据表示了如图所示的四边形。其面积为5.00。 评分标准: 本程序允许使用数学库函数,如果你的输出与标准...
问题描述:描述了凸多边形最优三角剖分的问题背景 使用C++,实现了凸多边形最优三角剖分,有足够的注释 内含可执行程序
简单多边形,没有自交、没有内孔,的凸分解, 转自网上,感谢高手,有诗为证:君不见黄河之水天上来,奔流到海不复回。 君不见高堂明镜悲白发,朝如青丝暮成雪。
算法的project,凸多边形三角划分。 代码c++编写 ,vc6编译。有mfc的画图,也是vc6. 有详细的文档报告。
给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积. 输入数据表示了如图所示的四边形。其面积为5.00。 评分标准: 本程序允许使用数学库函数,如果你的输出与标准答案相差不超过0.02则得满分...
计算几何计算点到凸多边形距离代码 已在各大oj在线测评通过
知道了凸多边形的顶点,将其排序使得这些点按顺序连接之后能形成一个凸多边形
\课件\算法设计\凸多边形的最优三角剖分\凸多边形的最优三角剖分
OpenGL 凸多边形截取线段 Cyrus-Beck 算法 OpenGL 凸多边形截取线段 Cyrus-Beck 算法 OpenGL 凸多边形截取线段 Cyrus-Beck 算法 OpenGL 凸多边形截取线段 Cyrus-Beck 算法 OpenGL 凸多边形截取线段 Cyrus-Beck 算法 ...
判断点是否在一个多边形区域内, 支持凸多边形与凹多边形(算法源于QT的QPolygonF)
凸多边形最小面积四边形包围盒算法
凸多边形之间的Hausdorff距离-机翻简排。介绍了hausdorff知识、算法、应用领域及一个示例。
通过输入n个点判断这n个点能否构成凸多边形,是输出是否则输出否!
计算机算法设计与分析 凸多边形最优三角剖分
设P是一个有n个顶点的凸多边形,P中的弦是P中连接两个非相邻顶点的线段。用P中的(n-3)条弦将P剖分成(n-2)个三角形(如下图所示)。使得(n-3)条弦的长度之和最小的三角形剖分称为最优三角剖分。
详细讲解了怎么创建凸多边形,对源代码进行了注释
一个正凸N边形,可以用N-3条互不相交的对角线将正N边形分成N-2个三角形。 现在要求读入N边形的N(N≤20),输出不同划分方法的总数(要求解的是划分方法数,而不需要输出各种划分法)。
给出多个点的左边求他们围起来的凸多边形的面积,c++实现的,很给力
凸多边形最优三角剖分(C语言编写) 算法
用opencv构建凸多边形的源代码工程,有详细的源代码和创建好的工程项目