📄 gpsdrawmap.cpp
字号:
// 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 + -