求助:任意多边形切分成三角形的算法和代码!

wongflying 2004-08-02 03:41:05
我搜索了下以前的贴子,也有人问过,请各位大侠,有这方面的算法和代码,能否mail给我!
谢先!
wongflying@163.com
...全文
762 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
czmissyou 2004-12-06
  • 打赏
  • 举报
回复
不好意思,没有看到这里还有一个贴子。

特征角就是三角形中最小的那个角。

由于多边形顶点是顺时针或逆时针连接起来的,顺序连接起来的三个顶点不可能包含其它顶点。
alphapaopao 2004-08-05
  • 打赏
  • 举报
回复
请教:

“并且由P、Q、R 所构成的三角形PQR不包含多边形上其他顶点”
如果包含其它顶点怎么办?

请问什么叫做 “特征角”
opentuxedo 2004-08-04
  • 打赏
  • 举报
回复
这还要什么现成代码,记得当初写这个算法时才用了半小时。就是一个循环链表,见凸点就切掉。凸点计算可以用向量叉乘
|i j k |
|x1 y1 z1|
|x2 y2 z2|
其中z1=z2=0 ,不说了,自己想吧。
wongflying 2004-08-04
  • 打赏
  • 举报
回复
请问“海中石”有现成的代码么?能否提供,我比较急!谢先!
czmissyou 2004-08-03
  • 打赏
  • 举报
回复
我是这样做的:
1) 用单向循环链表保存多边形顶点,并计算这个链表中每一个顶点的凸凹性。
2) 在循环链表中顺序取三个结点P、Q、R ,如果Q 为凸点,并且由P、Q、R 所构成的三角形PQR不包含多边形上其他顶点,则计算△PQR 的特征角。求出所有这样的三角形,从中选择特征角最大的△PQR ,保存该三角形,并从链表中删去结点Q。
3) 如果链表中不存在三个以上顶点,则转步骤2)。
4) 由链表中的最后三个顶点构成一个三角形。
syy64 2004-08-03
  • 打赏
  • 举报
回复
不容易呀,我曾经发过一个这个帖子。
wongflying 2004-08-02
  • 打赏
  • 举报
回复
有没有多边形也适用的代码呢?
谢先!
zxq80 2004-08-02
  • 打赏
  • 举报
回复
这是以前别人的
给定一简单多边形,找出一个肯定在该多边形内的点
定理1:每个多边形至少有一个凸顶点
定理2:顶点数>=4的简单多边形至少有一条对角线
结论: x坐标最大,最小的点肯定是凸顶点
y坐标最大,最小的点肯定是凸顶点
*/
POINT a_point_insidepoly(int vcount, POINT polygon[])
{
POINT v, a, b, r;
int i, index;
v = polygon[0];
index = 0;
for(i = 1; i < vcount; i++){//寻找一个凸顶点,实际上最低点肯定是凸顶点
if(polygon[i].y < v.y){
v = polygon[i];
index = i;
}
}
a = polygon[(index - 1 + vcount) % vcount]; //得到v的前一个顶点
b = polygon[(index + 1) % vcount]; //得到v的后一个顶点
POINT tri[3], q;
tri[0] = a;
tri[1] = v;
tri[2] = b;
double md = INF;
int in1 = index;
bool bin = false;
for(i = 0; i < vcount; i++){ //寻找在三角形avb内且离顶点v最近的顶点q
if(i == index) continue;
if(i == (index - 1 + vcount) % vcount) continue;
if(i == (index + 1) % vcount) continue;
if(!InsideConvexPolygon(3, tri, polygon[i])) continue;
bin = true;
if(dist(v, polygon[i]) < md){
q = polygon[i];
md = dist(v, q);
}
}
if(!bin){ //没有顶点在三角形avb内,返回线段ab中点
r.x = (a.x + b.x) / 2;
r.y = (a.y + b.y) / 2;
return r;
}
r.x = (v.x + q.x) / 2; //返回线段vq的中点
r.y = (v.y + q.y) / 2;
return r;
}



//上面的函数调用一个InsideConvexPolygon 函数,如下:
//点q是凸多边形polygon内时,返回true;
//注意:多边形polygon一定要是凸多边形,否则要用射线法来判断,比较复杂
bool InsideConvexPolygon(int vcount, POINT polygon[], POINT q)
{// 可用于三角形!
POINT p;
LINESEG l;
int i;
p.x = 0; p.y = 0;
for(i = 0; i < vcount; i++){// 寻找一个肯定在多边形polygon内的点p:多边形顶点平均值
p.x += polygon[i].x;
p.y += polygon[i].y;
}
p.x /= vcount;
p.y /= vcount;
for(i = 0; i < vcount; i++){
l.s = polygon[i];
l.e = polygon[(i + 1) % vcount];
if(multiply(p, l.e, l.s) * multiply(q, l.e, l.s) < 0) /* 点p和点q在边l的两侧,说明
点q肯定在多边形外 */
break;
}
return (i == vcount);
}

//HUNTON自己加的
int multiply(POINT P, POINT P1, POINT P2)
{
return((P2.y - P1.y) * (P.x - P1.x) + (P1.y - P.y) * (P2.x - P1.x));
}


//从原理上说,要找到一个对角线把多边形分成两个部分,然后对每个部分再重复生成对角线分割就可以得到多边形的一种三角形分割了。
POINT a_point_insidepoly(int vcount, POINT polygon[])
{
POINT v, a, b, r;
int i, index;
v = polygon[0];
index = 0;

float y2 = v.y; // new line

for(i = 1; i < vcount; i++){//寻找一个凸顶点,实际上最低点肯定是凸顶点
if(polygon[i].y < v.y){
y2 = v.y; // new line 次小的Y
v = polygon[i]; // 最小的 Y
index = i;
}
}
a = polygon[(index - 1 + vcount) % vcount]; //得到v的前一个顶点
b = polygon[(index + 1) % vcount]; //得到v的后一个顶点

// 下面是新的代码
POINT p1, p2; // new line, 保存两边和y=y2的直线的交点
if ( a.y == v.y )
p1 = a; // 边平行于X轴
else{
p1.y = y2;
p1.x = a.x - (a.y - y2) / (a.y - v.y) * (a.x - v.x); // 肯定不会除零
}
if( b.y == v.y ) p2 = b; // 边平行于X轴
else{
p2.y = y2;
p2.x = b.x - (b.y - y2) / (b.y - v.y) * (b.x - v.x); // 肯定不会除零
}

r.x = (v.x + p1.x + p2.x) / 3;
r.y = (v.y + p1.y + p2.y) / 3;

return r;
}

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧