现丑了! 公布部分代码! 希望有人用得上!
#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;
}