EASYX实现多物体运动

news2024/11/24 4:25:10

eg1:单个物体运动使用easyx实现单个小球的运动

#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 清除画布
	cleardevice();
	// 定义一个int类型的圆心坐标
	int x = 0; int y = 0;
	// 小球在x 和 y方向上的速度分量
	int vx = 5; int vy = 5;
	// 小球的半径
	int r = 20;
	// 通过while循环不断的重新绘制小球
	while (1) {
	  // 清除一次画布
		cleardevice();
		// 以原点坐标为x,y然后半径为R不断的绘制小球
		solidcircle(x, y, r);
	    // 每次绘制一次休眠40毫秒
		Sleep(40);
		//  表示小球碰到或者越过上下边界后反弹
		if (y >= 300 - r || y <= -300 + r) {
			vy = -vy; // 表示的是不能操过画布规定的空间大小
		}
		if (x <= -400 + r || x >= 400 - r) {
			vx = -vx; // 表示的是不能操过画布规定的空间大小
		}
		// 在每次绘制后小球的圆心需要增加vx 或者是vy像素
		x += vx;
		y += vy;
	}


	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

eg2:多个小球的不规则运动

#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000
// 结构体的定义,定义每一个小球需要使用到的分量
typedef struct {
	// 小球圆心的x y 坐标
	int x;
	int y;
	// 小球x y方向上的速度分量
	int vx;
	int vy;
	// 小球的颜色,应该区随机值
	COLORREF color;
}ball;


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	/*
	 	创建结构类型的数据,编写程序的过程中要避免声明自动类型的数据,
		自动类型的数组数据是存放在程序的运行栈中的内存的为程序的运行栈空间较小
		对此可以使用malloc函数向栈中申请内存空间,栈中的空间较大可以有效的避免数组
		存储空间不够的问题
	*/ 
	// ball balls[NUM_OF_BALLS];
	int r = 10;
	ball* balls = (ball*)malloc(sizeof(ball) * NUM_OF_BALLS);
	if (balls == NULL) {
		return -1;

	}
	for (int i = 0; i < NUM_OF_BALLS; i++) {
		// 随机值得区间范围
		int m, n;
		//计算圆心X的随机值x范围在【-400 + r, 400- r】
		m = -400 + r;
		n = 400 - r;
		balls[i].x = rand() % (n - m + 1) + m;
		// 计算圆心Y的随机值Y的范围在【-300 + 5 , 300-r】
		m = -300 + r;
		n = 300 - r;
		balls[i].y = rand() % (n - m + 1) + m;

		//计算小球的颜色随机值,色相范围在[0,359]之间
		balls[i].color = HSVtoRGB(float(rand() % 360), 0.8f, 0.9f);
		// 计算小球的速度大小和速度方向的随机值
		m = 3;
		n = 8;
		int v = rand() % (n - m + 1) + m;
		double theta;
		theta = rand() % 360;
		balls[i].vx = v * cos(theta * PI / 180);
		balls[i].vy = v * sin(theta * PI / 180);
	}
	// 通过while循环不断的重新绘制小球
	while (1) {
	  // 清除一次画布
		cleardevice();
		// 绘制100个小球的代码
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			setfillcolor(balls[i].color);
			fillcircle(balls[i].x,balls[i].y, r);

		}
		Sleep(40);
		// 判断小球是否碰到边界,如果时就将小球反弹回来
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			if (balls[i].y >= 300 - r || balls[i].y <= -300 + r) {
				balls[i].vy = -balls[i].vy;
			}
			if (balls[i].x <= -400 + r || balls[i].x >= 400 - r) {
				balls[i].vx = -balls[i].vx;
			}
			// 移动小球的位置
			balls[i].x += balls[i].vx;
			balls[i].y += balls[i].vy;
 	   }

		
	}


	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;
}

在这里插入图片描述
eg3: 批量绘图

程序在屏幕上批量显示图像

1: 程序将图像放置在显示缓存区域中

2: 显卡将显示在缓存区中的数据绘制到屏幕

eg3:单次绘图和批量绘图演示

#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000



int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	

	// 使用一个简单的案例演示批量绘图
	solidcircle(-300, 0, 20);
	Sleep(1000);
	solidcircle(-200, 0, 20);
	Sleep(1000);
	solidcircle(-100, 0, 20);
	Sleep(1000);
	solidcircle(0, 0, 20);
	Sleep(1000);
	solidcircle(100, 0, 20);
	Sleep(1000);
	solidcircle(200, 0, 20);
	Sleep(1000);
	solidcircle(300, 0, 20);
	Sleep(1000);
	
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

在这里插入图片描述
使用代码对后面的四个圆形作为一个批次进行处理,前三个作为单次进行处理
函数BeginBatchDraw可以开启批量绘图模式,使用批量绘图后绘图操作将不会被送到显示缓存区,函数ENDBatchDraw可以结束批量绘图
在这里插入图片描述
具体代码如下所示:

#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000



int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	BeginBatchDraw();
	// 使用一个简单的案例演示批量绘图
	solidcircle(-300, 0, 20);
	Sleep(1000);
	solidcircle(-200, 0, 20);
	Sleep(1000);

	// 引入FlashBatchDraw函数
	FlushBatchDraw();
	
	solidcircle(-100, 0, 20);
	Sleep(1000);
	solidcircle(0, 0, 20);
	Sleep(1000);
	solidcircle(100, 0, 20);
	Sleep(1000);
	
	FlushBatchDraw();
	
	solidcircle(200, 0, 20);
	Sleep(1000);
	solidcircle(300, 0, 20);
	Sleep(1000);
	EndBatchDraw();
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

在这里插入图片描述

problem:解决画面闪烁问题
通过FlushBatchDraw和EndBatchDraw与BeginBatchDraw的方式解决画面闪烁并缓解显卡压力
在这里插入图片描述

#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000
// 结构体的定义,定义每一个小球需要使用到的分量
typedef struct {
	// 小球圆心的x y 坐标
	int x;
	int y;
	// 小球x y方向上的速度分量
	int vx;
	int vy;
	// 小球的颜色,应该区随机值
	COLORREF color;
}ball;


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	/*
		创建结构类型的数据,编写程序的过程中要避免声明自动类型的数据,
		自动类型的数组数据是存放在程序的运行栈中的内存的为程序的运行栈空间较小
		对此可以使用malloc函数向栈中申请内存空间,栈中的空间较大可以有效的避免数组
		存储空间不够的问题
	*/
	// ball balls[NUM_OF_BALLS];
	int r = 10;
	ball* balls = (ball*)malloc(sizeof(ball) * NUM_OF_BALLS);
	if (balls == NULL) {
		return -1;

	}
	for (int i = 0; i < NUM_OF_BALLS; i++) {
		// 随机值得区间范围
		int m, n;
		//计算圆心X的随机值x范围在【-400 + r, 400- r】
		m = -400 + r;
		n = 400 - r;
		balls[i].x = rand() % (n - m + 1) + m;
		// 计算圆心Y的随机值Y的范围在【-300 + 5 , 300-r】
		m = -300 + r;
		n = 300 - r;
		balls[i].y = rand() % (n - m + 1) + m;
	
		//计算小球的颜色随机值,色相范围在[0,359]之间
		balls[i].color = HSVtoRGB(float(rand() % 360), 0.8f, 0.9f);
		// 计算小球的速度大小和速度方向的随机值
		m = 3;
		n = 8;
		int v = rand() % (n - m + 1) + m;
		double theta;
		theta = rand() % 360;
		balls[i].vx = v * cos(theta * PI / 180);
		balls[i].vy = v * sin(theta * PI / 180);
	}
	// 通过while循环不断的重新绘制小球
	// 解决画面闪烁问题,在绘制循环开始前调用BeginBatchDraw函数开启批量绘图
	BeginBatchDraw();
	while (1) {
		// 清除一次画布
		cleardevice();
		// 绘制100个小球的代码
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			setfillcolor(balls[i].color);
			fillcircle(balls[i].x, balls[i].y, r);
	
		}
		// 当累积绘图达到1000个小球时,将当前累积的绘图作为一帧画面进行批量绘图
		FlushBatchDraw();
		Sleep(40);
		// 判断小球是否碰到边界,如果时就将小球反弹回来
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			if (balls[i].y >= 300 - r || balls[i].y <= -300 + r) {
				balls[i].vy = -balls[i].vy;
			}
			if (balls[i].x <= -400 + r || balls[i].x >= 400 - r) {
				balls[i].vx = -balls[i].vx;
			}
			// 移动小球的位置
			balls[i].x += balls[i].vx;
			balls[i].y += balls[i].vy;
		}
	
	}
	// 绘制循环结束调用EenBatchDraw()函数结束批量绘图
	EndBatchDraw();
	
	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

在这里插入图片描述

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

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

相关文章

应用在阀门控制中的直流有刷驱动芯片

控制阀又称阀门&#xff0c;是流体运送系统中的控制部件&#xff0c;具有导流、截流、调节、节流、防止倒流、分流或溢流卸压等功能。阀门是一种用于控制流体&#xff08;液体、气体、粉体等&#xff09;流动的装置&#xff0c;广泛应用于工业生产、建筑、农业、能源等领域。 …

提高效率!5个顶级网页开发工具助你事半功倍!

1.WordPress–一站式网站建设工具 价格&#xff1a;基本版终身免费&#xff0c;个人版HK$30&#xff0c;高级版HK$63&#xff0c;商务版HK$1993 推荐指数&#xff1a;★★★★ WordPress是一个使用PHP语言开发的博客平台。它可以在PHP和MySQL数据库的服务器上设置自己的网站&…

从项目开始学习Vue——01

目录标题 一、官方文档二、搭建环境三、停止服务四、使用 webstorm 一键创建项目创建过程可能出现错误 五、启动和访问项目&#xff08;一&#xff09;启动&#xff08;二&#xff09;访问项目六、项目目录讲解 一、官方文档 https://cn.vuejs.org/ 二、搭建环境 参考&#…

新版开源UI千月影视APP源码/后端基于ThinkPHP框架/前后端完美匹配

源码简介&#xff1a; 开源UI千月影视APP源码&#xff0c;它是基于ThinkPHP框架&#xff0c;而且前后端完美匹配。这是一个广泛使用的PHP开发框架&#xff0c;具有稳定性和安全性方面的优势。 2023版本UI千月影视APP是一款提供电影、电视剧、综艺节目等视频内容的应用程序&am…

如何使用ps制作ico图标文件

如何使用ps制作ico图标文件 Chapter1 如何使用ps制作ico图标文件Chapter2 ICOFormat.8bi&#xff08;Photoshop Ico、Cur插件&#xff09;的下载使用1. ICOFormat.8bi的作用2. ICOFormat.8bi使用 Chapter3 ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程步骤 01 制…

ArcGIS Pro怎么生成高程点

一般情况下&#xff0c;我们从公开渠道获取到的高程数据都是DEM数据&#xff0c;但是如果要用到CAD等软件内则需要用到高程点&#xff0c;那么如何从DEM提取高程点呢&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是…

Java中的继承和多态

目录 1. 继承 1.1 为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 1.6 子类构造方法 1.7 super和this 1.8 再谈初始化 1.9 protected 关键字 1.10 继承方式…

【ElasticSearch系列-03】ElasticSearch的高级句法查询Query DSL

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【二】ElasticSearch的高级查询Quer…

酷开系统丨酷开会员,让你畅享无限的娱乐乐趣

你是否厌倦一成不变的平凡生活&#xff0c;渴望寻找一些刺激和乐趣&#xff1f;那么&#xff0c;让我们一起走进酷开会员的世界&#xff0c;那里充满了无限的可能性和无尽的乐趣&#xff01;酷开系统为会员群体精心打造的娱乐平台&#xff0c;汇聚了众多热门影视、音乐、游戏直…

【功能更新】JVS源码级低代码:列表页组件、标签栏、多流程等等

在数字化时代&#xff0c;低代码平台已经成为企业快速搭建应用、提升开发效率的首选工具。为了满足广大用户不断增长的需求&#xff0c;我们持续努力&#xff0c;对JVS低代码平台进行了一系列重要的更新和优化。本次更新如下&#xff1a; 新增&#xff1a; 1、表单中新增列表…

lua-web-utils库

lua--导入所需的库local web_utilsrequire("lua-web-utils")--定义要下载的URLlocal url"https://jshk.com.cn/"--定义代理服务器的主机名和端口号local proxy_port8000--使用web_utils的download函数下载URLlocal file_pathweb_utils.download(url,proxy_…

【通关选择】upload-labs通关攻略(全)

前提条件&#xff1a; 1.文件能够成功上传到服务器 2.攻击者能够知道文件的上传路径 upload-labs靶场 Pass-01&#xff08; 前端验证&#xff09; 三种方法解决思路 1.禁用客户端JavaScript弹窗 2.通过burp抓包&#xff0c;修改后缀名 3.f12删除return filecheck&#xff0…

uniapp原生插件之安卓原生插件集

插件介绍 安卓原生插件集&#xff0c;集成了常用的插件&#xff0c;包括设备&#xff0c;语音、文件、屏幕、usb、TCP等等 插件地址 安卓原生插件集 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 使用文档 插件集成内容 腾讯Bugly插件汉字转…

【C/C++】仿函数

函数调用运算符 () 也可以重载由于重载后使用的方式非常像函数的调用&#xff0c;因此称为仿函数仿函数没有固定写法&#xff0c;非常灵活 示例&#xff1a; #include <iostream> #include <string> using namespace std;class MyPrint { public://重载的运算符是…

Redis安装Linux

1、下载安装包 wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2、安装 mkdir /usr/local/redis cp redis-3.0.0.tar.gz /usr/local/redis cd /usr/local/redis tar -zxvf redis-3.0.0.tar.gz cd /usr/local/redis/redis-3.0.0 make PREFIX/usr/local/red…

为什么大家更看好定制开发型CRM

相比传统CRM软件&#xff0c;定制开发型CRM受到了越来越多企业的青睐。为什么大家更看好定制开发类型而不是发挥更加稳定的传统CRM&#xff1f;选择定制型CRM软件主要有以下几个理由&#xff1a; 一、自选功能性价比更高 定制型软件可以选择性的购买功能模块&#xff0c;确保…

算法专栏 ---- trie树,并查集

trie树 #include <iostream> using namespace std; const int N 1000010; int son[N][26],cnt[N],idx; //明确前面两个数组以及idx的含义 //我们把son这个二维数组看成一个字典树 //本题要求26个字母&#xff0c;所以我们每个节点里面最多有26个儿子节点 //而我们本题要…

DL4J无法下载MNIST数据集解决 Server returned HTTP response code: 403 for URL解决方法

报错情况 报错如下&#xff1a; 16:45:41.463 [main] INFO org.nd4j.nativeblas.Nd4jBlas - Number of threads used for OpenMP BLAS: 6 16:45:41.497 [main] INFO org.nd4j.linalg.api.ops.executioner.DefaultOpExecutioner - Backend used: [CPU]; OS: [Windows 10] 16:4…

Sqlserver2012和Sqlserver2019数据库设置最大并行数解决数据库CPU高问题

请注意&#xff0c;最大并行数范围是0到CPU的实际逻辑核心数的最大值 SQL Server2019之前的版本&#xff0c;最大并行度默认值都是0&#xff0c;也就是无限制。SQL Server2019最大并行度默认值会根据CPU逻辑处理器数自动计算&#xff0c;如数值是8&#xff0c;那么也就是一个执…

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 …