【问题标题】:how to implement undo functionality in opengl in android如何在android中的opengl中实现撤消功能
【发布时间】:2013-01-30 04:31:13
【问题描述】:

我正在开发一个扭曲图像的 android 应用程序。我正在使用 opengl 翻译和缩放功能来扭曲图像。图像扭曲得很好。现在我想实现撤消功能。但无法实现该功能。任何一个可以帮助如何在 opengl 中实现撤消功能。任何建议或代码都会有所帮助。 提前致谢 。

【问题讨论】:

  • 这与OpenGL无关。 OpenGL 只绘制您告诉它绘制的内容。任何撤消功能都是关于将您告诉它绘制的内容更改为以前的内容。
  • @NicolBolas 实际上我在手指触摸时扭曲了图像。图像缩小或膨胀。问题是,我应该存储什么以及如何在视图中反映它。
  • 我相信您应该在每次触摸开始时存储当前图像。然后当撤消完成时,只需删除当前图像并将其替换为队列中的最后一个图像。使用opengl可以反转一些操作,但我认为您不应该在这里使用这些功能。只需存储原始和您用手指执行的每个操作,或每个步骤的图像。
  • 看看带有undo的命令设计模式:stackoverflow.com/questions/3448943/…
  • 如果您使用三角带,我将使用 Ray Tayek 上面描述的命令设计模式存储当前矩阵。

标签: java android opengl-es


【解决方案1】:

雷·塔耶克是对的。使用命令模式。也就是说,对于用户执行的每个操作,您都会将该操作(命令)以及与该操作相关的任何数据推送到 Undo 堆栈。

为了简单起见,让我们看一个绘图程序。该过程直接适用于您的 OpenGL 应用程序。用户从 x1, y1 到 x2, y2 画一条线。该命令可以这样表示:

command = DrawLine
data = x1, y1, x2, y2

您可能需要至少两个用于 Undo 数据的类,但它们会很小且易于实现。当用户想要撤消时,只需从撤消堆栈中弹出顶部对象,查看它并执行相关的撤消操作(特定于每种类型的命令)。或者,您甚至可以在每个命令对象本身中包含撤消操作。然后将撤消的命令压入重做堆栈。

这应该足以让您入门。高温

【讨论】:

  • 我在上面修改了我的答案。对于 3D 图形,DwB 有一个很好的方法。将未更改的图像用作撤消数据的一部分。
【解决方案2】:

我怀疑命令模式不足以满足您的情况。这是基于我的假设,即即使您知道应用了何种失真,也不容易扭转图像失真。

相反,您可能需要在应用失真之前将图像推入堆栈。然后,撤消实现会将当前图像替换为堆栈上的图像。这将导致重做和撤消的组合产生潜在的有趣问题。

您可以对此进行优化,将命令对象存储为可轻松撤消的更改,并将图像存储为不易撤消的更改。

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 2011-05-11
    • 2011-05-27
    • 1970-01-01
    • 2020-05-12
    • 2011-05-24
    • 2011-12-16
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多