rust - ggez 库中的网格坐标和绘制坐标如何相互关联?
问题描述
创建一条线时,传递一个点列表,但graphics::draw
需要 X/Y 坐标:
let (origin, dest) = (Point::new(0.0, 0.0), Point::new(0.0, 0.0));
let line = graphics::Mesh::new_line(ctx, &[origin, dest], 2.0, graphics::WHITE)?;
graphics::draw(ctx, &line, (Point2::new(0.0, 0.0),))?;
对于矩形,x
,和在创建矩形时传递,但y
需要X/Y 坐标:width
height
graphics::draw
let rectangle = graphics::Mesh::new_rectangle(
ctx,
graphics::DrawMode::fill(),
[0.0, 0.0, 30.0, 30.0].into(),
graphics::WHITE,
)?;
graphics::draw(ctx, &rectangle, (Point::new(0.0, 0.0),))?;
为什么两个坐标都需要?
解决方案
来自ggez 库的作者:
区别在于它是在网格的坐标空间中还是在屏幕的坐标空间中。对不起,重言式的答案,让我看看我是否可以做得更好......
创建网格时,假设您正在一张透明方格纸上绘制点。这就是网格坐标系。然后当你打电话时,
graphics::draw()
你把它放在另一张方格纸上,你传递的坐标draw()
就是你将两者抵消了多少。但它不仅仅是一个偏移量,它还具有draw()
可以旋转、缩放等网格坐标系的选项。如果您只是创建网格,使其居中50,50
然后旋转它,默认情况下它将围绕其0,0
点而不是网格的中心旋转。如果您创建网格使其以其0,0
坐标为中心,则默认情况下旋转或缩放它将从其自己的中心开始。该DrawParam::offset()
参数可以控制“中心”点的位置,但它'所以你可以用这两种方法实现完全相同的东西,但我想说这
draw()
对位置操作更好。
推荐阅读
- angular - Angular 服务测试:找不到名称“asyncData”
- android - 一天后cookie的内容发生了变化
- c# - 没有名称属性的单选按钮分组。.net mvc
- c# - 赋值的左侧必须是变量 C#
- vb6 - 如何从智能卡打开证书并验证用户输入的密码
- php - PHP file_get_contents() 输出垃圾 HTML
- node.js - 代码管道将 S3 存储桶作为用户参数传递给 AWS 中的 lambda 函数
- php - PHP - 为类数组创建方法
- ibm-watson - Watson 助手 API 获取令牌返回 403 ERCD NOCONFIG 错误
- python - 检测 LED 阵列中的缺陷 LED