EASYX实现多物体运动

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.mfbz.cn/a/112905.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

API接口的定义|电商API接口的接入测试和参数说明【附代码实例教程】

一 . API接口的定义 API全称Application Programming Interface&#xff0c;即应用程序编程接口&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定&#xff0c;用于传输数据和指令&#xff0c;使应用程序之间可以集成和共享数据资源。 简单来…

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View&#xff0c;Kotlin&#xff08;4&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import a…

Jetson NX FFmpeg硬件编解码实现

最近在用Jetson Xavier NX板子做视频处理&#xff0c;但是CPU进行视频编解码&#xff0c;效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看&#xff0c;发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改&#xff0c;因此需…

无需服务器内网穿透Windows下快速搭建个人WEB项目

&#x1f4d1;前言 本文主要是windows下内网穿透文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ 参考自&#xff1a;Windows搭建web站点&#xff1a;免费内网穿透发布至公网 &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首…

Java算法:二分查找

一、 二分查找注意 前提是数组必须是有序的&#xff0c;否则无法正常工作。如果数组不是有序的&#xff0c;需要先对数组进行排序&#xff0c;然后才能使用二分查找算法。 二、二分查找高效算法 二分查找也称为折半查找&#xff0c;是一种在有序数组中查找目标元素的算法。它的…

【嵌入式开发学习02】esp32cam烧录human_face_detect实现人脸识别

Ubuntu20.04系统为esp32cam烧录human_face_detect 1. 下载esp-dl2. 安装esp-idf3. 烧录human_face_detect 如果使用ubuntu 16.04在后续的步骤中会报错如下&#xff0c;因为ubuntu 16.04不支持glibc2.23以上的版本&#xff08;可使用strings /lib/x86_64-linux-gnu/libc.so.6 | …

护眼灯有没有护眼的效果?适合学生儿童的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;大家一定要看完本期内容。为大家推荐最热门的五款护眼台灯。 1…

HTML、CSS和JavaScript,实现换肤效果的原理

这篇涉及到HTML DOM的节点类型、节点层级关系、DOM对象的继承关系、操作DOM节点和HTML元素 还用到HTML5的本地存储技术。 换肤效果的原理&#xff1a;是在选择某种皮肤样式之后&#xff0c;通过JavaScript脚本来加载选中的样式&#xff0c;再通过localStorage存储。 先来回忆…

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…

CRM系统数据库是如何影响客户体验的?

CRM客户关系管理由概念到软件实体&#xff0c;已经有几十年的时间&#xff0c;随着信息技术的进步&#xff0c;数字化让CRM软件乘上快车&#xff0c;迅速成为各类企业的数字化管理工具。CRM客户管理系统的一个重要功能便是改善并提升客户体验&#xff0c;且CRM数据库是与客户体…

【笔记】excel怎么把汉字转换成拼音

1、准备好excel文件&#xff0c;复制需要转拼音列。 2、打开一个空白Word文档&#xff0c;并粘贴刚才复制的内容&#xff1b; 3、全选Word文档中刚粘贴的内容&#xff0c;点击「开始」选项卡「字体」命令组下的「拼音指南」&#xff0c;调出拼音指南对话框&#xff1b; 4、全…

如何调整职场心态,提高工作表现

文章目录 介绍职场分析对比历年职场需求开发者地域分布开发者工作状态职场晋升之路 职场经验控制情绪保持好奇心提升核心能力 职场转行结论 介绍 职场中的心态调整对于我们在工作中表现的影响非常重要。作为一名全栈开发者&#xff0c;我深知在 AI 算法和云技能领域工作的挑战…

【生物信息学】单细胞RNA测序数据分析:计算亲和力矩阵(基于距离、皮尔逊相关系数)及绘制热图(Heatmap)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 读取数据集2. 质量控制&#xff08;可选&#xff09;3. 基于距离的亲和力矩阵4. 绘制基因表达的Heatmap5. 基于皮尔逊相关系数的亲和力矩阵6. 代码整合 一、实验介绍 计算亲和力…

云服务器 centos 部署 code-server 并配置 c/c++ 环境

将你的云服务器改为 centos 8 为什么要将云服务器的操作系统改成 centos 8 呢&#xff1f;原因就是 centos 7 里面的配置满足不了 code-server 的需求。如果你使用的是 centos 7 那么就需要你升级一些东西&#xff0c;这个过程比较麻烦。我在 centos 7 上面运行 code-server 的…

[学习笔记]python绘制图中图(绘制站点分布图)

背景 在绘制站点分布图时&#xff0c;有时需要采用图中图的方式&#xff0c;以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本&#xff0c;方便然后查询。 包含数据 该绘图脚本中包含以下数据&#xff1a; CMONOC站点分布&#xff…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…

pytorch复现4_Resnet

ResNet在《Deep Residual Learning for Image Recognition》论文中提出&#xff0c;是在CVPR 2016发表的一种影响深远的网络模型&#xff0c;由何凯明大神团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。Image…

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口&#xff0c;目前大多数的设备都是USB接口的&#xff0c;比如鼠标、键盘、USB摄像 头等&#xff0c;在实际开发中也常常遇到USB接口的设备&#xff0c;本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…

常用sql语句

/*表操作*/ drop table order; create table products( product_no integer primary key default 1, name text, price numeric default 9.99 ); create table orders ( order_id integer primary key default 1, product_no int, quantity integer ); create table order_…

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data

论文作者&#xff1a;Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位&#xff1a;Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接&#xff1a;http://arxiv.org/abs/2310.16835v1 内容…
最新文章