
思路篇
思路篇主要记录程序流程思路
毕业设计思路篇(一)之道路数据的抽象
毕业设计思路篇(二)之交通灯的初始化
毕业设计思路篇(三)之预加载车辆路线
毕业设计思路篇(四)之生成车辆
毕业设计思路篇(五)之交通流量模拟
番外篇
番外篇主要记录非主要流程(即并非每次运行都会执行的模块,比如预处理等)。每个模块可单独修改或维护,而不影响主流程。
所有文章的完整列表,按时间倒序排列 - 第15页

思路篇主要记录程序流程思路
番外篇主要记录非主要流程(即并非每次运行都会执行的模块,比如预处理等)。每个模块可单独修改或维护,而不影响主流程。
runSimulation(Graph &G)
进入对应的路口缓冲区,根据路口类的红绿灯对象判断是否能通行。
若能通行,则填至目标道路
若不能,则继续停留在路口缓冲区
改变该车在当前道路的位置。
for (auto &road:G.m_Road_v) {
auto src = road.m_queVehicle;
decltype(road.m_queVehicle) obj;
//路内车的遍历
while (!src.empty()) {
//弹出一辆车
auto it = src.front();
src.pop_front();
// 当车的时间戳小于实际时间时,才模拟运行
if (it.time < SYSTEM_TIME) {
it.fSpec = (100 - road.get_Congestion() - 20) / 3.6;
dist = it.dDistance + it.fSpec * 10;
it.time++;
it.showself();
//如果车十秒后不在此路
if (dist >= road.m_dLength) {
//路径擦除
auto route = it.queRoute;
int site = it.m_nSiteRoadID;
route.pop();
//如果抵达终点
if (route.empty()) {
cout << "it is be shutdown" << endl;
exit(0);
// 否侧没有抵达终点
} else {
//获取所在路和下一条路的ID
int next = route.front();
//判断红绿灯情况
cout << site << endl;
G.m_CrossRoad_v[site].m_CTrafficLight_Light.clock(SYSTEM_TIME);
//如果可以通行
if (G.m_CrossRoad_v[site].m_CTrafficLight_Light.getStatus(it.m_nSiteRoadID, next)) {
cout << GREEN << "绿灯通行:" << endl;
it.queRoute = route;
it.dDistance = 0;
it.m_nSiteRoadID = next;
auto *site_road = &G.m_Road_v[next].m_queVehicle;
site_road->push_back(it);
//如果不能通行
} else {
//将距离置为道路长度,表示正在等候红灯
it.dDistance = G.m_Road_v[it.m_nSiteRoadID].m_dLength;
cout << YELLOW << "等待红灯" << endl;
//车辆塞回去
obj.push_back(it);
}
}
//否则,当车十秒后还在此路时
} else {
it.dDistance = dist;
obj.push_back(it);
}
//否则直接填入
} else {
obj.push_back(it);
}
}
road.m_queVehicle = obj;
}
形如以下格式
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
其中,一行表示一条可完全畅通的道路编号序列。将所有道路存入v_Route
vector<queue<int>> v_Route;
/**
* load route from route file
* @param Map_graph
*/
void loadRoute(Graph &Map_graph) {
string str_Path;
ifstream fin_Route(DIR_RES"route.txt");
while (getline(fin_Route, str_Path)) {
stringstream ss_Temp(str_Path);
queue<int> q_Path_Temp;
int n_Temp;
while (ss_Temp >> n_Temp) {
q_Path_Temp.push(n_Temp);
}
v_Route.push_back(q_Path_Temp);
}
}
it->m_CTrafficLight_Light.setType(it->JunctionRoad.size());
根据路口道路条数, 设置路灯类型(是T字路口还是+字路口)
/**
* 交通灯类
*/
class TrafficLight {
public:
TrafficLight() {
for (int i = 0; i < 8; i++) {
roadID[i] = -1;
}
};
void changeStatus();
void clock(int time);
void setAllRed();
void setAllGreen();
bool getStatus(int from, int to);
/**
* 设置灯的类型, 是T字路口还是+字路口
* @param type
*/
void setType(int type) { this->type = type; };
//路口标号
// nLeftIn,nLeftOut,nDownIn,nDownOut,nRightIn,nRightOut,nUpIn,nUpOut;
int roadID[8];
//路口是否能走通
bool status[4][4] = {false};
int type;
//表示可通过的方向(目标方向)
//AllRED = 0,LeftGreen = 1,DownGreen = 2,RightGreen = 3,UpGreen = 4,UpDownGreen = 5,LeftRightGreen = 6,cross1 = 7,cross2 = 8
int emStatus = 0;
long long int time = 0;
};
对接各路口
首先,为什么我们需要这个?
因为微信小程序虽然可以可以绘制svg图片,但是在真机调试的时候却渲染不出来。所以我们需要一个工具(可以将svg转成微信小程序支持的canvas并绘制出来)。
我使用的是touch-wx + vs code 开发。
现已启用该开发模式.因为Ubuntu下经常编译不完整

Touch WX是一套完全免费的微信小程序开发框架,包含丰富的UI控件用于官方组件的补充。与Touch UI开发方式很相似,也是通过VSCode编辑器+插件的方式开发,经过编译后输出小程序代码。
与其他小程序框架最主要的区别在于:Touch UI完全是基于小程序官方的自定义组件机制实现,输出的是小程序原始代码,而不是输出开发者完全无法阅读的编译代码。这样当遇到问题时,开发者可以很方便的定位问题所在,还可以基于输出的原始代码继续开发。
当你用Touch UI开发了H5应用,可以直接导入到Touch WX进行转换,稍作调整就能生成小程序。反之也同样,当你Touch WX开发了微信小程序,可以导出为Touch UI工程来生成H5应用。

Touch WX 就是一个可以将特定的nodejs项目编译成微信小程序项目的框架
更多操作见http://www.touchui.io/touchui_doc_wx/
推荐大家看一下,或许会打开新世界的大门哦!
接下来,我默认你已经看了Touch WX的文档,并且拥有一定的nodejs基础
npm install parse-svg-path --save
var parse = require('parse-svg-path')
parse(d)
d为svg中的path值
不了解svg?
请转
http://www.w3school.com.cn/svg/svg_intro.asp
var options = {
url:"svg的URL",
success:function(res){
const ctx = wx.createCanvasContext('myCanvas')
ctx.setFillStyle('black')
var match = res.data.match(/d="(.*?)"/);
var d = match[1];
console.log(d);
}
}
wx.request(options);
上图中d就是path值,我这里使用的是正则表达式查找,而且只有一个path,如不一样,请自行modify
本文环境
操作系统: Ubuntu 16.04.3
Python版本: 3.5.2
Django版本: 2.0.4
nginx版本: 1.10.3
本文平台为腾讯云1核1G系统
我的项目文件名为:
dgutpsy
sudo apt-get install python3-pip
安装成功后运行
pip3将会出现
pip install uwsgi
新建文件test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
有些教程说是
return "hello world"
但是这样其实会出现访问空白的情况, 我的是Python3的环境,需要对hello world进行编码.
而如果你是Python2的环境,你应该写return "hello world"
uwsgi --http :8000 --wsgi-file test.py
此语句的意思是,
使用uwsgi运行test.py文件, 采用http模式, 端口8000
好啦,可以看到亲切的hello world 就说明uwsgi运行成功了
TIPS: 如果你访问不了,请先检查腾讯云安全组端口是否开放8000端口
pip3 install Django
如在python3里面import django没有报错则安装成功.
本文实践平台:腾讯云(qcloud.com)
首先我们来看看腾讯云官方的解决方案示意图

看懂了吗?看没看懂都没关系我们开始走一遍就好了。大致步骤如下:
购买腾讯云微信小程序解决方案
部署 mysql 实例到云数据库
部署网站到服务器,使网站外网可访问
将网站与数据库连接起来
配置 SSL 证书,使网站可 https 访问
构建负载均衡,使用户可以通过负载均衡的方式访问
制作服务器镜像,将可成功访问的服务器复制
新建 N(N>0)台服务器,将服务器重装为自定义镜像
test
详细如下:
就选择 3 元新购活动吧,我已经购买过了,就不再这儿演示怎么购买了。
succeed:此过程成功标志为资源下发成功,以及收到如下站内信。
succeed:此过程的成功标志为,在远程数据库中可查看到相应的表和数据
注:不重装的话,网站的根目录在/data/release/php_weapp_demo > _ > * > ** >
> **
我这儿装的是 centOS 6.5。版本不同可能会对应的软件安装方式不同。 2.*为服务器安装 apache_ #安装 apache
root@localhost ~]# yum -y install httpd
C++11引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能方便地获得复杂的类型,还能简化书写,提高编码效率。下面说一下C++中的auto
auto其实并不是一个新的关键字,在旧的标准C++98/03中,它代表着“具有自动存储周期的局部变量”。啥意思呢?就是我们平常所说的变量,他与static相对。就是说所有非static类型的都是“具有自动存储期的”。也就是说在旧的标准下。
autoint i =3;//等价于int i=3;
在C++11中,auto作为一个新的类型指示符(如int,double)来指示编译器的,但是auto申明的变量的类型必须由编译器在编译时期推导出来,也称类型推导。这种类型推导不是C++所独有的,还有很多具备这种能力的语言(如Python,Javascript)。我们先来看一段Python代码
name ="thinkmoon"print"hello,"+ name
在这里的name是不需要定义类型的,因为这个类型很容易被推导为字符串性,如过要想在C++中实现这种效果,我们可以这样。
#include<iostream>
int main(){
auto name ="thinkmoon";
std::cout <<"hello,"<< name << std::endl;
return0;
}
效果是一样的,是不是觉得写起来特别的方便呢?
但是需要注意的是,在C++中这种静态类型推导是发生在编译期间的。而像Python这种动态类型推导却是发生在运行期间的。
#include<iostream>
usingnamespace std;
int main(){
auto x =5;
cout << x << endl;//x被推导为intauto p =newauto(1);
cout <<"*"<< p <<"="<<*p << endl;//p被推导为
int *constauto*v =&x, u =6;
cout <<"*"<< v <<"="<<*v <<"\n u="<< u << endl;//v被推导为const int *,u被推导const int
}
对于最后一个类型推导有几个需要注意
v被推导为const int *而这里auto代替int,但是u等于6还是要写的,否则编译器会报错。
u的等号后面只能写整型的变量,否则会报错,因为不能让编译器产生具有二义性的推断。
其实我们学习的时候可以把auto理解为占位符,它只是占着一个位置并不做其它的事情,由编译器将其类型推导出来再用对应的类型去运行,所以这个时候auto的类型推导是不能让编译器产生二义性的。
int x =0;auto* a =&x;//auto推导为int,
auto b =&x;//auto推导为int *,即使不申明为指针也能推断为指针
auto& c = x;//auto推导为int,等价于int
auto d = c;//auto推导为int,auto会抛弃右值的引用类型
const auto e = x;//e是const int类型,
auto f = e;//f是int型constauto&g = x;//g是const
int & auto & h = g; //h是const int &
总结:
最开始,我就是用github-page部署博客的,刚开始的时候github-page是不支持自定义域名https的,所以你一定得用默认域名*.github.io才能使用https,要么嘛,你就放弃使用https。
刚开始的wordpres是放在我的服务器上的,而且还是与微信公众号对接好的(有相关插件),然后可以加很多牛逼的插件,完成一些很神奇的效果。我当时是装了蛮多插件的,比如:Jetpack全套啊,SMTP,All of SEO等等。好玩是好玩,但是对于我这种隔几天就要折腾一下服务器的。wordpress经常被我玩坏。然后开始寻找解决方案。
wordpress的官网是支持托管网站的,而且免费。再加上怎么玩都不会坏。但是同时免费版也限制了很多功能。比如,自定义插件啦,自定义域名之类的。其实这都能够接受,最让我无法忍受的是学校的网络,访问起来特别慢。大约一个页面要5秒中左右才开始渲染。强迫症不能忍
这是一个好东西,也是这个让我接触到了page服务这种东西,有关gitblog的更多可以看我这篇文章使用gitblog搭建个人博客.md, 其实除了小众之外没什么别的不好。但是我那颗不甘平静的心依旧想要折腾。
不知道是当时认知有限还是英语太差,总之我按着官网的教程没安装成功,再加上不太喜欢官网的主题,然后就放弃了。
一次偶然的机会,我发现有位大佬居然是用issue写博客的(现在才知道原来并不稀奇)
,读者一般都是github用户,评论交流起来简直不要太爽。按奈不住的我立马也这样做了。疯狂过后,就是一个人的寂寞。没有人看我不觉得奇怪,主要百度不收录哇。而且域名没在中国备案,很多事情都做不了,比如微信不能打开。
我就不介绍了,有兴趣自行百度。到现在为止我还是用hexo的。
最开始,用的是多说,后来下线了。
后来,用的是畅言,然后强制加广告了。
现在用的是,gitcomment,使用的是github帐号登录,缺点就是每个页面评论都要初始化。
听说Disqus不错,可是需要翻墙,不翻墙就要装个插件用精简版。
我就不改,先缓一缓。
如前言
不过要注意有个坑,自定义域名的话,就是一定要在source文件夹中新建一个CHANME文件里面写上你的域名,不然就每次hexo d 都要设置一次。
最开始我是用小书匠,不过写文章不错,写代码就不行。比如要改个样式什么的就非常麻烦。
后来用的是coding的webIDE,当时感觉描述很不错,事实上在网速好的情况下的确不错。但是一遇到网速不好的时候。写的代码就完全保存不了, 因为它会回退,会回退啊~
现在,用的是vs code写文章用小书匠,因为叼。
用过一段时间github,后来感觉github页面放个图床会让人感觉不好。
现在用的是七牛云存储。
github百度不会爬,需要自己推送(也可以用cdn回源域名加速)
coding-page 短时间推送次数过多就会凉。
github只能设置一个域名,而且https只支持顶级域名
所以我的访问人数又要重新累计了。
本文用作测试插件
var function(){
//预计一大波人即将取关
console.warn("You have been slained");
}