原创 轮廓长度与面积

2009-2-20 10:10 2461 9 9 分类: 软件与OS

    采用链码表计算轮廓的长度,链码值为奇数时,长度为sqrt(2),否则,长度为1。统计奇数链码值数量,非奇数链码值数目为链码长度减去奇数链码值数量。
    采用线段表计算轮廓的面积,只需要将所有线段长度求和即可。


#include <math.h>
#include <vector>


typedef std::vector<int>   ivecChainCode;
typedef std::vector<POINT> ptvecLineTable;


// 轮廓长度
// 1. ChainCode    链码表
double ContourLength(ivecChainCode ChainCode)
{
    double dLength  = 0;
    int    nOddCode = 0;
    for (ivecChainCode::iterator i = ChainCode.begin(); i != ChainCode.end(); i++)
    {
        if (*i & 0x01) nOddCode++;
    }
    dLength = ChainCode.size() - nOddCode + nOddCode * sqrt(2.0);
    return dLength;
}


// 轮廓面积
// 1. LineTable    线段表
long ContourArea(ptvecLineTable LineTable)
{
    long lArea = 0;
    for (ptvecLineTable::iterator i = LineTable.begin(); i != LineTable.end(); i += 2)
    {
        lArea += ((i + 1)->x - i->x + 1);
    }
    return lArea;
}

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条