现丑了! 公布部分代码! 希望有人用得上!

huanyun 2004-07-26 06:10:54

#include <math.h>

typedef struct tagXRECT
{
short xs,ys,xe,ye;
}XRECT;

typedef struct tagXPOINT
{
short x,y;
}XPOINT;

//给定任意点数组, 获取最小的包含所有点的凸图形点序列
//顺时针方向输出点数组
int GetConvexList(XPOINT* pPtDst, XPOINT* pPtSrc, int nSrc)
{
int nDst = -1;
int i,nStart, nPre, nCur, nNext;
XPOINT ptPre;
if(pPtDst == NULL || pPtSrc == NULL || nSrc < 3) return nDst;

nStart = 0;
for (i=1; i<nSrc; ++i)
{
if(pPtSrc[i].y < pPtSrc[nStart].y || (pPtSrc[i].y == pPtSrc[nStart].y && pPtSrc[i].x < pPtSrc[nStart].x))
nStart = i;
}
double* k = new double[nSrc];
BOOL* bUser= new BOOL[nSrc];
memset(bUser,0,nSrc*sizeof(BOOL));
double kMin=0;
nDst = 0;
pPtDst[0] = pPtSrc[nStart];
ptPre.x = pPtSrc[nStart].x-1000;
ptPre.y = pPtSrc[nStart].y+1;
nPre = nNext = -1;
nCur = nStart;
double ax,ay,bx,by,cx,cy;
BOOL bLine;
while(pPtSrc[nNext].x != pPtSrc[nStart].x || pPtSrc[nNext].y != pPtSrc[nStart].y)
{
bLine = FALSE;
memset(k,0,nSrc*sizeof(double));
for (i=0; i<nSrc; ++i)
{

if(bUser[i] || i == nCur || i == nPre)
{
k[i] = 0x7FFFFFFF;
}
else
{
ax = pPtSrc[nCur].x - pPtSrc[i].x;
ay = pPtSrc[nCur].y - pPtSrc[i].y;
bx = pPtSrc[nCur].x - ptPre.x;
by = pPtSrc[nCur].y - ptPre.y;
cx = pPtSrc[i].x - ptPre.x;
cy = pPtSrc[i].y - ptPre.y;
if(bx*cy == cx*by)
{
if(fabs(bx) > fabs(cx))
{
if(i != nStart) bUser[i] = TRUE;
bLine = TRUE;
break;
}
else if(fabs(bx) < fabs(cx))
{
pPtDst[nDst] = pPtSrc[i];
if(i != nStart) bUser[i] = TRUE;
bLine = TRUE;
break;
}
else if(fabs(by) < fabs(cy))
{
pPtDst[nDst] = pPtSrc[i];
if(i != nStart) bUser[i] = TRUE;
bLine = TRUE;
break;
}
k[i] = 0x7FFFFFFF;
}
else
{
ax=ax*ax; ay=ay*ay;
bx=bx*bx; by=by*by;
cx=cx*cx; cy=cy*cy;
k[i] = (ax+ay+bx+by-cx-cy)/ (2 * sqrt((ax+ay)*(bx+by)));
}
}
}

if(!bLine)
{
nNext = -1;
kMin = (double)0x7FFFFFFF;
for (i=0; i<nSrc; ++i)
{
if(!bUser[i] && k[i] < kMin)
{
kMin = k[i];
nNext = i;
}
}
nDst++;
pPtDst[nDst] = pPtSrc[nNext];
bUser[nNext] = TRUE;
ptPre = pPtSrc[nCur];
nPre = nCur;
nCur = nNext;
}
}
delete []k;
delete []bUser;
return nDst;
}
...全文
288 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weige250 2004-07-28
  • 打赏
  • 举报
回复
up
梧桐168 2004-07-28
  • 打赏
  • 举报
回复
GIS上常用的凸包吧,机工出的数据结构上就有其算法描述
ll3008 2004-07-27
  • 打赏
  • 举报
回复
不好意思,借楼主的地盘了.
ll3008 2004-07-27
  • 打赏
  • 举报
回复
(袁峰 www.fengyuan.com)
高人啊!

我始终不能看到<Windows图形编程>中的HtmlDrv的结果啊!
能不能将完整的文件公布给大家,先谢谢了.

谢谢你写的书,使我提高很大。
huanyun 2004-07-27
  • 打赏
  • 举报
回复
我的处理范围比较小 通常不超过 1500*1500
谢谢 FengYuanMSFT(袁峰 www.fengyuan.com)
FengYuanMSFT 2004-07-27
  • 打赏
  • 举报
回复
Why use short?
Not enough comments.
No error check on allocation.
zdwaiter 2004-07-26
  • 打赏
  • 举报
回复
up
社会栋梁 2004-07-26
  • 打赏
  • 举报
回复
ding
flyingxu 2004-07-26
  • 打赏
  • 举报
回复
将一个凹多变行变成几个凸多变行?
syy64 2004-07-26
  • 打赏
  • 举报
回复
学习。

19,468

社区成员

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

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