⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zigzag.cpp

📁 在视频处理中经常要用到Zigzag序号及其逆序号
💻 CPP
字号:
// Zigzag.cpp: implementation of the CZigzag class.
//////////////////////////////////////////////////////////////////////
/********************************************************************/
/*      *--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*              */
/*      |           中国科学院计算技术研究所         |              */
/*      *--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*              */
/*      编程环境: Visual C++ 6.0  (Windows 2000)                    */
/*		作    者: 唐 胜 						                    */
/*		邮    箱: ts@ict.ac.cn      			                    */
/*      发布版本: V1.1                                              */
/*      发布日期: July. 09, 2005     		 	                    */
/*      功能说明:Zigzag和行列序号的转换类Zigzag的实现程序          */
/********************************************************************/
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Zigzag.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

/************************************************************************
修改日期:2005-07-09
功能说明: 构造函数
调用格式: 
参数说明: m:块的总行数,n:块的总列数
输出说明: 无
函数调用: 无
*************************************************************************/
CZigzag::CZigzag(int m, int n)
{
	m_row=m;
	m_col=n;

	m_Zigzag2Y= NULL;
	m_Zigzag2X= NULL;
	m_XY2Zigzag= NULL;
}

/************************************************************************
修改日期:2005-07-09
功能说明: 析构函数
调用格式: 
参数说明: 无
输出说明: 无
函数调用: 无
*************************************************************************/
CZigzag::~CZigzag()
{
	if (m_Zigzag2Y!=NULL)
		delete [] m_Zigzag2Y;
	if (m_Zigzag2X!=NULL)
		delete [] m_Zigzag2X;
	if (m_XY2Zigzag!=NULL)
		delete [] m_XY2Zigzag;
}

/************************************************************************
修改日期:2004-09-12
功能说明: 生成Zigzag序号及逆序号
调用格式: ZigEncode()
参数说明: 无
输出说明: 成功返回true,分配内存不足时返回false
函数调用: 无
*************************************************************************/
bool CZigzag::ZigEncode()
{
	int blknum=m_row*m_col;
	m_Zigzag2Y=new int[blknum];
	if (!m_Zigzag2Y)
		return false;
	m_Zigzag2X=new int[blknum];
	if (!m_Zigzag2X)
		return false;
	m_XY2Zigzag=new int[blknum];
	if (!m_XY2Zigzag)
		return false;

	int i, j, k;
	int S=0;
	m_XY2Zigzag[0]=S;
	m_Zigzag2X[S]=0;
	m_Zigzag2Y[S]=0;

	for (i=1; i<m_col; i=i+2)
	{
		k=i;
		for (j=0; j<m_row && k>=0; j++)
		{
			m_XY2Zigzag[j*m_col+k]=++S;
			m_Zigzag2X[S]=j;
			m_Zigzag2Y[S]=k;
			k--;
		}
		if (j==m_row)
			break;
		if (k<0)
			k++;

		for (; j>=0 && k<m_col; j--)
		{
			m_XY2Zigzag[j*m_col+k]=++S;
			m_Zigzag2X[S]=j;
			m_Zigzag2Y[S]=k;
			k++;
		}
		if (k==m_col)
			break;
	}


	if (j==m_row)
	{
		k=k+2;
		for (i=k; i<m_col; i=i+2)
		{
			k=i;
			j--;
			for (; j>=0 && k<m_col; j--)
			{
				m_XY2Zigzag[j*m_col+k]=++S;
				m_Zigzag2X[S]=j;
				m_Zigzag2Y[S]=k;
				k++;
			}
			if (k==m_col)
			{
				k--;
				j=j+2;
			}
			else
			{
				j++;
			}
			for (; j<m_row && k>=0; j++)
			{
				m_XY2Zigzag[j*m_col+k]=++S;
				m_Zigzag2X[S]=j;
				m_Zigzag2Y[S]=k;
				k--;
			}
		}
	}

	if (k==m_col)
	{
		j=j+2;
		for (; j<m_row; j=j+2)
		{
			i=j;
			k--;
			for (; i<m_row && k>=0; i++)
			{
				m_XY2Zigzag[i*m_col+k]=++S;
				m_Zigzag2X[S]=i;
				m_Zigzag2Y[S]=k;
				k--;
			}

			if (i==m_row)
			{
				i--;
				k=k+2;
			}
			else
			{
				k++;
			}	
			for (; i>=0 && k<m_col; i--)
			{
				m_XY2Zigzag[i*m_col+k]=++S;
				m_Zigzag2X[S]=i;
				m_Zigzag2Y[S]=k;
				k++;
			}
		}
	}

	return true;
}

/************************************************************************
修改日期:2005-07-09
功能说明: 返回坐标为(i,j)的Zigzag序号
调用格式: XY2Zigzag(i, j)
参数说明: i:行坐标(从0开始),j:列坐标(从0开始)
输出说明: 返回坐标为(i,j)的Zigzag序号
函数调用: 无
*************************************************************************/
int CZigzag::XY2Zigzag(int i, int j)
{
	if (m_XY2Zigzag!=NULL)
		return m_XY2Zigzag[i*m_col+j];
	else
		return -1;
}

/************************************************************************
修改日期:2005-07-09
功能说明: 返回Zigzag序号为z的行序号
调用格式: Zigzag2X(z)
参数说明: z:指定的Zigzag序号
输出说明: 返回Zigzag序号为z的行序号(从0开始)
函数调用: 无
*************************************************************************/
int CZigzag::Zigzag2X(int z)
{
	if (m_Zigzag2X!=NULL)
		return m_Zigzag2X[z];
	else
		return -1;
}

/************************************************************************
修改日期:2005-07-09
功能说明: 返回Zigzag序号为z的列序号
调用格式: Zigzag2X(z)
参数说明: z:指定的Zigzag序号
输出说明: 返回Zigzag序号为z的列序号(从0开始)
函数调用: 无
*************************************************************************/
int CZigzag::Zigzag2Y(int z)
{
	if (m_Zigzag2Y!=NULL)
		return m_Zigzag2Y[z];
	else
		return -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -