rust下的图形绘制库valora有什么特性
这篇文章主要介绍了rust下的图形绘制库valora有什么特性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
十载的雁峰网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整雁峰建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“雁峰网站设计”,“雁峰网站推广”以来,每个客户项目都认真落实执行。
valora特性
valora包含了rng(Random Number Generator) 在不改变composition scale的情况下复现任意分辨率的图形 使用了type-safe color可以保证色彩的印刷一致性 充分利用硬件资源 充分利用Rust特性,大幅减少了调试工作量
下面我们参考valora网站上的教程来体验绘制功能
开发环境
Windows 10 cargo version
: cargo 1.45.0-nightly (9fcb8c1d2 2020-05-25)rustc --version
: rustc 1.45.0-nightly (56daaf669 2020-06-03)
初始化新的rust工程之后使用命令安装
cargo install cargo-edit && cargo add valora
注意:由于valora的依赖项中有些包使用了测试版本,所以需要使用rustc nightly版本才能顺利安装。如果使用rustc stable版本会报错。
切换stable到nightly版本
rustup default nightly
体验valora绘制功能
接下来我们通过valora主页中Introduction部分的例子来体验绘制功能
原始代码如下:
use valora::prelude::*;
fn main() -> Result<()> {
run_fn(Options::from_args(), |_gpu, world, _rng| {
Ok(move |ctx: Context, canvas: &mut Canvas| {
canvas.set_color(LinSrgb::new(1., 1., 1.));
canvas.paint(Filled(ctx.world));
let max_radius = world.width / 3.;
let radius = ctx.time.as_secs_f32().cos().abs() * max_radius;
canvas.set_color(LinSrgb::new(1., 0., 0.));
canvas.paint(Filled(Ellipse::circle(world.center(), radius)));
})
})
}
接下来我们通过修改原始代码中的一些参数来体验valora绘制的可玩性。
首先我们准备对例子中的背景色和圆形色彩下手。至于例子代码中相对细节的ctx
, _gpu
等关键部分现阶段可以不用深入了解。
valora使用的色彩定义LinSrgb
是均一化的rgb,通常来说rgb取值范围为0 ~ 255
,均一化就是0 ~ 1
。值得注意的是赋值使用了浮点数(1., 0., 0.)
,一般来说图形范畴内使用浮点数很普遍。
有了这些概念我们可以去找个在线color picker去选择一下我们想要的背景色和圆的颜色。
经过一番picker之后
背景色选择了 rgb(153, 204, 255)
,类似天空蓝色。圆形的颜色用个橙色类似的 rgb(255, 153, 51)
那么我们把选定的色彩粘贴到代码中,同时做个均一化的除法
// color of background
canvas.set_color(LinSrgb::new(153./255., 204./255., 255./255.));
// color of circle
canvas.set_color(LinSrgb::new(255./255., 153./255., 51./255.));
原始代码中圆形只是在中间位置scale缩放,有点呆。
结合一点写代码的背景知识,一般来说带有绘制功能的视觉库都是用一个二维或者三位维向量来做位置参数,旋转用个3X3矩阵之类的套路。
再结合一点线性代数知识,向量外层乘以固定系数应该还是个向量。
那么我们直接把上面负责变形的代码复制粘贴到位置矩阵旁边,同时做个乘法,让圆心的x和y等尺度变化。
这样就可以实现了类似高空摄像机向下拍摄一个弹跳皮球运动的视觉误差,复制粘贴走起(主要是懒)
canvas.paint(Filled(Ellipse::circle(world.center() * ctx.time.as_secs_f32().cos().abs(), radius)));
修改之后运行一下看看效果,还凑合
感谢你能够认真阅读完这篇文章,希望小编分享的“rust下的图形绘制库valora有什么特性”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!
文章标题:rust下的图形绘制库valora有什么特性
文章转载:http://scyanting.com/article/gdgdid.html