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

📄 dipdoc.cpp

📁 一个基于matlab与vc混合编程小例子,对初学者非常有利
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	
	// 恢复光标
	EndWaitCursor();
}

void CDipDoc::OnGeomRota() 
{
	//旋转角度
	int nRotateAngle;
	int nIntorType;
	BOOL bIntorType;
	
	//创建对话框
	CDlgGeoRota dlgPara;
	
	//初始化变量值
	dlgPara.m_iRotateAngle = 90;
	dlgPara.m_nIntorType = 0;
	
	//显示对话框,提示用户设定旋转角度
	if(dlgPara.DoModal() != IDOK)
	{
		//返回
		return;
	}
	
	//获取用户设定的角度
	nRotateAngle = dlgPara.m_iRotateAngle;
	nIntorType = dlgPara.m_nIntorType;
	
	//删除对话框
	delete dlgPara;	

	if(nIntorType == 0)
	{
		bIntorType = FALSE;
	}
	else
	{
		bIntorType = TRUE;
	}

	//创建点处理CImageGeoTrans类对象
	CGeoTrans GeoTrans( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	//调用Mirror()函数进行垂直镜像
	GeoTrans.Rotate(nRotateAngle, bIntorType);

	// 设置脏标记
	//	SetModifiedFlag(TRUE);
	
	// 更新视图
	UpdateAllViews(NULL);
	
	// 恢复光标
	EndWaitCursor();
}

void CDipDoc::OnGeomTran() 
{
	// 创建对话框
	CDlgGeoTran dlgPara;
	
	// 初始化变量值
	dlgPara.m_XOffset = 0;
	dlgPara.m_YOffset = 0;
	dlgPara.m_nTransType = 0;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户设定的平移量
	LONG lXOffset = dlgPara.m_XOffset;
	LONG lYOffset = dlgPara.m_YOffset;
	int nTransType = dlgPara.m_nTransType;
	// 删除对话框
	delete dlgPara;	
	
	//创建点处理CImageGeoTrans类对象
	CGeoTrans GeoTrans( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	if(nTransType == 0)
	{
		// 调用TranslationPixel()函数进行平移
		GeoTrans.TranslationPixel(lXOffset, lYOffset);
	}
	else if(nTransType == 1)
	{
		// 调用TranslationLine()函数进行平移
		GeoTrans.TranslationLine(lXOffset, lYOffset);
	}

	// 设置脏标记
	//	SetModifiedFlag(TRUE);

	// 更新视图
	UpdateAllViews(NULL);
	
	// 恢复光标
	EndWaitCursor();
}

void CDipDoc::OnGeomTrpo() 
{
	//创建点处理CImageGeoTrans类对象
	CGeoTrans GeoTrans( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	//调用Mirror()函数进行垂直镜像
	GeoTrans.Transpose();

	// 设置脏标记
	//	SetModifiedFlag(TRUE);

	// 更新视图
	UpdateAllViews(NULL);
	
	// 恢复光标
	EndWaitCursor();
}

void CDipDoc::OnGeomZoom() 
{
// 缩放比率
	float fXZoomRatio;
	float fYZoomRatio;
	int nIntorType;
	BOOL bIntorType;
	
	// 创建对话框
	CDlgGeoZoom dlgPara;
	
	// 初始化变量值
	dlgPara.m_XZoom = 4.0;
	dlgPara.m_YZoom = 4.0;
	dlgPara.m_nIntorType = 0;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户设定的平移量
	fXZoomRatio = dlgPara.m_XZoom;
	fYZoomRatio = dlgPara.m_YZoom;
	nIntorType = dlgPara.m_nIntorType;
	
	// 删除对话框
	delete dlgPara;	
	
	if(nIntorType == 0)
	{
		bIntorType = FALSE;
	}
	else
	{
		bIntorType = TRUE;
	}
	
	//创建点处理CImageGeoTrans类对象
	CGeoTrans GeoTrans( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();
	
	//调用Mirror()函数进行垂直镜像
	GeoTrans.ZoomImage(fXZoomRatio, fYZoomRatio, bIntorType);
	
	// 设置脏标记
	//	SetModifiedFlag(TRUE);
	
	// 更新视图
	UpdateAllViews(NULL);
	
	// 恢复光标
	EndWaitCursor();
}

//以下六个命令更新消息映射,保证图像几何变换只对8位以上的图像进行操作。
void CDipDoc::OnUpdateGeomMirh(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnUpdateGeomMirv(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnUpdateGeomRota(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnUpdateGeomTran(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnUpdateGeomTrpo(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnUpdateGeomZoom(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}

void CDipDoc::OnMorphClose() 
{
	//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
	int *nMask;

	//结构元素的大小(以结构元素中的点数为单位)
	int nMaskLen = 0;


	// 创建对话框
	CDlgMorph dlgPara;
	
	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	nMask = dlgPara.m_npMask;
	nMaskLen = dlgPara.m_nMaskLen;

	// 删除对话框
	delete dlgPara;	

	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	MorphProcesses.Closing(nMask, nMaskLen);
	// 恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnMorphDilation() 
{
	//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
	int *nMask;

	//结构元素的大小(以结构元素中的点数为单位)
	int nMaskLen = 0;


	// 创建对话框
	CDlgMorph dlgPara;
	
	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	nMask = dlgPara.m_npMask;
	nMaskLen = dlgPara.m_nMaskLen;

	// 删除对话框
	delete dlgPara;	

	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	MorphProcesses.Dilation(nMask, nMaskLen);
	// 恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnMorphErosion() 
{
	//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
	int *nMask;

	//结构元素的大小(以结构元素中的点数为单位)
	int nMaskLen = 0;


	// 创建对话框
	CDlgMorph dlgPara;
	
	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	nMask = dlgPara.m_npMask;
	nMaskLen = dlgPara.m_nMaskLen;

	// 删除对话框
	delete dlgPara;	

	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	MorphProcesses.Erosion(nMask, nMaskLen);
	// 恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnMorphOpen() 
{
	//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
	int *nMask;

	//结构元素的大小(以结构元素中的点数为单位)
	int nMaskLen = 0;


	// 创建对话框
	CDlgMorph dlgPara;
	
	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	nMask = dlgPara.m_npMask;
	nMaskLen = dlgPara.m_nMaskLen;

	// 删除对话框
	delete dlgPara;	

	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	MorphProcesses.Opening(nMask, nMaskLen);
	// 恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnMorphHitmissing() 
{
	//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
	int *nHmask, *nMmask;

	//结构元素的大小(以结构元素中的点数为单位)
	int nHmaskLen = 0, nMmaskLen = 0;


	// 创建对话框
	CDlgHitMiss dlgPara;
	
	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	nHmask = dlgPara.m_npHmask;
	nHmaskLen = dlgPara.m_nHmaskLen;
	nMmask = dlgPara.m_npMmask;
	nMmaskLen = dlgPara.m_nMmaskLen;


	/*CString s;
	s.Format("nHmaskLen=%d\nnMmaskLen=%d\n",nHmaskLen,nMmaskLen);
	AfxMessageBox(s);
	for(int i = 0; i < 2 * nHmaskLen; i = i + 2)
	{
		s.Format("Num=%d\n(%d, %d)",i/2,nHmask[i],nHmask[i+1]);
		AfxMessageBox(s);
	}
	for(i = 0; i < 2 * nMmaskLen; i = i + 2)
	{
		s.Format("Num=%d\n(%d, %d)",i/2,nMmask[i],nMmask[i+1]);
		AfxMessageBox(s);
	}*/

	// 删除对话框
	delete dlgPara;	

	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();

	MorphProcesses.HitMissTran(nHmask, nHmaskLen, nMmask, nMmaskLen);
	// 恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnMorphThining() 
{
	//创建形态学处理CMorphPro类对象
	CMorphPro MorphProcesses( m_pDibObject );

	// 更改光标形状
	BeginWaitCursor();
	
	MorphProcesses.ThiningDIB(m_pDibObject);
	//恢复光标
	EndWaitCursor();
	
	// 更新视图
	UpdateAllViews(NULL);	
}

void CDipDoc::OnCodeArith() 
{
	CDlgStrInput InputBox;
	if(InputBox.DoModal() == IDOK)
	{
		CString strTemp,strNew,strCodeL,strCodeR;
		int i,j,s;
		BYTE *uCodeNum;
		FLOAT *fFreq,*fInterval;

		strTemp = InputBox.m_strInput;

		//分配内存
		uCodeNum = new BYTE[strTemp.GetLength()];

		s = 0;
		i = 0;
		while( strTemp.GetLength() > 0 )
		{
			strNew += strTemp.GetAt(0);

			//各个符号的数目
			s = strTemp.Remove(strTemp.GetAt(0));
			uCodeNum[i] = (BYTE)s;
			//统计字符串中的符号数
			i++;
		}
		//分配内存
		fFreq = new FLOAT[i];
		//各符号的初始区间的左端
		fInterval = new FLOAT[i];

		//按照字符串中出现的字符依次计算字符串的所处的间隔
		float fStart = 0.0f,fEnd = 0.0f,fStartB = 0.0f,fLeft = 0.0f,fRight = 0.0f,fLen = 0.0f;

		strTemp = InputBox.m_strInput;
		//统计各个符号的频率
		for(j=0;j<i;j++)
		{
			fFreq[j] = (float)uCodeNum[j]/strTemp.GetLength();
		}
		
		//确定各符号的初始区间的左端
		fInterval[0] = 0.0f;
		i = 1;
		while(i < strNew.GetLength())
		{
			fInterval[i] = fInterval[i-1] + fFreq[i-1];
			i++;
		}
		
		//前一间隔的起始位置
		fStartB = 0.0f;
		fLen = fFreq[0];

		for(i=1;i<strTemp.GetLength();i++)
		{
			//确定字符串中各字符在新字符串中的位置
			j = strNew.Find(strTemp.GetAt(i));

			//当前编码符号的初始区间的左端和右端
			fLeft = fInterval[j];
			fRight = fLeft + fFreq[j];

			//新区间的起始位置
			fStart = fStartB +fLeft*fLen;
			fEnd = fStartB + fRight*fLen;

			//更新前一间隔的起始位置和间隔长度
			fStartB = fStart;
			fLen = fEnd - fStart;
		}

		//对最后的新间隔(即fStart,fEnd)转换为二进制
		FLOAT fTemp1,fTemp2;
		fTemp1 = fStart;
		fTemp2 = fEnd;
		while(((fTemp1*2 >= 1.0) && (fTemp2*2 >= 1.0)) || ((fTemp1*2 < 1.0) && (fTemp2*2 < 1.0)))
		{
			//如果两个数都被完全转换,则退出循环
			if((fTemp1 == 0.0) && (fTemp2 == 0.0)) break;

			//将fStart转换为二进制
			if( fTemp1*2 >= 1.0 )
			{

⌨️ 快捷键说明

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