将一系列的点顺序连接成多边形算法,急,在线等,==>高分<==

xuehulangjtn 2005-03-28 11:29:23
现在知道一系列的点的X、Y坐标,要将这些点顺序的连接成一个封闭的多边形,点的数量非常多,点不只作为多边形的顶点,而是同一直线上的多个点连接构成多边形的一条边。请问如果设计这个程序?
...全文
930 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
许野平 2005-03-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>

struct point {int x, y, done;};

int find_next_point(int i, point q[], int size) {
float minv = 9999999999, v;
int mini = -1;
for (int n = 0; n < size; n++) {
if (!q[n].done && ((v = abs(q[n].x - q[i].y) + abs(q[n].y - q[i].y)) < minv)) {
minv = v;
mini = n;
}
}
return mini;
}

void f(point q[], int size) {
for (int i = 0; i >= 0; i = find_next_point(i, q, size)) {
q[i].done = 1;
printf("(%d, %d)\n", q[i].x, q[i].y);
}
}

void main() {
point q[4] = {{0,0,0},{0,1,0},{1,1,0},{1,0,0}};
f(q, 4);
}
xuehulangjtn 2005-03-28
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心) ,可以仔细介绍一下第二种方法吗,因为我也要处理是凹多边形的情况
寻开心 2005-03-28
  • 打赏
  • 举报
回复
凸包是包围所有点的最小的凸多边形,对于任意点集凸包只有一个
如果多边形是凸多边形,凸包就是它本身
对于凹多边形,凸包和多边形不同

从你给的例子看,你的多边形就是凸多边形啊
这样两个算法是等价的

还是用第一个方法吧。
从任意一点开始,计算其他点和它的夹角以及距离(平方距离就可以),按照角度排序,如果角度相同的再按照距离排序,按照排序的结果顺序连接这些点就是了。
xuehulangjtn 2005-03-28
  • 打赏
  • 举报
回复
ref>> 还可以建立凸包,凸包必然是唯一的
ref>> 然后看其他点,距离那个线段最近,就关联到那个线段中间去
--------------------------------------------------------------- 不明白

我的算法要求是按一定的顺序将所有的点从头到尾的连接,如下面的



. . . . . ..
.
. .

. .

.
. .
. .
. . . . . .. ......
luopan0021 2005-03-28
  • 打赏
  • 举报
回复
凸包是什么意思?
寻开心 2005-03-28
  • 打赏
  • 举报
回复
还可以建立凸包,凸包必然是唯一的
然后看其他点,距离那个线段最近,就关联到那个线段中间去
寻开心 2005-03-28
  • 打赏
  • 举报
回复
这样的答案不是唯一的啊。

给出一个方法
从一个点开始,计算其他的点和这个其他点连出射线的角度
按照角度排序,并且从这点出发,按照角度的顺序连接,就可以得到了。
syy64 2005-03-28
  • 打赏
  • 举报
回复
可以考虑先将这些点建成三角网,从三角网中再考虑形成多边形。
mmmcd 2005-03-28
  • 打赏
  • 举报
回复
可以在所给点集合内任取一点,向其他的点作射线,
然后根据射线跟坐标轴的夹角大小确定连线的先后次序。

解不唯一,情况也很复杂。
寻开心 2005-03-28
  • 打赏
  • 举报
回复
这种方法本来就已经考虑了凹多边形的情况了

凸包的算法很多
http://www.gameres.com/Articles/Abstract/Geometry.htm

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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