首页 > 其他分享 >地图导航系统

地图导航系统

时间:2023-05-25 14:13:29浏览次数:31  
标签:include string int 地图 m1 m2 导航系统 now

一饭多吃.jpg
放个最初版本,A*求最短路

#include "Logger.h"
#include "ColorUtils.h"
#include "ImgUtils.h"
#include<graphics.h>
#include<windows.h>
#include<iostream>
#include<conio.h>
#include<cstdio>
#include<cmath>
#include<queue>
#include <thread>
#define DIS_PERCENT 1.2
#define WALK_PERCENT 65
#define INF 1000
using namespace std;
unsigned int unWidth = 0, unHeight = 0;
const double sqrt2 = sqrt(2.0);
IMAGE Map;
int lu[2333][2333], vis[2333][2333];
double dis[2333][2333];
string lastInf;
bool selected = false;

void mapToSpot()
{
	memset(lu, 0, sizeof(lu));
	for (int i = 0; i < unWidth; ++i)
		for (int j = 0; j < unHeight; ++j)
			if (ColorUtils::isTarget(i, j))lu[i][j] = 1;
}
struct dian
{
	int x, y;
	double dis_from, dis_to;
	friend bool operator <(const dian& a, const dian& b)
	{
		return a.dis_from + a.dis_to > b.dis_from + b.dis_to;
	}
}from[2333][2333];//用来找回来的路径
priority_queue<dian>q;
int dx[10] = { 0,-1,-1,1,1,-1,0,0,1 };
int dy[10] = { 0,-1,1,-1,1,0,-1,1,0 };
void DIJ(int X1, int Y1, int X2, int Y2)
{
	while (!q.empty())q.pop();
	memset(from, 0, sizeof(from));
	memset(vis, 0, sizeof(vis));
	for (int i = 0; i < unWidth; ++i)
		for (int j = 0; j < unHeight; ++j) dis[i][j] = 114514;
	
	dian now, to; double tmp_dis; now.x = X1; now.y = Y1; now.dis_from = 0;
	dis[now.x][now.y] = 0;
	q.push(now);
	bool flag = false;
	while (!q.empty() && !flag)
	{	
		now = q.top(); q.pop();
		if (vis[now.x][now.y])continue; vis[now.x][now.y] = 1;
		setfillcolor(RGB(255, 0, 0));
		solidcircle(now.x, now.y, 1);
		for (int i = 1; i <= 8; ++i)
		{
			to.x = now.x + dx[i]; to.y = now.y + dy[i];
			if (i <= 4)tmp_dis = now.dis_from + sqrt2;
			else tmp_dis = now.dis_from + 1.0;
			if (to.x < 0 || unWidth <= to.x || to.y < 0 || unHeight <= to.y || lu[to.x][to.y] == 0 || dis[to.x][to.y] <= tmp_dis)continue;
			dis[to.x][to.y] = tmp_dis; to.dis_from = tmp_dis;
			
			//Sleep(2);//用来展示寻路过程

			to.dis_to = sqrt((double)(X2 - to.x) * (X2 - to.x) + (Y2 - to.y) * (Y2 - to.y));
			from[to.x][to.y] = now;
			q.push(to);
			if (to.x == X2 && to.y == Y2) flag = true;
		}
	}
	now.x = X2; now.y = Y2;
	int prepts[5000] = { 0 };
	putimage(0, 0, &Map);
	while (now.x != X1 || now.y != Y1)
	{
		//Sleep(2);
		setfillcolor(RGB(0, 0, 255));
		solidcircle(now.x, now.y, 2);
		now = from[now.x][now.y];
	}
}

ExMessage m1, m2, m3;
void watch() 
{
	if (!selected) 
	{
		cin >> m1.x >> m1.y;
		cin >> m2.x >> m2.y;
		selected = true;
	}
}

void showMouse() 
{
	while (1) 
	{
		ExMessage m;
		if (peekmessage(&m)) 
		{
			setfillcolor(BLACK);
			solidrectangle(0, 0, 170, 30);
			setfillcolor(RGB(255, 0, 0));
			string ch = "Mouse: " + to_string(m.x) + ' ' + to_string(m.y);
			if (ColorUtils::isTarget(m.x, m.y)) 
			{
				ch += " Yes";
			}
			else 
			{
				ch += " No";
			}
			int num = MultiByteToWideChar(0, 0, ch.c_str(), -1, NULL, 0);
			wchar_t* wide = new wchar_t[num];
			MultiByteToWideChar(0, 0, ch.c_str(), -1, wide, num);
			outtextxy(0, 0, wide);
		}
	}
}

int main()
{

	ImgUtils::GetPicWidthHeight("./ChangZhou.png", &unWidth, &unHeight);
	initgraph(unWidth, unHeight, EW_SHOWCONSOLE);
	setlinestyle(PS_SOLID | PS_ENDCAP_FLAT | PS_JOIN_BEVEL, 3);
	loadimage(&Map, _T(".\\ChangZhou.png"));
	putimage(0, 0, &Map);
	Logger::logInfo("预处理地图中...");
	mapToSpot();
	Logger::logSuccess("加载完毕!可以开始选点了!");
	thread mouse(showMouse);
	mouse.detach();
	while (1) 
	{
		selected = false;
		setfillcolor(RGB(255, 0, 0));
		thread input(watch);
		input.detach();
		while (!selected)
		{
			if (peekmessage(&m1)) 
			{
				if (m1.message == WM_LBUTTONDOWN && ColorUtils::isTarget(m1.x, m1.y)) 
				{
					solidcircle(m1.x, m1.y, 4);
					if (m1.ctrl != true) break;
				}
			}
		}
		lastInf = "第一个点的坐标为: " + to_string(m1.x);
		lastInf += "  " + to_string(m1.y);
		Logger::logInfo(lastInf);
		while (!selected)
		{
			if (peekmessage(&m2)) 
			{
				if (m2.message == WM_LBUTTONDOWN && ColorUtils::isTarget(m2.x, m2.y)) 
				{
					solidcircle(m2.x, m2.y, 4);
					selected = true;
					break;
				}
			}
		}
		lastInf = "第二个点的坐标为: " + to_string(m2.x);
		lastInf += "  " + to_string(m2.y);
		Logger::logInfo(lastInf);

		double dur;
		clock_t start, end;
		start = clock();
		Logger::logInfo("Starting A*...");
		DIJ(m1.x, m1.y, m2.x, m2.y);
		end = clock();
		dur = (double)(end - start);
		Logger::logSuccess("Use Time: " + to_string(dur / CLOCKS_PER_SEC));
		while (1)
		{
			if (peekmessage(&m3)&& m3.message == WM_LBUTTONDOWN)break;
		}
		putimage(0, 0, &Map);
	}
	return 0;
}

标签:include,string,int,地图,m1,m2,导航系统,now
From: https://www.cnblogs.com/wljss/p/17431023.html

相关文章

  • Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)
    在Cesium中,加载影像图层主要通过ImageryLayer、ImageryProvider和ImageryLayerCollection三个类来实现;首先我们先来认识下这三个类一、ImageryLayer类在Cesium中,使用ImageryLayer对象来表示一个影像图层。ImageryLayer是一个包含一个或多个瓦片的图层,它可以用来控制地图影像的显......
  • Cesium结合GIS天地图 加载倾斜摄影3dtile + vue3
    实现思路将倾斜摄影OSGB数据转换为3dtile(转换方式很多,可以利用第三方工具cesiumlab)利用Cesium加载GIS地图,我这里使用的是天地图,可以加载其他地图都行加载3dtile数据到地图中展示安装插件npminstallcesium加载地图以加载天地图为例,需要先到天地图官网去申请开发者,获取......
  • 迪友社区Dilink车机 高德地图V7.1 共存版|小迪语音控制|锁14通道「持续更新」
    本文转载自:迪友社区 https://www.bydmax.com/apps/742.html7.1更新记录1:全程绿波,一路畅行2:地图配色焕新,周边信息应有尽有3:规划布局更新,熟路常去路一看便知4:搜索界面体验升级,布局优化、信息更全5:迪友社区优化:修改共存包名,避免和自带地图冲突无法安装。6:迪友社区优化:新增锁......
  • WMTS以及TMS地图切片方案详述和比对
    一、绪论地图切片是一种将整幅的地图按照一定的规则拆分成具有行列编号的网格的方案,对于矢量地图而言其好处是可以根据需要显示的范围只绘制对应网格内的要素从而减少渲染压力,对于栅格地图而言则是可以减少一次性请求(或者读取)的数据量,从而更高效的显示区域内的地图。瓦......
  • Google Earth Engine(GEE) ——土著土地地图数据集
    土著土地(土著土地地图)土地确认是人们在日常生活中插入对土著存在和土地权利的认识的一种方式。这通常是在仪式、讲座或在本案例中的教育指南的开头进行。它可以是一种明确但有限的方式,承认殖民主义和第一民族的历史,以及定居者-殖民社会的变革需要。在这种情况下,我们希望在地理学上......
  • 八叉树建立地图并实现路径规划导航
    构建语义地图时,用的是octomap_server和semantic_slam:octomap_generator,不过还是整理下之前的学习笔记。一、Octomap安装并使用Octomap_Server1.1Apt安装Octomap库如果你不需要修改源码,可以直接安装编译好的octomap库,记得把ROS版本「kinetic」替换成你用的:sudoapt-get......
  • vue3 +leaflet + 天地图
    vue3使用leafletnpminstallleaflet-D如果使用了tsnpmi--save-dev@types/leaflet//使用了ts需要下载声明类型//更具需要获取不通过类型的urlfunctiongetUrl(type:string){interfaceMyObject{[key:string]:Array<string>;}letobj:MyObject=......
  • Typora上传博客园教程:解决本地图片问题
    一、个人使用感受:推荐使用我之前还担忧,该软件上传的图片会占用我们博客的上传文件的100m空间,或者占用我们的相册,但是经过一番测试与分析后,我才发现,它上传的地方和我们在博客园在线写文章时插入图片一样,都不会占用我们个人的空间,所以不存在空间会越用越小的问题,尽情用就完事了。......
  • Android 百度地图GPS获取定位经纬度
    首先进入百度地图官网,点击开发文档-->Android定位SDK-->获取密匙,进入应用创建界面,创建新的应用。准备好后,在“产品下载”栏目下载Android定位的包,将其打包放入项目中的libs文件目录。之后就需要在AndroidManifest.xml中添加APK,在Application标签中添加:<meta-dataand......
  • 001-Leaflet-地图初始化
    一、代码1<!DOCTYPEhtml>2<htmllang="en">34<head>5<metacharset="UTF-8">6<metahttp-equiv="X-UA-Compatible"content="IE=edge">7<metaname="viewport......