📄 matchmsg.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 + -