链码表到线段表的转换

不一定会用得到,先放在这里,供以后查阅
本段摘抄自左飞的数字图像处理原理与实践

/********************************************************** 
* 链码表到线段表的转换
* 参数: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;    //记录线段表中线段数量 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值