撤消&重做没有存储图形的合作

时间:2014-02-06 19:57:24

标签: java swing graphics graphics2d

我目前正在制作一个绘画程序,并已实施了撤消& redo方法,但是当我的程序在用户绘制时减慢时,我决定不将这些co-ords存储在ArrayList中,而是直接将它们应用于BufferedImage。这种方法的问题是我不能像以前那样撤消或重做。 我搜索了interweb,并找到了一个名为UndoManager的类的引用。我不知道如何将它应用于图形对象(根据我的条件)。

我仍然可以存储合作伙伴,但这对我来说毫无用处,因为我直接画它们,除非有人想到一种方法来覆盖黑色的线条,用透明的线条代替它(目前,对于我的目的是使用BufferedImage.setRGB(x,y,color),但这只有在我想要替换的形状是圆(x ^ 2 + y ^ 2 = r ^ 2)或矩形时才有用。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以保留上次操作中修改内容的增量,并在撤消时应用该增量的反转。

这就是我的意思:假设你有一个图像A并且你在它上面绘制一条线,所以现在你有了图像B.如果你计算C = A xor B那么C就是你的delta的倒数没有。因此,您只需存储C以进行撤消。撤消过程将是:A = B xor C

当然A,B和C不一定是你完整的图像,它们可以只是变化的区域,并且有一些起点的信息。

如果你想重做,那就是B = A xor C

这背后的逻辑如下,请记住,xor和一个值本身会产生0,而xor与0的任何值都会产生相同的数字。我使用^作为xor的缩写,因为您正在使用Java。

如果您的图像连续有3个像素,则RGB值为:

A = [ (255,255,255) , (255,255,255), (255,255,255) ]

你用红色墨水在中间像素上绘图,你会得到:

B = [ (255,255,255) , (255,0,0), (255,255,255) ]

现在,通过执行两个图像的xor来计算增量:

C = [ (0,0,0) , (0,255,255), (0,0,0) ]

如果您想从B和C获得A,请执行以下B xor C

[ (255 ^ 0, 255 ^ 0, 255 ^ 0) , (255 ^ 0, 0 ^ 255, 0 ^ 255), (255 ^ 0, 255 ^ 0, 255 ^ 0) ]

原始图片是什么:

`[ (255,255,255) , (255,255,255), (255,255,255) ]`

这里我使用255和0,因为这些数字具有易于计算的xor,但它适用于任何值。尝试A = 127,B = 83并将C计算为127^83,然后检查A = B^C

希望它有所帮助。