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

📄 gpsdrawmap.cpp

📁 用VC写的监控中心后台程序。 代码全
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// GpsDrawMap.cpp: implementation of the CGpsDrawMap class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GpsSC.h"
#include "GpsDrawMap.h"
#include "SearchSignDlg.h"
#include "ShowSignDlg.h"
#include "InputStringDlg.h"
#include "ListSimilarStrDlg.h"

#include "GpsSCDoc.h"
#include "GpsSCView.h"

#include "math.h"

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

#define		Square(a)				((a) * (a))
#define		Max(a, b)				((a) > (b) ? (a) : (b))
#define		Min(a, b)				((a) > (b) ? (b) : (a))
#define		PI						3.1415927
#define		GPS_INFINITE			0x7fffff
#define		GPS_CAR_WIDTH_HEIGH		40


#define		CompanyIconName				"\\GpsIcon\\GpsSign\\Company.bmp"
#define		PlaceNameIconName			"\\GpsIcon\\GpsSign\\PlaceName.bmp"
#define		BuildingIconName			"\\GpsIcon\\GpsSign\\Building.bmp"
#define		TrafficIconName				"\\GpsIcon\\GpsSign\\Traffic.bmp"
#define		OilIconName					"\\GpsIcon\\GpsSign\\Oil.bmp"
#define		GovernmentIconName			"\\GpsIcon\\GpsSign\\Government.bmp"
#define		EducationIconName			"\\GpsIcon\\GpsSign\\edu.bmp"
#define		HotelIconName				"\\GpsIcon\\GpsSign\\Hotel.bmp"
#define		ShoppingIconName			"\\GpsIcon\\GpsSign\\Shopping.bmp"
#define		AmusementIconName			"\\GpsIcon\\GpsSign\\Amusement.bmp"
#define		ProjectIconName				"\\GpsIcon\\GpsSign\\finan.bmp"
#define		HospitalIconName			"\\GpsIcon\\GpsSign\\Hospital.bmp"


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

CGpsDrawMap::CGpsDrawMap()
{
	InitDrawMap();
}

CGpsDrawMap::~CGpsDrawMap()
{
	ClearMemberVar();
}

void CGpsDrawMap::ClearMemberVar()
{
	if(FileContent != NULL) {
		delete [] FileContent;
	}
	m_cFatStruct.Clear();
	m_cCurrMapInfo.Clear();
	ClearLinkList(&mLinkList);
	ClearPointList(&mSaveRecePointList);
	m_cCurrMapInfo.ClearBRoadSaveList(&mSaveBRList);
	ClearPointList(&mSaveTempList1);
	ClearPointList(&mSaveTempList2);
}

void CGpsDrawMap::InitDrawMap()
{
	m_cFatStruct.Clear();
	m_cCurrMapInfo.Clear();
	ClearLinkList(&mLinkList);
	ClearPointList(&mSaveRecePointList);

	long	Ret;
	if(Ret = GetGpsFatBuf()) {
		GetGpsFatInfo();


		gCurrMapLevel	= 6;
		m_PointWidth	= 5;
		m_byZoomCoeffic	= 1;


		GetLinkList(&mLinkList,gCurrMapLevel);

		gBRcross.m_bEnable		= false;
		gBRcross.m_bHaveSpoint	= false;
		gBRcross.m_EndCross.Clear();
		gBRcross.m_StartCross.Clear();

		GetAreaLibList(&m_cCurrMapInfo.lAreaLibList);
	}
}

void CGpsDrawMap::ClearStrArr(CString StrArr[],long	Count)
{
	long	i;

	for(i = 0; i < Count; i++) {
		StrArr[i].Empty();
	}
}

long CGpsDrawMap::GetGpsFatBuf()
{
	CString		sPath;
	char		CurrPath[500];
	CFile		f;
	long		FatLen = 0;

	ClearBYTEArr(CurrPath,500);
	::GetCurrentDirectory(500,CurrPath);

	sPath	= CurrPath;
	sPath  += "\\Map\\fat.fat";

	short		Course = 0;											//将不同角度的Car保存到数组中
	CString		str;
	CString		CarPath;

	CarPath	 = CurrPath;
	CarPath += "\\GpsIcon\\GpsCar\\Car";
	for(BYTE i = 0; i < 24; i++) {
		str.Format("%03d",Course);
		SaveGpsCarPath[i]	= CarPath + str + ".bmp";
		Course	   += 15;
	}

	if(!f.Open(sPath,CFile::modeRead,NULL)) {
		AfxMessageBox("打开地图出错,初始化画图系统失败!");
		FileContent = NULL;
		return FatLen;
	}
	f.SeekToBegin();
	FatLen		= f.GetLength();
	FileContent	= new BYTE[FatLen];
	f.Read(FileContent,FatLen);
	f.Close();

	return FatLen;
}


CString CGpsDrawMap::GetCurrDir()
{
	CString		sPath;
	char		CurrPath[500];

	ClearBYTEArr(CurrPath,500);
	::GetCurrentDirectory(500,CurrPath);

	return sPath = CurrPath;
}

bool CGpsDrawMap::ShowSignLib()
{
	CShowSignDlg	dlg;
	if(dlg.DoModal() == IDCANCEL)	return false;

	m_ShowSign.bShowBuilding	= dlg.m_byBuilding;
	m_ShowSign.bShowHotel		= dlg.m_byHotel;
	m_ShowSign.bShowCompany		= dlg.m_byCompany;
	m_ShowSign.bShowAmuse		= dlg.m_byAmuse;
	m_ShowSign.bShowPlaceName	= dlg.m_byPlaceName;
	m_ShowSign.bShowGovern		= dlg.m_byGovern;
	m_ShowSign.bShowTraffic		= dlg.m_byTraffic;
	m_ShowSign.bShowShopping	= dlg.m_byShopping;
	m_ShowSign.bShowEducation	= dlg.m_byEducation;
	m_ShowSign.bShowHospital	= dlg.m_byHospital;
	m_ShowSign.bShowBureau		= dlg.m_byBureau;
	m_ShowSign.bShowOil			= dlg.m_byOil;

	return true;
}

void CGpsDrawMap::GetGpsFatInfo()
{
	long BufPos = 0;

	m_cFatStruct.m_lLinkLibTotal	= GetFourBNum(FileContent,BufPos);		//链接库
	BufPos += LibTotalBytes;
	m_cFatStruct.m_lDataLibTotal	= GetFourBNum(FileContent,BufPos);		//数据库
	BufPos += LibTotalBytes;
	m_cFatStruct.m_lSignLibTotal	= GetFourBNum(FileContent,BufPos);		//标志库
	BufPos += LibTotalBytes;
	m_cFatStruct.m_lRegionLibTotal	= GetFourBNum(FileContent,BufPos);		//地区库
	BufPos += LibTotalBytes;
	m_cFatStruct.m_lRecordLibTotal	= GetFourBNum(FileContent,BufPos);		//记录库
	BufPos += LibTotalBytes;

	m_cFatStruct.m_lLinkLibAddr		= BufPos;
	m_cFatStruct.m_lDataLibAddr		= m_cFatStruct.m_lLinkLibAddr	 + 
									  m_cFatStruct.m_lLinkLibTotal	 * LibInfoBytes;

	m_cFatStruct.m_lSignLibAddr		= m_cFatStruct.m_lDataLibAddr	 + 
									  m_cFatStruct.m_lDataLibTotal	 * LibInfoBytes;

	m_cFatStruct.m_lRegionLibAddr	= m_cFatStruct.m_lSignLibAddr	 + 
									  m_cFatStruct.m_lSignLibTotal	 * LibInfoBytes;

	m_cFatStruct.m_lRecordLibAddr	= m_cFatStruct.m_lRegionLibAddr	 +
									  m_cFatStruct.m_lRegionLibTotal * LibInfoBytes;
}

/*************Get one NE of Point*************/
void CGpsDrawMap::GetPointNE(BYTE *BUF,long *BufPos,double *gx,double *gy)
{
	long tmp1;

	tmp1 = GetFourBNum(BUF,*BufPos);
	*gy = CovertNE(tmp1);

	*BufPos += GpsPointNEBytes;
	tmp1 = GetFourBNum(BUF,*BufPos);
	*gx = CovertNE(tmp1);

	*BufPos += GpsPointNEBytes;
}

/*************Get a long number of four bytes*************/
long CGpsDrawMap::GetFourBNum(BYTE *BUF,long BufPos)
{
	long	RetLong;
	RetLong = BUF[BufPos + 0]  + (BUF[BufPos + 1]  + BUF[BufPos + 2]  * 256 + BUF[BufPos + 3]  * 65536) * 256;

	return	RetLong;
}

short CGpsDrawMap::GetTwoBNum(BYTE *BUF,long BufPos)
{
	short	RetShort;

	RetShort = BUF[BufPos + 0]  + BUF[BufPos + 1] * 256;

	return RetShort;
}

BYTE CGpsDrawMap::GetOneBNum(BYTE *BUF,long BufPos)
{
	BYTE	RetByte;

	RetByte = BUF[BufPos];

	return RetByte;
}

void CGpsDrawMap::GetLenArray(BYTE *pTarget,BYTE Len,BYTE *Buf,long BufPos)
{
	BYTE	i;

	for(i = 0; i < Len; i++) {
		pTarget[i] = Buf[BufPos++];
	}
}

void CGpsDrawMap::ClearBYTEArr(char Array[],long ArrLen)
{
	long	i;

	for(i = 0; i < ArrLen; i++) {
		Array[i] = 0;
	}
}

void CGpsDrawMap::CopyStr2Arr(CString Str,char *Arr,BYTE ArrLen)
{
	BYTE	i;
	for(i = 0;i < Str.GetLength(); i++) {
		Arr[i] = Str.GetAt(i);
		if(i == ArrLen)	break;
	}
}

void CGpsDrawMap::CopyEquaLenArr(char *SrcArr,char *DstArr,BYTE CpyLen)
{
	BYTE		i;
	for(i = 0; i < CpyLen; i++) {
		DstArr[i] = SrcArr[i];
	}
}

BYTE CGpsDrawMap::CompareTwoArr(char *pArr1,char *pArr2)
{
	CString		Str1(pArr1),Str2(pArr2);
	BYTE		Ret = 3;

	Str1.MakeUpper();
	Str2.MakeUpper();
	if((Str1 == Str2) && (!Str1.IsEmpty()) && (!Str2.IsEmpty()))	return Ret = 1;
	if(Str1  > Str2)	return Ret = 2;
	if(Str1  < Str2)	return Ret = 0;
	
	return	Ret;
}

/*************From XY to NE or From NE to XY*************/
void CGpsDrawMap::CovertNEXY(CGpsPoint * cmpoint, ChangeNormal change, bool NE2XY)
{
#if 0
	if (NE2XY) {
		cmpoint->m_lx = (long)(change.a11 * cmpoint->m_dgx +
					 change.a12 * cmpoint->m_dgy + change.dx);

		cmpoint->m_ly = (long)(change.a21 * cmpoint->m_dgx +
					 change.a22 * cmpoint->m_dgy + change.dy);
    }
    else {
		cmpoint->m_dgx = change.a11 * cmpoint->m_lx +
					  change.a12 * cmpoint->m_ly + change.dx;

		cmpoint->m_dgy = change.a21 * cmpoint->m_lx +
					  change.a22 * cmpoint->m_ly + change.dy;
    }
#else
	long	lTemp;
	double	x,y,dTemp;

    if (NE2XY) {
		lTemp		= (long)cmpoint->m_dgx   / 100;
		dTemp		= cmpoint->m_dgx - lTemp * 40;
		x			= dTemp;
		lTemp		= (long)cmpoint->m_dgy   / 100;
		dTemp		= cmpoint->m_dgy - lTemp * 40;
		y			= dTemp;
		cmpoint->m_lx	= (long)(change.a11 * x + change.a12 * y + change.dx);
		cmpoint->m_ly	= (long)(change.a21 * x + change.a22 * y + change.dy);
    }
    else {
		x = cmpoint->m_lx;
		y = cmpoint->m_ly;
		
		dTemp		= change.a11 * x + change.a12 * y + change.dx;
		lTemp		= (long)dTemp   / 60;
		cmpoint->m_dgx = dTemp + lTemp * 40;
		dTemp		= change.a21 * x + change.a22 * y + change.dy;
		lTemp		= (long)dTemp   / 60;
		cmpoint->m_dgy = dTemp + lTemp * 40;
    }
#endif
}

void CGpsDrawMap::CalculateCoeffNEXY(ChangeTriangle Triangle1,ChangeTriangle Triangle2,ChangeNormal *Change)
{
#if 0
	double tmp1,tmp2;
	tmp1 = (Triangle2.x2 - Triangle2.x1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle2.y2 - Triangle2.y1);
	     
	tmp2 = (Triangle1.x2 - Triangle1.x1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle1.x3 - Triangle1.x1) * (Triangle2.y2 - Triangle2.y1);
	Change->a11 = tmp2 / tmp1;

	tmp2 = (Triangle2.x2 - Triangle2.x1) * (Triangle1.x3 - Triangle1.x1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle1.x2 - Triangle1.x1);
	Change->a12 = tmp2 / tmp1;

	tmp2 = (Triangle1.y2 - Triangle1.y1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle1.y3 - Triangle1.y1) * (Triangle2.y2 - Triangle2.y1);
	Change->a21 = tmp2 / tmp1;

	tmp2 = (Triangle2.x2 - Triangle2.x1) * (Triangle1.y3 - Triangle1.y1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle1.y2 - Triangle1.y1);
	Change->a22 = tmp2 / tmp1;

	Change->dx = Triangle1.x1 - Change->a11 * Triangle2.x1 - 
								Change->a12 * Triangle2.y1;
	Change->dy = Triangle1.y1 - Change->a21 * Triangle2.x1 - 
								Change->a22 * Triangle2.y1;	
#else
	double tmp1,tmp2;
	tmp1 = (Triangle2.x2 - Triangle2.x1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle2.y2 - Triangle2.y1);
	     
	tmp2 = (Triangle1.x2 - Triangle1.x1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle1.x3 - Triangle1.x1) * (Triangle2.y2 - Triangle2.y1);
	Change->a11 = tmp2 / tmp1;

	tmp2 = (Triangle2.x2 - Triangle2.x1) * (Triangle1.x3 - Triangle1.x1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle1.x2 - Triangle1.x1);
	Change->a12 = tmp2 / tmp1;

	tmp2 = (Triangle1.y2 - Triangle1.y1) * (Triangle2.y3 - Triangle2.y1) - 
		   (Triangle1.y3 - Triangle1.y1) * (Triangle2.y2 - Triangle2.y1);
	Change->a21 = tmp2 / tmp1;

	tmp2 = (Triangle2.x2 - Triangle2.x1) * (Triangle1.y3 - Triangle1.y1) - 
		   (Triangle2.x3 - Triangle2.x1) * (Triangle1.y2 - Triangle1.y1);
	Change->a22 = tmp2 / tmp1;

	Change->dx = Triangle1.x1 - Change->a11 * Triangle2.x1 - 
								Change->a12 * Triangle2.y1;
	Change->dy = Triangle1.y1 - Change->a21 * Triangle2.x1 - 
								Change->a22 * Triangle2.y1;	
#endif
}

void CGpsDrawMap::RefreshMapWnd()
{
	ChangeTriangle	triangle;
	ChangeNormal	TmpTri;
	CRect			lpRect;

	((CGpsSCView*)m_pCurrView)->GetClientRect(lpRect);

	if((m_cCurrMapInfo.m_lWnd_Max_X == 0) || (m_cCurrMapInfo.m_lWnd_Max_Y == 0)) {
		lpRect.right	*= m_byZoomCoeffic;
		lpRect.bottom	*= m_byZoomCoeffic;
		m_cCurrMapInfo.m_lWnd_Max_X	= lpRect.right;
		m_cCurrMapInfo.m_lWnd_Max_Y	= lpRect.bottom;
		((CGpsSCView*)m_pCurrView)->SetScrollSizes(MM_TEXT, CSize(m_cCurrMapInfo.m_lWnd_Max_X, m_cCurrMapInfo.m_lWnd_Max_Y));
	}
	else {
		lpRect.right	= m_cCurrMapInfo.m_lWnd_Max_X;
		lpRect.bottom	= m_cCurrMapInfo.m_lWnd_Max_Y;
	}

	m_cCurrMapInfo.m_WndTriangle.x1 = lpRect.left;
	m_cCurrMapInfo.m_WndTriangle.y1 = lpRect.top;
	m_cCurrMapInfo.m_WndTriangle.x2 = lpRect.left;
	m_cCurrMapInfo.m_WndTriangle.y2 = lpRect.bottom;
	m_cCurrMapInfo.m_WndTriangle.x3 = lpRect.right;
	m_cCurrMapInfo.m_WndTriangle.y3 = lpRect.bottom;

#if 1
	triangle =  m_cCurrMapInfo.m_MapTriangle;
	long	iTemp;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.x1 / 100);
	m_cCurrMapInfo.m_MapTriangle.x1 = m_cCurrMapInfo.m_MapTriangle.x1 - iTemp * 40;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.x2 / 100);
	m_cCurrMapInfo.m_MapTriangle.x2 = m_cCurrMapInfo.m_MapTriangle.x2 - iTemp * 40;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.x3 / 100);
	m_cCurrMapInfo.m_MapTriangle.x3 = m_cCurrMapInfo.m_MapTriangle.x3 - iTemp * 40;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.y1 / 100);
	m_cCurrMapInfo.m_MapTriangle.y1 = m_cCurrMapInfo.m_MapTriangle.y1 - iTemp * 40;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.y2 / 100);
	m_cCurrMapInfo.m_MapTriangle.y2 = m_cCurrMapInfo.m_MapTriangle.y2 - iTemp * 40;
	iTemp = (long)(m_cCurrMapInfo.m_MapTriangle.y3 / 100);
	m_cCurrMapInfo.m_MapTriangle.y3 = m_cCurrMapInfo.m_MapTriangle.y3 - iTemp * 40;
#endif

	CalculateCoeffNEXY(m_cCurrMapInfo.m_WndTriangle,m_cCurrMapInfo.m_MapTriangle,&TmpTri);
	m_cCurrMapInfo.CoeffNE_XY = TmpTri;

	CalculateCoeffNEXY(m_cCurrMapInfo.m_MapTriangle,m_cCurrMapInfo.m_WndTriangle,&TmpTri);
	m_cCurrMapInfo.CoeffXY_NE = TmpTri;

	m_cCurrMapInfo.m_MapTriangle = triangle;
}

void CGpsDrawMap::GetCurrMapInfo(CGpsLinkStruct *pLinkStruct,CCurrMapInfo *MapInfo)
{
	CopyEquaLenArr(pLinkStruct->m_LinkLibName,MapInfo->m_LinkFileName,pLinkStruct->m_LinkLibName_Bytes);
	CopyEquaLenArr(pLinkStruct->m_RelatedSignLibName,MapInfo->m_SignFileName,pLinkStruct->m_SignLibName_Bytes);
	MapInfo->LinkName2DataLib(MapInfo->m_LinkFileName,MapInfo->m_DataFileName);
	MapInfo->m_MapTriangle = pLinkStruct->m_MapTri;
}

long CGpsDrawMap::GetDataLibAddr(char *DataLibName)
{
	long		InfoAddr,DataStartAddr,DataEndAddr,i,RetAddr = -1;
	char		DataFileName[GpsLibFileLen + 1];

	InfoAddr = m_cFatStruct.m_lDataLibAddr;
	for(i = 0; i < m_cFatStruct.m_lDataLibTotal; i++) {
		ClearBYTEArr(DataFileName,GpsLibFileLen + 1);
		GetLibInfo(FileContent,InfoAddr,DataFileName,&DataStartAddr,&DataEndAddr);
		InfoAddr += LibInfoBytes;						//链接库在FAT表中占用的字节数
		if(CompareTwoArr(DataFileName,DataLibName) == 1) {
			RetAddr = DataStartAddr;
			break;
		}
	}

	return RetAddr;
}

bool CGpsDrawMap::GetDataLib(char *DataLibName)
{
	long		DataLibStart;
	
	DataLibStart = GetDataLibAddr(DataLibName);
	if(DataLibStart == -1)	return false;

	m_cCurrMapInfo.ClearColorBList();

⌨️ 快捷键说明

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