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

📄 matchmsg.cpp

📁 图像处理软件,功能比较基础
💻 CPP
字号:
// MatchMsg.cpp: implementation of the CMatchMsg class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "radar.h"
#include "MatchMsg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CMatchMsg::CMatchMsg()
{
	m_bType = ISDBS ;
	m_bValid = FALSE ;
	m_bFlightDir = E2W ;

	m_nDigX = m_nDigY = -1 ;
	m_dLocalX = m_dLocalY = -1;
	m_dHight = m_dRes = 0;
	m_nRad0 = m_nRad1 = 0;
	
	m_nLocalMapX = m_nLocalMapY = -1;
}

CMatchMsg::~CMatchMsg()
{

}

void CMatchMsg::Open(CString FileName)
{
	m_bValid = Read( FileName );
}

// 输入结构体信息,初始化并计算后到文件
void CMatchMsg::Output( RADARMSG msg , CString FileName)
{
	m_bType = msg.bType;
	m_bFlightDir = msg.bFlightDir;

	m_dHight = msg.fHight;
	m_dRes = msg.fRes;
	m_sBigRefGuass = msg.BigRefGuass;
	m_nBigSizeX = msg.BigSizeX;
	m_nBigSizeY = msg.BigSizeY;
	m_sLocalGuass = msg.LocalGuass;

	Normalize();

	Write( FileName );
}

// 读配置文件
BOOL CMatchMsg::Read(CString FileName)
{
	FILE *fp = fopen(FileName,"rt");
	if(fp == NULL)	return FALSE;

	fscanf(fp , "Type= %d\n",  &m_bType);
	fscanf(fp , "FligthDir= %d\n", &m_bFlightDir);
	fscanf(fp , "Hight= %lf\n", &m_dHight);
	fscanf(fp , "Res= %lf\n", &m_dRes);
	fscanf(fp , "Rmin= %d   Rmax= %d \n", &m_nRad0 , &m_nRad1 );
	fscanf(fp , "Start= (%d , %d)\n", &m_nDigX , &m_nDigY);
	fscanf(fp , "LocalMap= (%d , %d)\n", &m_nLocalMapX , &m_nLocalMapY );
	fscanf(fp , "LocalOrg= (%lf , %lf)\n", &m_dLocalX , &m_dLocalY );
	fscanf(fp , "LocalGus= (%lf , %lf)\n",  &m_sLocalGuass.x , &m_sLocalGuass.y);
	fscanf(fp , "Sample= (%d , %d)\n", &m_nBigSizeX, &m_nBigSizeY);
	fscanf(fp , "Bigref= (%lf , %lf , %lf , %lf)\n", &m_sBigRefGuass.x0 , &m_sBigRefGuass.y0 , &m_sBigRefGuass.x1 , &m_sBigRefGuass.y1);

	fclose(fp);

	return TRUE;
}

// 写配置文件
BOOL CMatchMsg::Write(CString FileName)
{
	FILE *fp = fopen( FileName , "wt");
	if(fp == NULL) return FALSE;

	DREGION rg = GetValidRegion();

	fprintf(fp , "Type= %d\n", m_bType);
	fprintf(fp , "FligthDir= %d\n", m_bFlightDir);
	fprintf(fp , "Hight= %lf\n", m_dHight);
	fprintf(fp , "Res= %lf\n", m_dRes);
	fprintf(fp , "Rmin= %d   Rmax= %d \n", m_nRad0 , m_nRad1 );
	fprintf(fp , "Start= (%d , %d)\n", m_nDigX ,m_nDigY);
	fprintf(fp , "LocalMap= (%d , %d)\n", m_nLocalMapX , m_nLocalMapY );
	fprintf(fp , "LocalOrg= (%.3f , %.3f)\n", m_dLocalX , m_dLocalY );
	fprintf(fp , "LocalGus= (%.3f , %.3f)\n",  m_sLocalGuass.x , m_sLocalGuass.y);
	fprintf(fp , "Sample= (%d , %d)\n", m_nBigSizeX, m_nBigSizeY);
	fprintf(fp , "Bigref= (%.3f , %.3f , %.3f , %.3f)\n", m_sBigRefGuass.x0 , m_sBigRefGuass.y0 ,m_sBigRefGuass.x1 , m_sBigRefGuass.y1);
	fprintf(fp , "Region= (%.3f , %.3f , %.3f , %.3f)\n", rg.x0 , rg.y0 , rg.x1 , rg.y1);

	fclose(fp);

	return TRUE;
}

void CMatchMsg::Normalize()
{
	FPOINT tmp ;

	// 如果没输入分辨率,则按成像规定计算分辨率
	// 否则按输入的分辨率
	if( m_dRes <= 0)
	{
		if( m_bType == ISDBS)
			m_dRes = m_dHight * ( tan(THETA2 * PI/180)-tan(THETA1 * PI/180) ) / RELIMGSIZE;
		else
			m_dRes = 2* m_dHight * tan(THETA2 * PI/180) / RELIMGSIZE ;
	}

	// 利用输入的成像点高斯坐标计算成在大参考图象中的坐标(无须挖图起始点坐标信息)
	tmp = TransCord( m_sLocalGuass.x , m_sLocalGuass.y , GAS2ORG);
	m_dLocalX = tmp.x;
	m_dLocalY = tmp.y;

	// 如果没输入挖图起始点坐标,则计算选取起始点
	// 否则按输入的起始点计算
	if( m_nDigX == -1)
	{
		DREGION rg = GetValidRegion();
		m_nDigX = int( ( rg.x0 +100)) /100*100;
		m_nDigY = int( ( rg.y0 +100)) /100*100;
	}

	// 计算成像点在相关面中的坐标
	tmp = TransCord( m_dLocalX, m_dLocalY , ORG2MAP);
	m_nLocalMapX = tmp.x;
	m_nLocalMapY = tmp.y;

	m_bValid = TRUE ;
}


DREGION  CMatchMsg::GetValidRegion( )
{
	DREGION ret ={0,0,0,0};

	if(m_bType == ISDBS)
	{
		float m_nRad1 = m_dHight * tan(32.0/180*PI) ;
		int x0 = m_dLocalX - ( 60 + 64) * m_dRes/MPP;
		int y0 = m_dLocalY - ( 60 * m_dRes + m_nRad1)/MPP;
		int x1 = m_dLocalX - ( 5 + 64) * m_dRes/MPP;
		int y1 = m_dLocalY - ( 5 * m_dRes + m_nRad1)/MPP;

		DREGION rg = {x0,y0,x1,y1};
		return rg;
	}
	else
	{
		int x0 = m_dLocalX - ( 60 + 64) * m_dRes/MPP;
		int y0 = m_dLocalY - ( 60 + 64) * m_dRes/MPP;
		int x1 = m_dLocalX - ( 5 + 64) * m_dRes/MPP;
		int y1 = m_dLocalY - ( 5 + 64) * m_dRes/MPP;

		DREGION rg = {x0,y0,x1,y1};
		return rg;
	}

	return ret;
}

SPARMS CMatchMsg::GetMessage()
{
	SPARMS ret = {0,0,0,0,0,0,0,0,0,0 , ISDBS, E2W, FALSE};

	if(! m_bValid ) return ret;

	ret.bValid = TRUE;
	ret.bFlightDir = m_bFlightDir;
	ret.bType = m_bType;

	ret.x0 = m_nDigX;
	ret.y0 = m_nDigY;
	ret.localx = m_dLocalX;
	ret.localy = m_dLocalY;
	ret.hight = m_dHight;
	
	ret.rad0 = m_dHight*tan(8.0/180*PI);
	ret.rad1 = m_dHight*tan(32.0/180*PI);

	ret.res = m_dRes;
	ret.findx = m_nLocalMapX;
	ret.findy = m_nLocalMapY;

	return ret;
}

// 与挖图象起始点有关
FPOINT CMatchMsg::TransMapToOrg(double x, double y)
{
	FPOINT ret = { 0.0 , 0.0 };

	if( m_bType == ISDBS ) 
	{
		if( m_bFlightDir == E2W || m_bFlightDir == W2E )
		{
			ret.x = m_nDigX + ( x + 64 ) * m_dRes/MPP ;
			ret.y = m_nDigY + ( y*m_dRes + m_dHight*tan(32.0/180*PI) ) /MPP ;
		}
		else
		{
			ret.x = m_nDigX + ( x*m_dRes + m_dHight*tan(32.0/180*PI) ) /MPP ;
			ret.y = m_nDigY + ( y + 64 ) * m_dRes/MPP ;
		}
	}
	else
	{
		ret.x = m_nDigX + ( x + 64 ) * m_dRes/MPP ;
		ret.y = m_nDigY + ( y + 64) * m_dRes/MPP ;
	}

	return ret ;
}

// 转换大参考图象坐标到相关面坐标
// 输出为小数
FPOINT CMatchMsg::TransOrgToMap(double x, double y)
{
	FPOINT ret = { 0.0 , 0.0 };

	if( m_bType == ISDBS ) 
	{
		if( m_bFlightDir == E2W || m_bFlightDir == W2E )
		{
			ret.x =  (x - m_nDigX) * MPP / m_dRes - 64 ;
			ret.y =  ((y - m_nDigY) * MPP - m_dHight*tan(32.0/180*PI) )/m_dRes ;
		}
		else
		{
			ret.x =  ((x - m_nDigX) * MPP - m_dHight*tan(32.0/180*PI) )/m_dRes ;
			ret.y =  (y - m_nDigY) * MPP / m_dRes - 64 ;
		}
	}
	else
	{
		ret.x =  (x - m_nDigX) * MPP / m_dRes - 64 ;
		ret.y =  (y - m_nDigY) * MPP / m_dRes - 64 ;
	}

	return ret;
}

// 以下两函数与挖图象起始点无关
FPOINT CMatchMsg::TransGasToOrg(double x, double y)
{
	FPOINT ret = { 0.0 , 0.0 };
	float fdx = ( m_sBigRefGuass.x1 - m_sBigRefGuass.x0 ) / m_nBigSizeX;
	float fdy = ( m_sBigRefGuass.y1 - m_sBigRefGuass.y0 ) / m_nBigSizeY;

	ret.x = (x - m_sBigRefGuass.x0)/fdx ;
	ret.y = (- y + m_sBigRefGuass.y1)/fdy ;

	return ret;
}

FPOINT CMatchMsg::TransOrgToGas(double x, double y)
{
	FPOINT ret = { 0.0 , 0.0 };
	float fdx = ( m_sBigRefGuass.x1 - m_sBigRefGuass.x0 ) / m_nBigSizeX;
	float fdy = ( m_sBigRefGuass.y1 - m_sBigRefGuass.y0 ) / m_nBigSizeY;

	ret.x = x * fdx + m_sBigRefGuass.x0 ;
	ret.y = - y * fdy + m_sBigRefGuass.y1 ;

	return ret;
}

/////////////////////////////////////
//  进行坐标变换:(成像点)
//      原始大图象坐标(10M)   ORG
//      相关面坐标              MAP
//      高斯坐标                GAS
//////////////////////////////////////
FPOINT CMatchMsg::TransCord(double x, double y, BOOL nType)
{
	FPOINT ret = { 0 , 0 };
	FPOINT tmp ;

	switch ( nType )
	{
	case ORG2MAP:   // 考虑相关面取整象素
		ret = TransOrgToMap( x, y) ;
		ret.x = (int) (ret.x + 0.5);
		ret.y = (int) (ret.y + 0.5);
		break;
	case ORG2GAS:
		ret = TransOrgToGas( x, y) ;
		break;
	case MAP2ORG:
		ret = TransMapToOrg( x, y) ;
		break;
	case MAP2GAS: 
		tmp = TransMapToOrg( x, y) ;
		ret = TransOrgToGas( tmp ) ;
		break;
	case GAS2ORG:
		ret = TransGasToOrg( x, y) ;
		break;
	case GAS2MAP:    // 考虑相关面取整象素
		tmp = TransGasToOrg( x, y) ;
		ret = TransOrgToMap( tmp ) ;
		ret.x = (int) (ret.x + 0.5);
		ret.y = (int) (ret.y + 0.5);
		break;
	default :
		break;
	}

	return ret;
}

// 与挖图象起始点有关
FPOINT CMatchMsg::TransMapToOrg(FPOINT p)
{
	return TransMapToOrg(p.x , p.y);
}

FPOINT CMatchMsg::TransOrgToMap(FPOINT p)
{
	return TransOrgToMap(p.x , p.y);
}

// 与挖图象起始点无关
FPOINT CMatchMsg::TransGasToOrg(FPOINT p)
{
	return TransGasToOrg(p.x , p.y);
}

FPOINT CMatchMsg::TransOrgToGas(FPOINT p)
{
	return TransOrgToGas(p.x , p.y);
}

FPOINT CMatchMsg::TransCord( FPOINT p , BOOL nType)
{
	return TransCord( p.x , p.y , nType);
}

⌨️ 快捷键说明

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