细胞自动机与森林火灾与燃烧模拟

基于 元胞自动机-森林火灾模拟_vonneumann邻域-CSDN博客

 进行略微修改,解决固定方向着火问题,用了一个meshv2数组记录下一状态,避免旧状态重叠数据失效。

参数调整

澳洲森林火灾蔓延数学建模,基于元胞自动机模拟多模式下火灾蔓延(附部分源码)海啸传播模型_51CTO博客_森林火灾蔓延数学模型

生命游戏 - CodeBus 

// 生命游戏学习#include <easyx/easyx.h>
#include <conio.h>
#include <time.h>int world[102][102];								// 二维世界,每个格子是一个细胞
IMAGE imgLive, imgEmpty;// 方形世界
void SquareWorld() {memset(world, 0, 102 * 102 * sizeof(int));		// 分配内存for (int i = 1; i <= 100; i++) {world[i][1] = world[i][100] = 1;}for (int j = 1; j <= 100; j++) {world[1][j] = world[100][j] = 1;}
}
// 设置界面
void Init() {initgraph(640, 480);srand((unsigned)time(NULL));		// 设置随机种子Resize(&imgLive, 4, 4);				// 一个格子放置一个细胞,一个细胞占4像素Resize(&imgEmpty, 4, 4);SetWorkingImage(&imgLive);			// 在imgLive上绘制setfillcolor(GREEN);fillellipse(0, 0, 3, 3);			// 给格子涂色SetWorkingImage(&imgEmpty);			// 在imgEmpty上绘制setfillcolor(DARKGRAY);rectangle(1, 1, 2, 2);				// 给格子涂色SetWorkingImage();SquareWorld();						// 产生默认的细胞以方形分布的世界
}
// 绘制世界
void PaintWorld() {for (int i = 1; i <= 100; i++)for (int j = 1; j <= 100; j++)putimage(16 + j * 4, 56 + i * 4, world[i][j] == 1 ? &imgLive : &imgEmpty);		// 格子是1,就房子imgLive,否则就贴图贴入imgEmpty
}// 进化
void Evolution() {int tmp[102][102]={0};			// 临时数组  一定要初始化为0,否则会图像不对称,因为有数据残留int sum;						// 九宫格中的活细胞格个数for (int i = 1; i <= 100; i++) {				//	一个细胞在下一个时刻的生死取决于相邻八个方格中的活细胞数量,for (int j = 1; j <= 100; j++) {sum = world[i - 1][j - 1] + world[i - 1][j + 0] + world[i - 1][j + 1] +			// 序号与排版对应,i-1就是上一行,j-1就是最左列,world[i + 0][j - 1] +						+ world[i + 0][j + 1] +			// i是本行,j是本列world[i + 1][j - 1] + world[i + 1][j + 0] + world[i + 1][j + 1];			// i+1是下一行,j+1是最右列switch (sum) {case 3:tmp[i][j] = 1;					// 若周围有 3 个活细胞,则该方格产生一个活细胞(模拟繁殖)break;case 2:tmp[i][j] = world[i][j];		// 若周围有 2 个或 3 个活细胞,保持原样。break;default:tmp [i][j] = 0;					// 若周围少于 2 个活细胞,则该方格的细胞死亡(模拟人口稀疏),若周围多于 3 个活细胞,则该方格的细胞死亡(模拟极度拥挤)break;}}}// tmp 产生原因:隔断新旧世界数据// 因为 sum 需要的是旧世界周围的数据,如果直接更新,导致旧世界数据不知,直接拿新世界的数据采样,结果更不可理解,于是使用 tmp 数组记录// 将临时数组恢复为世界memcpy(world, tmp, 102 * 102 * sizeof(int));	// 就是复制粘贴,主要是int 而不是 __int8
}int main() {Init();int speed = 10;									// 游戏刷新速度10毫秒while (1) {Evolution();PaintWorld();Sleep(speed);}return 0;
}

 

// 联系方式 b站 民用级脑的研发记录
// 细胞自动机森林火灾模型演示,
// 开发环境 小熊猫c++ 2.25.1 
// 基于 //https://blog.csdn.net/weixin_43524214/article/details/105099165
// 使用 easyx 图形库
#include <stdio.h>
#include <stdlib.h>
#include <easyx/graphics.h>
#include <time.h>
#include <math.h>// 定义树木状态,给数字贴上意义,用于快速理解代码
#define no_tree 0
#define burning 2
#define nor_tree 1#define WIDTH 600		// 宽度
#define HEIGHT 600		// 高度
#define treeSize 4		// 树木大小
#define treeNum 150		// 树木个数
#define Row 150			// 150 行
#define Col 150			// 150 列
#define burning_rate	0.0001			// 初始燃烧概率0.01%
#define proTree_rate	0.02			// 空地长出新的树木的概率:10%
#define unsafe_rate		0.00005			// 新长出树木又失火的概率 0,0005%
#define N 10000/*
演化规则如下:
(1)若某树木元胞的4个邻居中有燃烧着的,那么该元胞下一时刻的状态是燃烧;
(2)一个燃烧着的元胞,在下一时刻变成空位;
(3)所有树木元胞(状态为2)以一个低概率开始燃烧(模拟闪电造成森林火灾);
(4)所有空位元胞以一个低概率变为树木(模拟新树木的生长)。
*/int treeState_Matrix[treeNum][treeNum];	// 树木格子,一个格子就是一棵树struct POS {int x;int y;
};// 画边界,画黑色线
void InitBoard() {setlinecolor(RGB(0, 0, 0));					// 黑线for (int i = 0; i < treeNum; i++) {			// 每个格子横纵线line(0, i * treeSize, WIDTH, i * treeSize);line(i * treeSize, 0, i * treeSize, HEIGHT);}
}
// 随机产生树木
void InitTree(int treeState_Matrix[treeNum][treeNum]) {int i, j, count = 0;float randVal;													// 记录概率for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {randVal = rand() % (N + 1) / (float)(N + 1);			// % 取余数用于获取小于N+1的数字,(float)强制转换为小数,解决整数除整数只取商的默认情况导致的数据为0问题。if (randVal >= 0.40) {									// 随机数大于0.40,就生成树木,格子里记录为1treeState_Matrix[i][j] = 1;							// [i][j]代表当前树木的行列count++;} else {treeState_Matrix[i][j] = 0;							// 随机数小,就没有树}}}
}// 画树,就是从数字数组到图片的查找过程
void drawTree(int treeState_Matrix[treeNum][treeNum]) {int i, j;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {				// 没燃烧的树是 1setfillcolor(RGB(0, 255, 0));					// 绿色} else if (treeState_Matrix[i][j] == 2) {				// 燃烧的树木记录为2setfillcolor(RGB(255, 0, 0));					// 红色} else {setfillcolor(RGB(0, 0, 0));					// 记录为0就是没有树,用黑色填空}fillrectangle(j * treeSize, i * treeSize, j * treeSize + treeSize, i * treeSize + treeSize);			// 数组 i 选择哪一行,就是控制选择高度 j 对应哪一列,就是对应宽 x坐标}}
}// 随机一个燃烧位置,同随机产生树木
void InitRandTreePos() {int i, j, count = 0;float randVal;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < burning_rate) {treeState_Matrix[i][j] = 2;				// 树木网格里第i行第j列记录为2,对应红色,着火count++;}}}}printf("着了%d 棵树\n", count);
}
// 检查随机数,随机小于就着火
int isRight(float state) {float randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < state) {return 1;}return 0;
}// 根据旧网格存储新网格数据
void getNextTreeState(int treeState_Matrix[treeNum][treeNum]) {int meshv2[treeNum][treeNum] = {0};int i, j, state = 0;for (i = 0; i < treeNum; i++) {for (j = 0; j < treeNum; j++) {state = treeState_Matrix[i][j];if (state == 1) {								// 检查上下左右if (0 ||									(treeState_Matrix[i - 1][j - 0] == 2) ||(treeState_Matrix[i - 0][j - 1] == 2) ||										(treeState_Matrix[i + 0][j + 1] == 2) ||0 ||									 (treeState_Matrix[i + 1][j + 0] == 2)) {meshv2[i][j] = 2;						// 于是被其他着火的树木点着}else{meshv2[i][j]=1;							// 否则不着火}} else if (state == 2) {								// 现在着火,下次就空meshv2[i][j] = 0;} else if (state == 0) {								// 是空的就看看会不会长树if (isRight(proTree_rate)) {						// 小于概率就长树木meshv2[i][j] = 1;}if (isRight(unsafe_rate)) {					// 新的树木再着火概率meshv2[i][j] = 2;}}}}memcpy(treeState_Matrix, meshv2, treeNum* treeNum* sizeof(int));
}//主函数:程序入口
int main(int args, char* argv) {initgraph(WIDTH, HEIGHT, SHOWCONSOLE);				//初始化窗体:500*500HWND hwnd = GetHWnd();								//获取窗体句柄SetWindowText(hwnd, _T("林森火灾模拟"));				//设置窗体标题SetWindowPos(hwnd, NULL, 600, 200, HEIGHT, WIDTH, 0);//设置窗体位置//1、初始化网格布局InitBoard();srand((int)time(NULL));								//随机数种子//2、初始化数目状态矩阵InitTree(treeState_Matrix);//3、绘制树木drawTree(treeState_Matrix);//4、初始化燃烧树木的位置InitRandTreePos();//5、绘制森林-树木drawTree(treeState_Matrix);//开启批量绘图模式BeginBatchDraw();while (true) { //进入循环迭代//6、获取下一时刻的树木状态矩阵getNextTreeState(treeState_Matrix);//7、仍然有可能产生新的火源
//		burn_again();									// 被整合进getNextTreeState//8、重新绘制森林-树木drawTree(treeState_Matrix);//显示绘图结果FlushBatchDraw(); // 显示绘制//停顿0.001sSleep(1);
//		printf("ok\n");}EndBatchDraw();										//结束批量绘图模式closegraph();										//关闭设备窗口return 0;
}

getNextTreeState 微调参数

右边着火比左边快,往左跑

// 联系方式 b站 民用级脑的研发记录
// 细胞自动机森林火灾模型演示,
// 开发环境 小熊猫c++ 2.25.1 
// 基于 //https://blog.csdn.net/weixin_43524214/article/details/105099165
// 使用 easyx 图形库
#include <stdio.h>
#include <stdlib.h>
#include <easyx/graphics.h>
#include <time.h>
#include <math.h>// 定义树木状态,给数字贴上意义,用于快速理解代码
#define no_tree 0
#define burning 2
#define nor_tree 1#define WIDTH 600		// 宽度
#define HEIGHT 600		// 高度
#define treeSize 4		// 树木大小
#define treeNum 150		// 树木个数
#define Row 150			// 150 行
#define Col 150			// 150 列
#define burning_rate	0.0001			// 初始燃烧概率0.01%
#define proTree_rate	0.02			// 空地长出新的树木的概率:10%
#define unsafe_rate		0.00005			// 新长出树木又失火的概率 0,0005%
#define N 10000/*
演化规则如下:
(1)若某树木元胞的4个邻居中有燃烧着的,那么该元胞下一时刻的状态是燃烧;
(2)一个燃烧着的元胞,在下一时刻变成空位;
(3)所有树木元胞(状态为2)以一个低概率开始燃烧(模拟闪电造成森林火灾);
(4)所有空位元胞以一个低概率变为树木(模拟新树木的生长)。
*/int treeState_Matrix[treeNum][treeNum];	// 树木格子,一个格子就是一棵树struct POS {int x;int y;
};// 画边界,画黑色线
void InitBoard() {setlinecolor(RGB(0, 0, 0));					// 黑线for (int i = 0; i < treeNum; i++) {			// 每个格子横纵线line(0, i * treeSize, WIDTH, i * treeSize);line(i * treeSize, 0, i * treeSize, HEIGHT);}
}
// 随机产生树木
void InitTree(int treeState_Matrix[treeNum][treeNum]) {int i, j, count = 0;float randVal;													// 记录概率for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {randVal = rand() % (N + 1) / (float)(N + 1);			// % 取余数用于获取小于N+1的数字,(float)强制转换为小数,解决整数除整数只取商的默认情况导致的数据为0问题。if (randVal >= 0.40) {									// 随机数大于0.40,就生成树木,格子里记录为1treeState_Matrix[i][j] = 1;							// [i][j]代表当前树木的行列count++;} else {treeState_Matrix[i][j] = 0;							// 随机数小,就没有树}}}
}// 画树,就是从数字数组到图片的查找过程
void drawTree(int treeState_Matrix[treeNum][treeNum]) {int i, j;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {				// 没燃烧的树是 1setfillcolor(RGB(0, 255, 0));					// 绿色} else if (treeState_Matrix[i][j] == 2) {				// 燃烧的树木记录为2setfillcolor(RGB(255, 0, 0));					// 红色} else {setfillcolor(RGB(0, 0, 0));					// 记录为0就是没有树,用黑色填空}fillrectangle(j * treeSize, i * treeSize, j * treeSize + treeSize, i * treeSize + treeSize);			// 数组 i 选择哪一行,就是控制选择高度 j 对应哪一列,就是对应宽 x坐标}}
}// 随机一个燃烧位置,同随机产生树木
void InitRandTreePos() {int i, j, count = 0;float randVal;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < burning_rate) {treeState_Matrix[i][j] = 2;				// 树木网格里第i行第j列记录为2,对应红色,着火count++;}}}}printf("着了%d 棵树\n", count);
}
// 检查随机数,随机小于就着火
int isRight(float state) {float randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < state) {return 1;}return 0;
}//参数调整自 https://blog.51cto.com/u_15458165/4807865
// 根据旧网格存储新网格数据
void getNextTreeState(int treeState_Matrix[treeNum][treeNum]) {int meshv2[treeNum][treeNum] = {0};int i, j, state = 0;for (i = 0; i < treeNum; i++) {for (j = 0; j < treeNum; j++) {state = treeState_Matrix[i][j];if (state == 1) {								// 检查上下左右if (0 ||									(treeState_Matrix[i - 1][j - 0] == 2) ||(treeState_Matrix[i - 0][j - 1] == 2) ||										(treeState_Matrix[i + 0][j + 1] == 2) ||(treeState_Matrix[i+0][j+2]==2)||		// 右边火势大,隔两个也能着火,于是往左跑的快0 ||									 (treeState_Matrix[i + 1][j + 0] == 2)) {meshv2[i][j] = 2;						// 于是被其他着火的树木点着}else{meshv2[i][j]=1;							// 否则不着火}} else if (state == 2) {								// 现在着火,下次就空meshv2[i][j] = 0;} else if (state == 0) {								// 是空的就看看会不会长树if (isRight(proTree_rate)) {						// 小于概率就长树木meshv2[i][j] = 1;}if (isRight(unsafe_rate)) {					// 新的树木再着火概率meshv2[i][j] = 2;}}}}memcpy(treeState_Matrix, meshv2, treeNum* treeNum* sizeof(int));
}//主函数:程序入口
int main(int args, char* argv) {initgraph(WIDTH, HEIGHT, SHOWCONSOLE);				//初始化窗体:500*500HWND hwnd = GetHWnd();								//获取窗体句柄SetWindowText(hwnd, _T("林森火灾模拟"));				//设置窗体标题SetWindowPos(hwnd, NULL, 600, 200, HEIGHT, WIDTH, 0);//设置窗体位置//1、初始化网格布局InitBoard();srand((int)time(NULL));								//随机数种子//2、初始化数目状态矩阵InitTree(treeState_Matrix);//3、绘制树木drawTree(treeState_Matrix);//4、初始化燃烧树木的位置InitRandTreePos();//5、绘制森林-树木drawTree(treeState_Matrix);//开启批量绘图模式BeginBatchDraw();while (true) { //进入循环迭代//6、获取下一时刻的树木状态矩阵getNextTreeState(treeState_Matrix);//7、仍然有可能产生新的火源
//		burn_again();									// 被整合进getNextTreeState//8、重新绘制森林-树木drawTree(treeState_Matrix);//显示绘图结果FlushBatchDraw(); // 显示绘制//停顿0.001sSleep(1);
//		printf("ok\n");}EndBatchDraw();										//结束批量绘图模式closegraph();										//关闭设备窗口return 0;
}

getNextTreeState 微调参数

往下吹风

// 联系方式 b站 民用级脑的研发记录
// 细胞自动机森林火灾模型演示,
// 开发环境 小熊猫c++ 2.25.1 
// 基于 //https://blog.csdn.net/weixin_43524214/article/details/105099165
// 使用 easyx 图形库
#include <stdio.h>
#include <stdlib.h>
#include <easyx/graphics.h>
#include <time.h>
#include <math.h>// 定义树木状态,给数字贴上意义,用于快速理解代码
#define no_tree 0
#define burning 2
#define nor_tree 1#define WIDTH 600		// 宽度
#define HEIGHT 600		// 高度
#define treeSize 4		// 树木大小
#define treeNum 150		// 树木个数
#define Row 150			// 150 行
#define Col 150			// 150 列
#define burning_rate	0.0001			// 初始燃烧概率0.01%
#define proTree_rate	0.02			// 空地长出新的树木的概率:10%
#define unsafe_rate		0.00005			// 新长出树木又失火的概率 0,0005%
#define N 10000/*
演化规则如下:
(1)若某树木元胞的4个邻居中有燃烧着的,那么该元胞下一时刻的状态是燃烧;
(2)一个燃烧着的元胞,在下一时刻变成空位;
(3)所有树木元胞(状态为2)以一个低概率开始燃烧(模拟闪电造成森林火灾);
(4)所有空位元胞以一个低概率变为树木(模拟新树木的生长)。
*/int treeState_Matrix[treeNum][treeNum];	// 树木格子,一个格子就是一棵树struct POS {int x;int y;
};// 画边界,画黑色线
void InitBoard() {setlinecolor(RGB(0, 0, 0));					// 黑线for (int i = 0; i < treeNum; i++) {			// 每个格子横纵线line(0, i * treeSize, WIDTH, i * treeSize);line(i * treeSize, 0, i * treeSize, HEIGHT);}
}
// 随机产生树木
void InitTree(int treeState_Matrix[treeNum][treeNum]) {int i, j, count = 0;float randVal;													// 记录概率for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {randVal = rand() % (N + 1) / (float)(N + 1);			// % 取余数用于获取小于N+1的数字,(float)强制转换为小数,解决整数除整数只取商的默认情况导致的数据为0问题。if (randVal >= 0.40) {									// 随机数大于0.40,就生成树木,格子里记录为1treeState_Matrix[i][j] = 1;							// [i][j]代表当前树木的行列count++;} else {treeState_Matrix[i][j] = 0;							// 随机数小,就没有树}}}
}// 画树,就是从数字数组到图片的查找过程
void drawTree(int treeState_Matrix[treeNum][treeNum]) {int i, j;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {				// 没燃烧的树是 1setfillcolor(RGB(0, 255, 0));					// 绿色} else if (treeState_Matrix[i][j] == 2) {				// 燃烧的树木记录为2setfillcolor(RGB(255, 0, 0));					// 红色} else {setfillcolor(RGB(0, 0, 0));					// 记录为0就是没有树,用黑色填空}fillrectangle(j * treeSize, i * treeSize, j * treeSize + treeSize, i * treeSize + treeSize);			// 数组 i 选择哪一行,就是控制选择高度 j 对应哪一列,就是对应宽 x坐标}}
}// 随机一个燃烧位置,同随机产生树木
void InitRandTreePos() {int i, j, count = 0;float randVal;for (i = 0; i < Row; i++) {for (j = 0; j < Col; j++) {if (treeState_Matrix[i][j] == 1) {randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < burning_rate) {treeState_Matrix[i][j] = 2;				// 树木网格里第i行第j列记录为2,对应红色,着火count++;}}}}printf("着了%d 棵树\n", count);
}
// 检查随机数,随机小于就着火
int isRight(float state) {float randVal = rand() % (N + 1) / (float)(N + 1);if (randVal < state) {return 1;}return 0;
}// 根据旧网格存储新网格数据
void getNextTreeState(int treeState_Matrix[treeNum][treeNum]) {int meshv2[treeNum][treeNum] = {0};int i, j, state = 0;for (i = 0; i < treeNum; i++) {for (j = 0; j < treeNum; j++) {state = treeState_Matrix[i][j];if (state == 1) {								// 检查上下左右if (0 ||									(treeState_Matrix[i - 1][j - 0] == 2) ||(treeState_Matrix[i - 0][j - 1] == 2) ||										(treeState_Matrix[i + 0][j + 1] == 2) ||0			// 模拟往下吹风情况,因为上面的着火树,下面着火,下面着火,上面不一定着火,吹不上去,风是往下吹
//					0 ||									 (treeState_Matrix[i + 1][j + 0] == 2)) {meshv2[i][j] = 2;						// 于是被其他着火的树木点着}else{meshv2[i][j]=1;							// 否则不着火}} else if (state == 2) {								// 现在着火,下次就空meshv2[i][j] = 0;} else if (state == 0) {								// 是空的就看看会不会长树if (isRight(proTree_rate)) {						// 小于概率就长树木meshv2[i][j] = 1;}if (isRight(unsafe_rate)) {					// 新的树木再着火概率meshv2[i][j] = 2;}}}}memcpy(treeState_Matrix, meshv2, treeNum* treeNum* sizeof(int));
}//主函数:程序入口
int main(int args, char* argv) {initgraph(WIDTH, HEIGHT, SHOWCONSOLE);				//初始化窗体:500*500HWND hwnd = GetHWnd();								//获取窗体句柄SetWindowText(hwnd, _T("林森火灾模拟"));				//设置窗体标题SetWindowPos(hwnd, NULL, 600, 200, HEIGHT, WIDTH, 0);//设置窗体位置//1、初始化网格布局InitBoard();srand((int)time(NULL));								//随机数种子//2、初始化数目状态矩阵InitTree(treeState_Matrix);//3、绘制树木drawTree(treeState_Matrix);//4、初始化燃烧树木的位置InitRandTreePos();//5、绘制森林-树木drawTree(treeState_Matrix);//开启批量绘图模式BeginBatchDraw();while (true) { //进入循环迭代//6、获取下一时刻的树木状态矩阵getNextTreeState(treeState_Matrix);//7、仍然有可能产生新的火源
//		burn_again();									// 被整合进getNextTreeState//8、重新绘制森林-树木drawTree(treeState_Matrix);//显示绘图结果FlushBatchDraw(); // 显示绘制//停顿0.001sSleep(1);
//		printf("ok\n");}EndBatchDraw();										//结束批量绘图模式closegraph();										//关闭设备窗口return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客】【模板】二维前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和&#xff1a;pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. &#x1f981; 写在前面二. &#x1f981; 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. &#x1f981; 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. &#x1f981; 使用感受 一. &#x1f981; 写在前面 现在互联网体系越来越往云…

记录PR学习查漏补缺(持续补充中。。。)

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器轨道遮罩键 常用 快捷键 注意&#xff1a;比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入…

JRT失控处理打印和演示

基于JRT完备的脚本化和打印基础&#xff0c;基于JRT的业务可以轻松的实现想要的打效果&#xff0c;这次以质控图的失控处理打印和月报打印来分享基于JRT的打印业务实现。 演示视频链接 失控报告打印 失控处理打印的虚拟M import JRT.Core.DataGrid.GridDto; import JRT.Co…

Konga域名配置多个路由

云原生API网关-Kong部署与konga基本使用 Nginx server{listen 443 ssl;location / {proxy_pass http://127.0.0.1:8100;}location /openApi {proxy_pass http://172.31.233.35:7100/openApi;} } Kong {"id": "f880b21c-f7e0-43d7-a2a9-221fe86d9231&q…

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…

Nest.js中使用任务调度

java中的xxl在nestJs中是有内置的任务调度nestjs/schedule npm install --save nestjs/schedule 在model中引入使用 在service中直接使用就行 具体间隔多久看官方配置 Task Scheduling | NestJS 中文文档 | NestJS 中文网

微信小程序开发-数据事件绑定

&#x1f433;简介 数据绑定 数据绑定是一种将小程序中的数据与页面元素关联起来的技术&#xff0c;使得当数据变化时&#xff0c;页面元素能够自动更新。这通常使用特定的语法&#xff08;如双大括号 {{ }}&#xff09;来实现&#xff0c;以便在页面上展示动态数据。 事件绑…

小微公司可用的开源ERP系统

项目介绍 华夏ERP是基于SpringBoot框架和SaaS模式的企业资源规划&#xff08;ERP&#xff09;软件&#xff0c;旨在为中小企业提供开源且易用的ERP解决方案。它专注于提供进销存、财务和生产功能&#xff0c;涵盖了零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询…

VALSE 2024 Workshop报告分享┆ 大规模自动驾驶仿真系统研究

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;旨在为从事计算机视觉、图像处理、模式识别与机器学习研究的中国青年学者提供一个广泛而深入的学术交流平台。该平台旨在促进国内青年学者的思想交流和学术合作&#xff0c;以期在相关领域做出显著的学术贡献&#xff0c…

【三】DRF序列化进阶

序列化器的定义与使用 多表关联序列化 【1】准备工作 # settings.py DATABASES {default: {# 数据库引擎选择使用MySQLENGINE: django.db.backends.mysql,# 指定数据库名字&#xff0c;需提前创建NAME: books,# 指定数据库用户名USER: root,# 指定数据库用户密码PASSWORD: …

嵌入式学习69-C++(Opencv)

知识零碎&#xff1a; QT的两种编译模式 1.debug 调试模式 …

时序图详解

1.这是iic总线在回应时候的时序图&#xff0c;data in代表eeprom收到数据&#xff0c;回stm32的ack&#xff0c;数据回应&#xff0c;data out代表stm32收到eeprom的消息&#xff0c;数据输出ack回应 2.交叉线 代表在这一次输出高电平&#xff0c;或者在这一次也可能输出低电…

【bash】笔记

在Shell脚本中&#xff0c;-e 是一个测试运算符&#xff0c;用于检查给定的文件或目录是否存在。 | 是通道符&#xff0c;会把前面的输出给后面作为输入。 sudo tee命令在这里用于同时更新文件和在终端显示输出&#xff08;尽管 > /dev/null 将标准输出重定向到黑洞&…

ai智能答题助手,这四款软件让知识触手可及!

在数字化时代&#xff0c;知识的获取变得前所未有的便捷。随着人工智能技术的不断发展&#xff0c;AI智能答题助手应运而生&#xff0c;成为了人们学习、工作和生活中的得力助手。今天&#xff0c;就为大家介绍四款备受欢迎的AI智能答题助手软件&#xff0c;让你感受知识的魅力…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日&#xff0c;备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天&#xff0c;真的攒足了眼球&#xff0c;不仅俄罗斯这边的很多媒体和自媒体有报道&#xff0c;展会第一天&#xff0c;很多参展商通过短视频平台将展会的盛况传到了国内&#…

libcity/model/trajectory_loc_prediction/DeepMove.py

1 DeepMove 1.1 构造函数 1.2 初始化权重 1.3 forward 1.4 predict def predict(self, batch):score self.forward(batch)if self.evaluate_method sample:# build pos_neg_inedxpos_neg_index torch.cat((batch[target].unsqueeze(1), batch[neg_loc]), dim1)score tor…

在思科和华为上实现两个主机A,B A能ping通B,B不能ping通A

1.华为实验的topo如下 常规状态下任意两台主机都是可以ping通的 此时的需求是PC4能ping通PC2和PC3但是PC2和PC3不能ping通PC4 这里需要用到ACL策略 在接口上调用 验证&#xff1a; PC4能ping通PC2和PC3 PC2和PC3不能ping通PC4 2.思科类似 正常情况下是都能互相ping通 加上ac…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…

【idea-sprongboot项目】在linux服务器上纯远程开发方式

继上一篇博客【idea-sprongboot项目】SSH连接云服务器进行远程开发-CSDN博客 目录 五、远程开发方式 2&#xff09;纯远程开发方式 步骤 五、远程开发方式 2&#xff09;纯远程开发方式 实现原理&#xff0c; 步骤 &#xff08;1&#xff09;首先&#xff0c;关闭当前正在…