不一定会用得到,先放在这里,供以后查阅
本段摘抄自左飞的数字图像处理原理与实践
/**********************************************************
* 链码表到线段表的转换
* 参数:track为链码表,trackDot为线段表
**********************************************************/
void CodeToDot(int* track, int* trackDot)
{
//链码向量表
int directData[8][2]={
{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},
{-1, 0},{-1, 1},{ 0, 1},{ 1, 1}
};
//由链码到线段的转换表
int transTable[8][8]={
{0,0,0,0,2,2,2,2},
{1,1,1,1,0,3,3,3},
{1,1,1,1,0,0,3,3},
{1,1,1,1,0,0,0,3},
{1,1,1,1,0,0,0,0},
{0,3,3,3,2,2,2,2},
{0,0,3,3,2,2,2,2},
{0,0,0,3,2,2,2,2}
};
int x,y,m,dIn,dOut,i,j,k,c;
//初始化坐标
x=track[0];
y=track[1];
//确定链码数量
m=track[2];
//把第一个链码加到链码表末尾便于对起始的处理
track[m+3]=track[3];
k=3;
//顺序检测链码表并提取左右端点和奇异点
for(i=3;i<m+3;i++)
{
dIn=track[i]; //进入链码
dOut=track[i+1]; //离开链码
x+=directData[dIn][0]; //计算当前点坐标
y+=directData[dIn][1];
c=transTable[dIn][dOut]; //获得当前点分类
if(c>0) //若为左右端点则把该点加入线段表
{
trackDot[k]=x;
trackDot[k+1]=y;
k+=2;
if(c==3) //若为奇异点则把该点再次加入线段表
{
trackDot[k]=x;
trackDot[k+1]=y;
k+=2;
}
}
}
m=(k-3)/2; //计算点的数量
//对所有点根据纵坐标排序
for(i=0;i<m-1;i++)
{
k=i;
for(j=i+1;j<m;j++)
{
if(trackDot[j*2+4]<trackDot[k*2+4])
{
k=j;
}
}
trackDot[i*2+1]=trackDot[k*2+3];
trackDot[i*2+2]=trackDot[k*2+4];
trackDot[k*2+3]=trackDot[i*2+3];
trackDot[k*2+4]=trackDot[i*2+4];
}
i=0;
//对纵坐标相同的点根据横坐标排序
while(i<m)
{
k=i;
while(i<m && trackDot[i*2+2]==trackDot[k*2+2])
{
i++;
}
for(;k<i-1;k++)
{
for(j=i-1;j>k;j--)
{
if(trackDot[j*2+1]<trackDot[j*2-1])
{
x=trackDot[j*2+1];
y=trackDot[j*2+2];
trackDot[j*2+1]=trackDot[j*2-1];
trackDot[j*2+2]=trackDot[j*2];
trackDot[j*2-1]=x;
trackDot[j*2]=y;
}
}
}
}
trackDot[0]=m/2; //记录线段表中线段数量
}