RUST 编程语言 绘制随机颜色图片 画圆形 画矩形 画直线

什么是Rust

Rust是一种系统编程语言,旨在提供高性能和安全性。它是由Mozilla和其开发社区创建的开源语言,设计目标是在C++的应用场景中提供一种现代、可靠和高效的选择。Rust的目标是成为一种通用编程语言,能够处理各种计算任务,包括网络编程、并发编程、系统编程、WebAssembly等。

Rust的特点

1. 内存安全和高性能:Rust语言设计时优先考虑了内存安全和高性能。通过其独特的所有权系统和借用检查器,Rust可以确保在编译时捕获所有可能的内存错误,如悬挂指针和双重释放。这使得Rust能够在保持内存安全的同时,提供接近C++的性能。

2. 并发和多线程:Rust提供了一套强大的并发原语,使得编写并行和并发代码变得容易而安全。通过其所有权系统和生命周期系统,Rust可以防止数据竞争和其他并发问题,使得多线程编程更加可靠。

3. 编译型语言:Rust是一种编译型语言,这意味着它需要在编译时检查所有的类型错误和内存问题。这有助于在代码运行之前捕获潜在的错误,从而提高代码的可靠性。

4. 强大的社区支持:Rust拥有一个庞大而活跃的社区,为开发者提供了大量的资源和支持。无论是初学者还是经验丰富的开发者,都可以在社区中找到他们需要的资源和帮助。

5. 广泛的应用场景:Rust适用于各种应用场景,包括网络编程、并发编程、系统编程、WebAssembly等。此外,由于其优异的性能和安全性,Rust也被用于开发一些关键的基础设施项目。

Rust与其他语言的对比优势

1. 与C++相比:尽管C++是一种强大的系统编程语言,但它存在一些内存安全问题,如悬挂指针和双重释放。而Rust通过其所有权系统和借用检查器,可以避免这些内存错误,提供更高的安全性。此外,Rust的性能也非常接近C++,可以作为其可靠和高效的替代选择。

2. 与Go相比:Go是一种现代的并发编程语言,具有简洁的语法和强大的并发原语。然而,Go的并发模型是基于协程的,这使得编写复杂的并发代码变得困难。相比之下,Rust的并发模型更加灵活和强大,可以更好地处理并发问题。

3. 与Python/ target=_blank class=infotextkey>Python相比:Python是一种高级的动态类型语言,易于学习和使用。然而,Python的性能相对较低,且存在一些内存安全问题。对于需要高性能和安全性的应用场景,Rust可以作为一种更好的选择。

4. 与JAVA相比:Java是一种静态类型、面向对象的编程语言,具有强大的并发框架和卓越的性能。然而,Java在内存管理方面存在一些限制,如垃圾回收的停顿时间和对象分配的性能问题。相比之下,Rust提供了更好的内存安全性和性能,可以作为一种更好的选择。

总之,Rust是一种强大、安全和高性能的系统编程语言。通过其独特的所有权系统和并发模型,Rust为开发者提供了一种可靠和高效的解决方案,适用于各种应用场景。与C++、Go、Python和Java等其他语言相比,Rust在内存安全、性能和并发处理方面具有显著的优势。

首先,程序创建了一个事件循环event_loop和一个窗口window。接着,程序创建了一个图形上下文context和一个绘制表面surface。在事件循环中,程序通过匹配event来处理不同的事件。当窗口需要重绘时,程序首先获取窗口的尺寸,并调整绘制表面的尺寸。然后,程序使用一个循环来填充随机颜色到绘制表面的缓冲区中。接下来,程序绘制一条直线,将其颜色设置为白色。程序还绘制了一个圆形和一个矩形,并根据距离圆心或矩形边界的距离设置颜色。最后,程序将缓冲区呈现到绘制表面。这段代码是一个简单的图形绘制程序,它展示了如何使用Rust和相关库来创建图形界面应用程序。

需要新在工程目录 Cargo.toml 添加如下代码,配置工程和添加库

[package]
name = "test_draw"
version = "0.1.0"
edition = "2021"[dependencies]
softbuffer = "0.4.0"
winit = "0.29.7"

主要程序main.rs

use std::num::NonZeroU32;
use std::rc::Rc;
use winit::event::{Event, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoop};
use winit::window::WindowBuilder;
// 主函数,程序的入口点
fn main() {// 初始化事件循环let event_loop = EventLoop::new().unwrap();// 创建窗口let window = Rc::new(WindowBuilder::new().build(&event_loop).unwrap());// 创建图形上下文let context = softbuffer::Context::new(window.clone()).unwrap();// 创建绘图表面let mut surface = softbuffer::Surface::new(&context, window.clone()).unwrap();// 运行事件循环event_loop.run(move |event, elwt| {// 设置事件循环的控制流为等待状态elwt.set_control_flow(ControlFlow::Wait);// 处理发生的事件match event {// 当窗口需要重绘时Event::WindowEvent { window_id, event: WindowEvent::RedrawRequested } if window_id == window.id() => {// 获取窗口的尺寸let (width, height) = {let size = window.inner_size();(size.width, size.height)};// 调整绘图表面的尺寸surface.resize(NonZeroU32::new(width).unwrap(),NonZeroU32::new(height).unwrap(),).unwrap();// 随机填充颜色// 填充随机颜色let mut buffer = surface.buffer_mut().unwrap();for index in 0..(width * height/2) {let y = index / width;let x = index % width;let red = x % 255;let green = y % 255;let blue = (x * y) % 255;buffer[index as usize] = blue | (green << 8) | (red << 16);}// 绘制直线// 划线for index in (width * height/2)..(width * height/2+width*5) {let red = 169;let green = 123;let blue = 62;if index <= (width * height/2+width*5){buffer[index as usize] = 0 | (255 << 8) | (0 << 16);}else{buffer[index as usize] = blue | (green << 8) | (red << 16);}}// 绘制圆形// 画圆for index in (width * height/2+width*5)..(width * height) {let y1 = (index / width) as i32;let x1 = (index % width) as i32;                   let x0 = ((width/4)*3) as i32;let y0 = ((height/4)*3) as i32;let red = 169;let green = 123;let blue = 62;if ((y1-y0)*(y1-y0)+(x1-x0)*(x1-x0))<2048*9 {buffer[index as usize] = 0 | (0 << 8) | (255 << 16);}else {buffer[index as usize] = blue | (green << 8) | (red << 16);}}// 绘制矩形// 画矩形for index in (width * height/2+width*5)..(width * height) {let y1 = (index / width) as i32;let x1 = (index % width) as i32;                   let x0 = (width/2 - 180) as i32;let y0 = ((height/2)+80) as i32;let num_x = x1 - x0;//(x1.checked_sub(x0)).and_then(|dx| dx.checked_add(0));let num_y = (y1.checked_sub(y0)).and_then(|dy| dy.checked_add(0));if (num_x.abs()<100 && num_y<100_i32.checked_add(0_i32)) {buffer[index as usize] = 255 | (0 << 8) | (0 << 16);}else{//buffer[index as usize] = blue | (green << 8) | (red << 16);}}// 显示缓冲区内容buffer.present().unwrap();}// 当窗口关闭请求时Event::WindowEvent {event: WindowEvent::CloseRequested,window_id,} if window_id == window.id() => {// 退出事件循环elwt.exit();}// 忽略其他事件_ => {}}}).unwrap();
}

 效果图

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

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

相关文章

基于若依的文件上传、下载

基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了&#xff0c;但是我是自己改造封装了一下&#xff0c;再次迈向全栈…

3.js - 模板渲染 - 简单

3.js 真tm枯燥啊&#xff0c;狗都不学 效果图 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/li…

elementui中日期/时间的禁用处理,使用传值的方式

项目中,经常会用到 在一个学年或者一个学期或者某一个时间段需要做的某件事情,则我们需要在创建这个事件的时候,需要设置一定的时间周期,那这个时间周期就需要给一定的限制处理,避免用户的误操作,优化用户体验 如下:需求为,在选择学年后,学期的设置需要在学年中,且结束时间大…

使用京东云主机搭建幻兽帕鲁游戏联机服务器全流程,0基础教程

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云整理基于京…

【LabVIEW学习篇 - 2】:LabVIEW的编程特点

文章目录 LabVIEW的编程特点图形编程天然并行运行基于数据流运行 LabVIEW的编程特点 图形编程 LabVIEW使用图形化的图形化编程语言&#xff08;G语言&#xff09;&#xff0c;用户通过在程序框图中拖放和连接各种节点&#xff08;Nodes&#xff09;来编写程序。每个节点代表一…

图像增强 目标检测 仿射变换 图像处理 扭曲图像

1.背景 在目标检测中&#xff0c;需要进行图像增强。这里的代码模拟了旋转、扭曲图像的功能&#xff0c;并且在扭曲的时候&#xff0c;能够同时把标注的结果也进行扭曲。 这里忽略了读取xml的过程&#xff0c;假设图像IMG存在对应的标注框&#xff0c;且坐标为左上、右下两个…

vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。 先看一下最终效果 功能&#xff1a; &#xff08;1&#xff09;全选按钮和下面的商品项的选中状态同步&#xff0c;当下面的商品全部选中时&#xff0c;全选勾选&#xff0c;反之&#xff0c;则不勾选。 &#xff08…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

华为云OBS 通过S3客户端访问

华为云好像没有对S3协议的支持说明其实底层是支持S3协议的。 使用S3的时候我们会需要endpoint&#xff0c;桶名字&#xff0c;region&#xff0c;AWS_ACCESS_KEY,AWS_SECRET_KEY 其中endpoint 就是图片中的&#xff0c;桶名字也很容易找到&#xff0c;region 就是你的endpoint…

【开源项目】LocalSend 局域网文件传输工具

【开源项目】LocalSend 局域网文件传输工具 一个免费、开源、跨平台的局域网传输工具 LocalSend 简介 LocalSend 是一个免费的开源跨平台的应用程序&#xff0c;允许用户在不需要互联网连接的情况下&#xff0c;通过本地网络安全地与附近设备共享文件和消息。 项目地址&…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

docker部署redis/mongodb/

一、redis 创建/root/redis/conf/redis.conf 全部执行命令如下 docker run -it -d --name redis -p 6379:6379 --net mynet --ip 172.18.0.9 -m 400m -v /root/redis/conf:/usr/local/etc/redis -e TXAsia/Shangehai redis redis-server /usr/local/etc/redis/redis.conf 部署…

Java 基础--File - IO流(2)

I/O流 定义 数据从硬盘流向内存为输入流&#xff0c;数据从内存流向硬盘为输出流。输入也叫读取数据&#xff0c;输出也叫写出数据。 IO分类 1.按照数据的流向分为&#xff1a;输入流和输出流 ①输入流&#xff1a;把数据从其他设备上读取到内存中的流 ②输出流&#xff1…

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…

软件系统架构的一些常见专业术语

分层架构是逻辑上的&#xff0c;在物理部署上&#xff0c;三层结构可以部署在同一个物理机器上&#xff0c;但是随着网站业务的发展&#xff0c;必然需要对已经分层的模块分离部署&#xff0c;即三层结构分别部署在不同的服务器上&#xff0c;使网站拥有更多的计算资源以应对越…

前端Web开发HTML5+CSS3+移动web视频教程 Day4 CSS 第2天

P44 - P 四个知识点&#xff1a; 复合选择器 CSS特性 背景属性 显示模式 复合选择器 复合选择器仍然是选择器&#xff0c;只要是选择器&#xff0c;作用就是找标签。复合选择器就是把基础选择器进行组合使用。组合了之后就可以在大量的标签里面更快更精准地找标签了。找…

[附源码]基于Flask的演唱会购票系统

摘要 随着互联网技术的普及和发展&#xff0c;传统购票方式因其效率低下、流程繁琐等问题已难以满足现代社会的需求。本文设计并实现了一个基于Flask框架的演唱会购票系统&#xff0c;该系统集成了用户管理、演唱会信息管理、票务管理以及数据统计与分析等功能模块&#xff0c…

项目实战--Spring Boot + Minio文件切片上传下载

1.搭建环境 引入项目依赖 <!-- 操作minio的java客户端--> <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version> </dependency> <!-- jwt鉴权相应依赖--> &…

Python + OpenCV 开启图片、写入储存图片

这篇教学会介绍OpenCV 里imread()、imshow()、waitKey() 方法&#xff0c;透过这些方法&#xff0c;在电脑中使用不同的色彩模式开启图片并显示图片。 imread() 开启图片 使用imread() 方法&#xff0c;可以开启图片&#xff0c;imread() 有两个参数&#xff0c;第一个参数为档…

[c++] 可变参数模版

前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…