gpt4 book ai didi

java - 撤消和重做,无需存储图形坐标

转载 作者:行者123 更新时间:2023-12-02 06:14:36 24 4
gpt4 key购买 nike

我目前正在开发一个绘画程序,并实现了撤消和重做方法,但由于我的程序随着用户绘制而变慢,我决定不将坐标存储在 ArrayList 中,而是直接将它们应用到缓冲图像。这种方法的问题是我无法像以前那样撤消或重做。我在互联网上搜索了一下,发现了一个名为 UndoManager 的类的引用。 。不过,我不知道如何将其应用到图形对象(鉴于我的情况)。

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

有什么想法吗?

最佳答案

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

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

当然A、B和C不必是完整的图像,它们可以只是变化的区域及其起始点的一些信息。

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

其背后的逻辑如下,请记住,将一个值与自身进行异或会产生 0,而将任何值与 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) ]

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

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,因为这些数字具有易于计算的异或运算,但它适用于任何值。尝试 A = 127,B = 83 并将 C 计算为 127^83,然后检查 A = B^C

希望有帮助。

关于java - 撤消和重做,无需存储图形坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com