【问题标题】:Multiple GDI Transforms for 2D Graphics in C#C# 中二维图形的多个 GDI 转换
【发布时间】:2014-09-28 12:04:25
【问题描述】:

我正在编写一个图形应用程序,它可以使用鼠标控制执行全局转换(旋转和平移)。有没有人有一个示例显示如何使用以下方法实现这一点:

MouseDown(object sender, MouseEventArgs e) - set the translate/rotate offset
MouseMove(object sender, MouseEventArgs e) - increment translate/rotate variables
OnPaint(Graphics graphics, float time)     - use Matrix object to do global transform

问题:旋转图形后,当我翻译它们时,它们会根据旋转变换移动。我是否需要在设置翻译变量的 MouseDown 和 MouseMove 中补偿这种旋转?

【问题讨论】:

  • 非常不清楚。矩阵乘法不可交换。是先平移再旋转还是先旋转再平移,这会产生很大的不同。
  • 没错,汉斯。所以我的问题是“我如何实现这一目标?”。想象一下创建一个用户可以在 2D 迷宫中漫游的电脑游戏。当你按一个键转动时,用户的角色在迷宫转动时保持静止。当您按下一个键向前移动时,角色再次保持静止(例如在屏幕中心),但 2d 地图向下移动。我已经通过将三角函数单独应用于所有世界对象来做到这一点。但使用图形矩阵似乎是一种更好的方法。
  • 您是否以正确的方式进行旋转?即,将对象平移到原点,然后旋转,然后将其平移到其原始位置。因为有一种叫做 AXIS OF ROTATION 的东西会产生巨大的影响

标签: c# gdi


【解决方案1】:

记住,MouseDown 只进行一次。我认为在 MouseDown 事件中,除了设置偏移量之外,您还需要对其进行转换。而且你可能还需要一个变量

bool isMouseDown = true;

帮助 MouseMove 指示它处于“鼠标按下后”状态。

而在MouseMove事件中,基本上和MouseDown事件中的过程是一样的,区别只是鼠标的坐标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多