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

📄 imagemap.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			y2 = m_lImageHeight - y2 - 1;
		}

		CRect rcDib(x1, y1, x2, y2);
		rcDib.NormalizeRect();
		
		m_pDib->PaintDIB(pdc->m_hDC, &rcDc, &rcDib);
	}
	else if(!m_bSetMBRC)
	{
		MessageBox(NULL, _T("必须在DrawMap之前调用SetMapMBRC"), _T("错误"), MB_OK);
	}
}

int CImageMap::DrawMap()
{
	if(!m_bIsLoadMap) return 0;//地图未加载
	
	CDC *pdc = NULL;
	HDC hdc = NULL;

	if(m_hWnd)
	{
		//获取窗口显示DC
		hdc = GetDC(m_hWnd); 
		pdc = CDC::FromHandle(hdc);
	}
	if(m_memDC.GetSafeHdc() == NULL)
	{
		//如果pdc = NULL,则创建和屏幕DC兼容的DC
		m_memDC.CreateCompatibleDC(pdc);
		//创建空白内存位图
		m_Bitmap.CreateCompatibleBitmap(pdc, m_x2 - m_x1, m_y2 - m_y1);
		m_pOldBitmap = m_memDC.SelectObject(&m_Bitmap); 
	}
	m_memDC.FillRect(CRect(0, 0, m_x2, m_y2), &CBrush(RGB(255, 255, 255)));

	//先在内存DC中绘制地图
	DrawMap(&m_memDC); 

	//把地图显示在屏幕上
	if(m_hWnd && pdc)
	{
		pdc->BitBlt(0, 0, m_x2 - m_x1, m_y2 - m_y1, &m_memDC, 0, 0, SRCCOPY);
		ReleaseDC(m_hWnd, hdc); //释放dc
	}

	return 1;
}

int CImageMap::ZoomIn()//放大
{
	double cx1 = m_cx, cy1 = m_cy,
		   cx2 = m_cx, cy2 = m_cy;

	//求出屏幕中心点坐标对应的地图坐标
	ScreenToMap(&cx1, &cy1);
	m_dZoomFactor *= m_dZoomAmount;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	ScreenToMap(&cx2, &cy2);
	//求出屏幕中心点坐标偏移量
	m_dOffsetX += fabs(cx2 - cx1);
	m_dOffsetY += fabs(cy2 - cy1);

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomIn(long x, long y)//以指定点放大
{
	double cx1 = x, cy1 = y,
		   cx2 = x, cy2 = y;

	//求出x,y点坐标对应的地图坐标
	ScreenToMap(&cx1, &cy1);
	m_dZoomFactor *= m_dZoomAmount;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	ScreenToMap(&cx2, &cy2);
	//求出x,y点坐标偏移量
	m_dOffsetX += fabs(cx2 - cx1);
	m_dOffsetY += fabs(cy2 - cy1);

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomOut()//缩小
{
	double cx1 = m_cx, cy1 = m_cy,
		   cx2 = m_cx, cy2 = m_cy;

	//求出屏幕中心点坐标对应的地图坐标
	ScreenToMap(&cx1, &cy1);
	m_dZoomFactor /= m_dZoomAmount;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	ScreenToMap(&cx2, &cy2);
	//求出屏幕中心点坐标偏移量
	m_dOffsetX -= fabs(cx2 - cx1);
	m_dOffsetY -= fabs(cy2 - cy1);

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomOut(long x, long y)//以指定点缩小
{
	double cx1 = x, cy1 = y,
		   cx2 = x, cy2 = y;

	//求出x,y点坐标对应的地图坐标
	ScreenToMap(&cx1, &cy1);
	m_dZoomFactor /= m_dZoomAmount;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	ScreenToMap(&cx2, &cy2);
	//求出x,y点坐标偏移量
	m_dOffsetX -= fabs(cx2 - cx1);
	m_dOffsetY -= fabs(cy2 - cy1);

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomIn(POINT pt1, POINT pt2)
{
	if(pt2.x == pt1.x) return 0;
	if(pt2.y == pt1.y) return 0;

	//调整坐标
	if(pt1.x > pt2.x)
	{
		long tmx = pt1.x;
		pt1.x = pt2.x;
		pt2.x = tmx;
	}
	if(pt1.y > pt2.y)
	{
		long tmy = pt1.y;
		pt1.y = pt2.y;
		pt2.y = tmy;
	}

	double x, y;
	double blc, blc1, blc2;
	blc1 = (m_x2 - m_x1)/double(pt2.x - pt1.x);
	blc2 = (m_y2 - m_y1)/double(pt2.y - pt1.y);
	if(blc1 < blc2)
	{
		blc = blc1;
		x = pt1.x;
		long cy = long((m_y2 - m_y1)/blc1);
		y = pt1.y - (cy - pt2.y + pt1.y)/2;
	}
	else
	{
		blc = blc2;
		y = pt1.y;
		long cx = long((m_x2 - m_x1)/blc2);
		x = pt1.x - (cx - pt2.x + pt1.x)/2;
	}

	ScreenToMap(&x, &y);

	m_dZoomFactor *= blc;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	m_dOffsetX = x;
	m_dOffsetY = y;

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomOut(POINT pt1, POINT pt2)
{
	if(pt2.x == pt1.x) return 0;
	if(pt2.y == pt1.y) return 0;

	//调整坐标
	if(pt1.x > pt2.x)
	{
		long tmx = pt1.x;
		pt1.x = pt2.x;
		pt2.x = tmx;
	}
	if(pt1.y > pt2.y)
	{
		long tmy = pt1.y;
		pt1.y = pt2.y;
		pt2.y = tmy;
	}

	double blc, blc1, blc2;
	blc1 = (m_x2 - m_x1)/double(pt2.x - pt1.x);
	blc2 = (m_y2 - m_y1)/double(pt2.y - pt1.y);
	if(blc1 > blc2)
		blc = blc2;
	else 
		blc = blc1;

	double cx1, cy1, cx2, cy2;
	cx1 = cx2 = (pt1.x + pt2.x)/2;
	cy1 = cy2 = (pt1.y + pt2.y)/2;

	//求出矩形中心点坐标对应的地图坐标
	ScreenToMap(&cx1, &cy1);
	m_dZoomFactor /= blc;
	m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;

	ScreenToMap(&cx2, &cy2);
	//求出中心点坐标偏移量
	m_dOffsetX -= fabs(cx2 - cx1);
	m_dOffsetY -= fabs(cy2 - cy1);

	int ret = DrawMap();
	return ret;
}

int CImageMap::ZoomToAll() //显示全图
{
	m_dZoomFactor = m_dZoomOrigin;
	m_dScale = m_dScaleAll;
	double x1 = m_x1, y1 = m_y1,
		   x2 = m_x2, y2 = m_y2;
	ScreenToMap(&x1, &y1);
	ScreenToMap(&x2, &y2);
	m_dOffsetX = m_rcRect.x1 + (m_rcRect.x2 - m_rcRect.x1)/2 - (x2 - x1)/2;
	m_dOffsetY = m_rcRect.y1 + (m_rcRect.y2 - m_rcRect.y1)/2 - (y2 - y1)/2;

	int ret = DrawMap();
	return ret;
}

int CImageMap::MoveLeft()
{
	double x2 = m_rcRect.x2,
		   y2 = m_rcRect.y2;
	MapToScreen(&x2, &y2);

	double cx = m_nShiftSize, cy = 0;
	ScreenToMap(&cx, &cy);
	m_dOffsetX = cx;
	int ret = DrawMap();

	return ret;
}

int CImageMap::MoveRight()
{
	double x1 = m_rcRect.x2,
		   y1 = m_rcRect.y2;
	MapToScreen(&x1, &y1);

	double cx = m_nShiftSize, cy = 0;
	ScreenToMap(&cx, &cy);
	m_dOffsetX -= cx - m_dOffsetX;
	int ret = DrawMap();
	return ret;
}

int CImageMap::MoveUp()
{
	double x2 = m_rcRect.x2,
		   y2 = m_rcRect.y2;
	MapToScreen(&x2, &y2);

	double cy = m_nShiftSize, cx = 0;
	ScreenToMap(&cx, &cy);
	m_dOffsetY = cy;
	int ret = DrawMap();
	return ret;
}

int CImageMap::MoveDown()
{
	double x1 = m_rcRect.x2,
		   y1 = m_rcRect.y2;
	MapToScreen(&x1, &y1);

	double cy = m_nShiftSize, cx = 0;
	ScreenToMap(&cx, &cy);
	m_dOffsetY -= cy - m_dOffsetY;
	int ret = DrawMap();
	return ret;
}

//以给定尺寸平移地图,dx=+左移,=-右移;dy=+上移,=-下移
int CImageMap::MoveMap(long dx, long dy, BOOL bRedraw)
{
	if(!m_bIsLoadMap) return 0;

	if(bRedraw)
	{
		double ddx = dx, ddy = dy;
		ScreenToMap(&ddx, &ddy);

		m_dOffsetX -= ddx - m_dOffsetX;
		m_dOffsetY -= ddy - m_dOffsetY;

		DrawMap();
	}
	else
	{
		long xSrc, ySrc, wSrc, hSrc;
		long xDes, yDes;
		if(dx > 0)
		{
			xSrc = 0;
			wSrc = m_x2 - dx;
			xDes = dx;
		}
		else
		{
			xSrc = -dx;
			wSrc = m_x2 + dx;
			xDes = 0;
		}
		if(dy > 0)
		{
			ySrc = 0;
			hSrc = m_y2 - dy;
			yDes = dy;
		}
		else
		{
			ySrc = -dy;
			hSrc = m_y2 + dy;
			yDes = 0;
		}
		if(m_hWnd)
		{
			HDC dc = GetDC(m_hWnd);
			::BitBlt(dc, xDes, yDes, wSrc, hSrc, m_memDC.m_hDC, xSrc, ySrc, SRCCOPY);
			if(dx > 0)
				PatBlt(dc, 0, 0, dx, m_y2 - m_y1, WHITENESS);
			else 
				PatBlt(dc,  m_x2 + dx, 0, -dx, m_y2 - m_y1, WHITENESS);
			if(dy > 0)
				PatBlt(dc, 0, 0, m_x2 - m_x1, dy, WHITENESS);
			else
				PatBlt(dc, 0, m_y2 + dy, m_x2 - m_x1, -dy, WHITENESS);
			ReleaseDC(m_hWnd, dc);
		}
	}

	return 1;
}

//把地图的中心定位到指定的点
void CImageMap::CenterAt(double x, double y)
{
	x =  fabs(x);
	y = -fabs(y);

	double x1 = 0, y1 = 0;
	double x2 = m_cx, y2 = m_cy;
	ScreenToMap(&x1, &y1);
	ScreenToMap(&x2, &y2);
	m_dOffsetX = x - fabs(x2 - x1);
	m_dOffsetY = y - fabs(y2 - y1);

	DrawMap();
}

double CImageMap::Distance(double lon1, double lat1, double lon2, double lat2)
{
#define a_2d 6378137
#define e_2d 0.006694380
#define h_2d 15
#define DEG_2_RAD 0.01745329252
#define RAD_2_DEG 57.29577951290

	double x_rads = fabs(lon1) * DEG_2_RAD;
	double y_rads = fabs(lat1) * DEG_2_RAD;

	double n_2ds = a_2d/sqrt(1 - e_2d * sin(y_rads) * sin(y_rads));

	double x_2d = (n_2ds + h_2d) * cos(y_rads) * cos(x_rads);
	double y_2d = (n_2ds + h_2d) * cos(y_rads) * sin(x_rads);
	double z_2d = (n_2ds * (1 - e_2d) + h_2d) * sin(y_rads);

	double x_radm = fabs(lon2) * DEG_2_RAD;
	double y_radm = fabs(lat2) * DEG_2_RAD;
	
	double n_2dm = a_2d/sqrt(1 - e_2d * sin(y_radm) * sin(y_radm));

	double x_2d_mark = (n_2dm + h_2d) * cos(y_radm) * cos(x_radm);
	double y_2d_mark = (n_2dm + h_2d) * cos(y_radm) * sin(x_radm);
	double z_2d_mark = (n_2dm * (1 - e_2d) + h_2d) * sin(y_radm);

	double t1 = x_2d * x_2d + y_2d * y_2d + z_2d * z_2d;
	double t = (t1 - (x_2d * x_2d_mark + y_2d * y_2d_mark + z_2d * z_2d_mark))/t1;
	double tempx = x_2d_mark + (t-1) * x_2d;
	double tempy = y_2d_mark + (t-1) * y_2d;
	double tempz = z_2d_mark + (t - 1) * z_2d;
	double hy1 = (x_2d * x_2d + y_2d * y_2d)/z_2d * tempz - x_2d * tempx - y_2d * tempy;
	double hy2 = sqrt(x_2d * x_2d + y_2d * y_2d + ((x_2d * x_2d + y_2d * y_2d)/z_2d) * ((x_2d * x_2d + y_2d * y_2d)/z_2d));
	double hy3 = sqrt(tempx * tempx + tempy * tempy + tempz * tempz);
	double hy = hy1/(hy2 * hy3);
		   hy = acos(hy) * RAD_2_DEG;

	double condition = (y_2d - x_2d) * tempx + (x_2d * x_2d - x_2d * y_2d) * tempy/y_2d;
	double distance = (x_2d_mark - x_2d) * (x_2d_mark - x_2d) + (y_2d_mark - y_2d) * (y_2d_mark - y_2d) + (z_2d_mark - z_2d) * (z_2d_mark - z_2d);
	distance = sqrt(distance);

	return distance;
}

⌨️ 快捷键说明

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