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

📄 mapshow.cpp

📁 目标跟踪显示的源代码,包含极坐标与之角坐标的转换,轨迹点的显示等
💻 CPP
字号:
 // MapShow.cpp: implementation of the CMapShow class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MapShow.h"

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

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

CMapShow::CMapShow()
{
	m_ColorIsland=RGB(220,180,34);
	m_ColorSea=RGB(150,255,255);
	m_ColorLonLatLine=RGB(220,220,220);

}

CMapShow::~CMapShow()
{

}

void CMapShow::DrawLngLatLine(CDC *pDC)
{
	CFont * font=new CFont(); //?
	
	int iSize = int( 15 );
	int width = int(10*iSize*0.5);	//10 chars


	font->CreateFont(iSize, 0, 0, 0,
		 FW_NORMAL, TRUE, FALSE,FALSE, 
		 ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
		 DEFAULT_QUALITY, VARIABLE_PITCH | FF_DONTCARE, "Times New Roman");
	CFont * pOldFont=(CFont*)pDC->SelectObject(font);
	
	//pDC->SetBkMode(TRANSPARENT);


	CPen pen(PS_DOT,0,m_ColorLonLatLine);
	CPen* oldPen = pDC->SelectObject(&pen);

	int r=5;
	int m=(int)ceil((m_LonEnd-m_LonBegin)/m_grid);
	int n=(int)ceil((m_LatEnd-m_LatBegin)/m_grid);
	int i;
	int x1,y1;
	CString str;
	int min;
	double lon,lat;
	//draw longitude line

	for(i=0;i<m;i++)
	{
		x1=(int)(i*m_grid*m_PixelPerLon);
		pDC->MoveTo(x1,m_p0.y);
		pDC->LineTo(x1,m_p0.y+m_MapSizeY);

		lon=m_LonBegin+i*m_grid;
		min = int((lon - int(lon))*60);
		
		if(min<10)
			//str.Format("%d°0%d′00″E",int(lng),min);
			str.Format("%d°0%d′E",int(lon),min);
		else
			//str.Format("%d°%d′00″E",int(lng),min);
			str.Format("%d°%d′E",int(lon),min);
		
		pDC->TextOut(x1+r,m_p0.y+r,str);
	}

	//draw lat line
	for(i=n;i>0;i--)
	{
		y1=(int)(i*m_grid*m_PixelPerLat);
		pDC->MoveTo(m_p0.x,y1);
		pDC->LineTo(m_p0.x+m_MapSizeX,y1);

		lat=m_LatBegin+(n-i)*m_grid;

		min = int((lat - int(lat))*60);
		
		if(min<10)
			//str.Format("%d°0%d′00″E",int(lat),min);
			str.Format("%d°0%d′N",int(lat),min);
		else
			//str.Format("%d°%d′00″E",int(lat),min);
			str.Format("%d°%d′N",int(lat),min);

		pDC->TextOut(m_p0.x+r,y1-r-iSize,str);
	}

	pDC->SelectObject(oldPen);
	pDC->SelectObject(pOldFont); 
	delete font;

}

void CMapShow::DrawMap(CDC *pDC)
{
	CBrush brushIsland(m_ColorIsland);
	CBrush brushSea(m_ColorSea);
	CBrush * oldBrush;

	//////////////////////////////////////////////////////////////////
	//画海岸边界线,包括地图边界
		
	//画背景为海

	oldBrush = pDC->SelectObject(&brushSea);
	pDC->Rectangle(m_p0.x,m_p0.y,m_p0.x+m_MapSizeX,m_p0.y+m_MapSizeY);
	pDC->SelectObject(oldBrush);

	//	use Polygon	
	oldBrush = pDC->SelectObject(&brushIsland);

	for(int j=0;j<m_NumRgnView;j++)
	{
		ASSERT( m_RgnViewLon[j][0] == m_RgnViewLon[j][m_NumPntView[j]-1]
			&& m_RgnViewLat[j][0] == m_RgnViewLat[j][m_NumPntView[j]-1]
			);

		if( m_RgnIsSeaView[j] ) continue;
		
		POINT * p = new POINT[m_NumPntView[j]];
		for(int i=0;i<m_NumPntView[j];i++)
		{
			p[i].x = m_p0.x + int((m_RgnViewLon[j][i]-m_LonBegin)*
				m_PixelPerLon);
			p[i].y = m_p0.y + int((m_LatEnd-m_RgnViewLat[j][i])*
				m_PixelPerLat);
		}

		pDC->Polygon(p,m_NumPntView[j]);
		delete p;
	}

	pDC->SelectObject(oldBrush);
}

void CMapShow::SetViewEnvironment()
{
	m_KmPerLat=6380*atan(1)/45;
	m_KmPerLon=6380*cos((m_NorthView + m_SouthView)*atan(1)/90)*
		atan(1)/45;

	m_PixelPerLat=m_KmPerLat*m_PixelPerKm;
	m_PixelPerLon=m_KmPerLon*m_PixelPerKm;

//	m_grid = 0.25;
	double delta = fmod(m_WestView,m_grid);
	m_LonBegin = m_WestView;
	if(delta>EPS&&delta<m_grid-EPS)	m_LonBegin += m_grid - delta;
	
	delta = fmod(m_EastView,m_grid);
	m_LonEnd = m_EastView;
	if(delta>EPS&&delta<m_grid-EPS)	m_LonEnd -= delta;
	
	delta = fmod(m_SouthView,m_grid);
	m_LatBegin = m_SouthView;
	if(delta>EPS&&delta<m_grid-EPS)	m_LatBegin += m_grid - delta;
	
	delta = fmod(m_NorthView,m_grid);
	m_LatEnd = m_NorthView;
	if(delta>EPS&&delta<m_grid-EPS)	m_LatEnd -= delta;

	m_MapSizeX=(int)((m_LonEnd-m_LonBegin)*m_PixelPerLon);
	m_MapSizeY=(int)((m_LatEnd-m_LatBegin)*m_PixelPerLat);
}

void CMapShow::SetParameter(CPoint p0, double PixelPerKm,
							double grid)
{
	m_p0=p0;
	m_PixelPerKm=PixelPerKm;
	m_grid=grid;
}

void CMapShow::SetColor(COLORREF ColorIsland, COLORREF ColorSea,
						COLORREF ColorLonLatLine)
{
	m_ColorIsland=ColorIsland;
	m_ColorSea=ColorSea;
	m_ColorLonLatLine=ColorLonLatLine;
}

void CMapShow::GetData(double EastView,
	double      WestView,
	double		NorthView,  
	double		SouthView,  
	CArray<CArray<double,double>,CArray<double,double> &> &RgnViewLon,
	CArray<CArray<double,double>,CArray<double,double> &> &RgnViewLat,
	int			NumRgnView,	
	CArray<int,int> &NumPntView,    
	CArray<bool,bool> &RgnIsSeaView,  
	CArray<double,double> &RgnEastView,		
	CArray<double,double> &RgnSouthView,		
    CArray<double,double> &RgnWestView,		
	CArray<double,double> &RgnNorthView )
{
	m_EastView=EastView;   
	m_WestView=WestView;   
	m_NorthView=NorthView;  
	m_SouthView=SouthView;  

	m_NumRgnView=NumRgnView;
	m_RgnEastView.SetSize(m_NumRgnView);	
    m_RgnWestView.SetSize(m_NumRgnView); 
    m_RgnSouthView.SetSize(m_NumRgnView); 
	m_RgnNorthView.SetSize(m_NumRgnView); 	

	m_RgnViewLon.SetSize(m_NumRgnView);
	m_RgnViewLat.SetSize(m_NumRgnView);
	m_NumPntView.SetSize(m_NumRgnView);	   
	m_RgnIsSeaView.SetSize(m_NumRgnView);
	
	int i,j;
	for(i=0;i<m_NumRgnView;i++)
	{
		m_RgnIsSeaView[i]=RgnIsSeaView[i];
		m_NumPntView[i]=NumPntView[i];
		m_RgnEastView[i]=RgnEastView[i];
		m_RgnWestView[i]=RgnWestView[i];
		m_RgnSouthView[i]=RgnSouthView[i];
		m_RgnNorthView[i]=RgnNorthView[i];

		m_RgnViewLon[i].SetSize(m_NumPntView[i]);
		m_RgnViewLat[i].SetSize(m_NumPntView[i]);

		for(j=0;j<m_NumPntView[i];j++)
		{
			m_RgnViewLon[i][j]=RgnViewLon[i][j];
			m_RgnViewLat[i][j]=RgnViewLat[i][j];
		}
	}
}

bool CMapShow::PointToLonLat(int x, int y, double &Lon, double &Lat)
{
	if(x<m_p0.x||x>m_p0.x+m_MapSizeX||y<m_p0.y||y>m_p0.y+m_MapSizeY)
	{
		return false;
	}

	Lon=(x-m_p0.x)/m_PixelPerLon+m_LonBegin;
	Lat=m_LatEnd-(y-m_p0.y)/m_PixelPerLat;
	return true;
}

bool CMapShow::LonLatToPoint(double Lon, double Lat, int &x, int &y)
{
	if(Lon<m_LonBegin||Lon>m_LonEnd||Lat<m_LatBegin||Lat>m_LatEnd)
	{
		return false;
	}

	x=(int)(m_p0.x+(Lon-m_LonBegin)*m_PixelPerLon);
	y=(int)(m_p0.y+(m_LatEnd-Lat)*m_PixelPerLat);

	return true;
}

bool CMapShow::LoadMapData(CString MapFileName)
{
	CFile file;
	if( ! file.Open(MapFileName,CFile::modeRead) )
		return false;

	//read map data

	file.Read(&m_WestView,sizeof(double));
	file.Read(&m_EastView,sizeof(double));
	file.Read(&m_SouthView,sizeof(double));
	file.Read(&m_NorthView,sizeof(double));

	file.Read(&m_NumRgnView,sizeof(int));	//区域数

	ASSERT(m_NumRgnView<1000);

    m_RgnEastView.SetSize(m_NumRgnView);	//每个区域
    m_RgnWestView.SetSize(m_NumRgnView); 
    m_RgnSouthView.SetSize(m_NumRgnView); 
	m_RgnNorthView.SetSize(m_NumRgnView); 	//范围组成的数组

	m_RgnViewLon.SetSize(m_NumRgnView);
	m_RgnViewLat.SetSize(m_NumRgnView);
	m_NumPntView.SetSize(m_NumRgnView);	  //point number of each region 
	m_RgnIsSeaView.SetSize(m_NumRgnView); //the region is sea or island
 

	//////////////////////////////////////////////////////////////

	int i,j;
	for(i=0;i<m_NumRgnView;i++)
	{
		file.Read(&m_RgnIsSeaView[i],sizeof(bool));

		file.Read(&m_RgnWestView[i],sizeof(double));
		file.Read(&m_RgnEastView[i],sizeof(double));
		file.Read(&m_RgnSouthView[i],sizeof(double));
		file.Read(&m_RgnNorthView[i],sizeof(double));

		file.Read(&m_NumPntView[i],sizeof(int));
		m_RgnViewLon[i].SetSize(m_NumPntView[i]);
		m_RgnViewLat[i].SetSize(m_NumPntView[i]);

		for(j=0;j<m_NumPntView[i];j++)
		{
			file.Read(&m_RgnViewLon[i][j],sizeof(double));
			file.Read(&m_RgnViewLat[i][j],sizeof(double));
		}

		ASSERT( m_RgnViewLon[i][0] == 
			m_RgnViewLon[i][m_NumPntView[i]-1] && m_RgnViewLat[i][0] == 
			m_RgnViewLat[i][m_NumPntView[i]-1] );
	}

	file.Close();
	return true;
}

void CMapShow::GetMapSize(int &MapSizeX, int &MapSizeY)
{
	MapSizeX=m_MapSizeX;
	MapSizeY=m_MapSizeY;
}

void CMapShow::MarkSites(CDC *pDC,double SiteLon,double SiteLat,
						 short shape)
{
	//map shape:	★▲●■○△□☆

	int amp = 9 ;	
	POINT* p;
	int SiteX,SiteY;

	LonLatToPoint(SiteLon,SiteLat,SiteX,SiteY);
	
	//draw site flag
	double theta1;
	double theta2;
	double a1;
	double a2;
	double b1;
	double b2;
	double r;
	CBrush brush,*pOldBrush;
	brush.CreateSolidBrush(RGB(255,0,0));
	CFont font,*pOldFont;
	font.CreateFont(15, 0, 0, 0,
		 FW_NORMAL, FALSE, FALSE,FALSE, 
		 ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
		 DEFAULT_QUALITY, VARIABLE_PITCH | FF_DONTCARE, 
		 "幼圆");

	switch(shape)
	{
	case 1:	//○
		amp=5;
		pOldBrush=pDC->SelectObject(&brush);
		pDC->Ellipse(SiteX-amp,SiteY-amp,SiteX+amp,SiteY+amp);
		pDC->SelectObject(pOldBrush);
		brush.DeleteObject();
		
		break;
		
	case 2:	//□
		pOldBrush=pDC->SelectObject(&brush);
		pDC->Rectangle(SiteX-amp,SiteY-amp,SiteX+amp,SiteY+amp);
		pDC->SelectObject(pOldBrush);
		brush.DeleteObject();
		
		break;
		
	case 3:	//△
		p = new POINT[3];
		p[0].x = SiteX;
		p[0].y = SiteY - amp;
		p[1].x = SiteX - int(amp*sqrt(3)/2);
		p[1].y = SiteY + amp/2;
		p[2].x = SiteX + int(amp*sqrt(3)/2);
		p[2].y = p[1].y;
		pOldBrush=pDC->SelectObject(&brush);
		pDC->Polygon(p,3);
		pDC->SelectObject(pOldBrush);
		brush.DeleteObject();
		delete []p;
		
		break;
		
	case 4:	//☆
		p = new POINT[10];
		
		theta1 = atan(1)*72.0/45.0;
		theta2 = theta1*0.75;
		a1 = amp*sin(theta1);
		a2 = amp*cos(theta1);
		b1 = amp*sin(theta2);
		b2 = amp*cos(theta2);
		
		p[0].x = SiteX;
		p[0].y = SiteY - amp;
		p[2].x = SiteX - int(a1);
		p[2].y = SiteY - int(a2);
		p[4].x = SiteX - int(b2);
		p[4].y = SiteY + int(b1);
		p[6].x = SiteX + int(b2);
		p[6].y = p[4].y;
		p[8].x = SiteX + int(a1);
		p[8].y = p[2].y;
		p[1].x = SiteX - int(b2*(amp-a2)/(amp+b1)); 
		p[1].y = p[2].y;
		r = sin(theta2/3)/sin(theta2);
		p[3].x = SiteX - int(a1*r); 
		p[3].y = SiteY + int(a2*r);
		p[5].x = SiteX;
		p[5].y = SiteY + int(amp*r);
		p[7].x = 2*SiteX - p[3].x;
		p[7].y = p[3].y;
		p[9].x = 2*SiteX - p[1].x;
		p[9].y = p[1].y;
		
		pOldBrush=pDC->SelectObject(&brush);
		pDC->Polygon(p,10);
		pDC->SelectObject(pOldBrush);
		brush.DeleteObject();
		delete []p;
		
		break;

	default:
		break;
		
	}

	pOldFont=pDC->SelectObject(&font);
	pDC->TextOut(SiteX-25,SiteY-20,"朱家尖");
	pDC->SelectObject(pOldFont);
	font.DeleteObject();
	
/*
	//site name
	
	CString str("");
	
	if(pDoc->bShowSiteNo[n] & pDoc->bShowSiteName[n])
		str.Format("%d %s",pDoc->iSiteNo[n],pDoc->cSiteName[n]);
	else if(pDoc->bShowSiteNo[n])	
		str.Format("%d",pDoc->iSiteNo[n]); 
	else //(bShowSiteName[n])
		str.Format("%s",pDoc->cSiteName[n]); 
	
	pDC->TextOut( iOrgViewX + int(pDoc->iSiteNameX[n]*dEnlarge),
		iOrgViewY + int(pDoc->iSiteNameY[n]*dEnlarge),
		str );
*/
}

⌨️ 快捷键说明

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