求助:Redo,Undo的实现原理

wushicnn 2003-01-08 05:03:35
加精
Redo,Undo的实现原理是什么?
...全文
97 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwu 2003-01-21
  • 打赏
  • 举报
回复
抱歉:
上面我写错了,把我的个人网站的域名当作email地址了,我的email地址为zzwu@citiz.net,
也可以
zzwu@zzwu.net
wushicnn 2003-01-21
  • 打赏
  • 举报
回复
同意
wushicnn 2003-01-21
  • 打赏
  • 举报
回复
zzwu(未名);崇拜啊.
刚刚浏览了你的网页,可惜看不到那些算法.
我要努力学习啊
wushicnn 2003-01-20
  • 打赏
  • 举报
回复
zzwu(未名):你说的对,是要占用很大的空间,好在有步骤限制.保存象素的方法对存贮空间的要求也很大吧,那个开销小一点啊
zzwu 2003-01-20
  • 打赏
  • 举报
回复
wushicnn(虎猫) :
很高兴又交了一个朋友! 我的email:www.zzwu.net.
如果用vector,则又可用一种方式了:保存vectors.
wushicnn 2003-01-20
  • 打赏
  • 举报
回复
zzwu(未名):有兴趣讨论一下吗?对于你所说的第三中方法,在我这里并不要求太多的信息,只有几个关键的数据,不如位置等,而且采用vector方式,对存贮空间要求不大.
另外我的MSN是wushicn@hotmail.com,我们交个朋友如何?
zzwu 2003-01-20
  • 打赏
  • 举报
回复
保存象素的方法自然要比保存整个画面对存贮空间的要求小一点.

3种保存方式的优缺点比较如下:

1.保存作图命令:对存贮空间的要求小,但速度最慢,每一像素要从新计算
2.保存被修改的那些象素:对存贮空间的要求次之,速度快,程序复杂
3.保存整个中间结果(全图或全屏幕):对存贮空间的要求最高,速度快,程序简单

保存都用栈来实现,用2个指针,见前面引用的那个贴.


zzwu 2003-01-18
  • 打赏
  • 举报
回复
对于3D图形,我以前还用过一种的方法,就是每次作图前,将要修改的位置的所有象素保留起来,要undo时,就把保留的这些象素重新写回去就行了.自然,为了redo,原来每次添加的象素也应保存起来.
我以前作分子动画时,为了提高速度,也采用了类似的方法.
tyb98032 2003-01-18
  • 打赏
  • 举报
回复
可以参看一下“四人帮”写的《设计模式》中的Command模式。。。
链表和栈是必要的数据结构。
zzwu 2003-01-17
  • 打赏
  • 举报
回复
我所说的第2种方法就是你讲的意思.这种方法的代价是需要很大的存储空间.
wushicnn 2003-01-16
  • 打赏
  • 举报
回复
我想到一个方法,类似与存档和取档,操作一次存贮一下信息,undo时取出信息
wushicnn 2003-01-13
  • 打赏
  • 举报
回复
我是在做一个3D软件,感谢大家对我的帮助,实际上我是一个新手,所以做起来感到很吃力
zzwu 2003-01-12
  • 打赏
  • 举报
回复
sameboat(sameboat) :你好!
谢谢你的夸奖!
参加讨论,帮助别人,可广交朋友呵!
同时,解决别人的问题,对自己也是一个锻炼,能学到东西的.
林仪明 2003-01-11
  • 打赏
  • 举报
回复
可以用一个链表来做,在用一个指针指向当前状态的节点。
比如现在用户执行了10个操作,我们有十个节点。
用户想要undo4次,然后再执行新的操作。这样我们就可以把新的操作接到第6个节点后就可以了!
sameboat 2003-01-11
  • 打赏
  • 举报
回复
你是在做数据库系统吗?若实现Redo和Undo日志,有难度。study.

zzwu(未名),你好
你真是热心,到处有你的恢复。
sliant 2003-01-10
  • 打赏
  • 举报
回复
用链表将命令序列记录下来
每个命令都自带有 do() 和 undo() 接口

这样效率较高,但所有命令处理的编码几乎增大了一倍
wushicnn 2003-01-10
  • 打赏
  • 举报
回复
那样效率也太慢了吧,有更好的方法吗?那个贴要点击管理才能进入
zzwu 2003-01-10
  • 打赏
  • 举报
回复
wushicnn(虎猫):
你指的第一种方法確實是慢的.
可以採用我講的第二种方法:即每次都保留中間結果,這是最快的方法了.
也可以折衷一下,如每隔n個作圖命令,保留1個中間結果(n>1);這樣,每次undo,只要从從最後保留的那個中間結果開始作起就可以了.

jiangyu99 2003-01-10
  • 打赏
  • 举报
回复
我觉得如果画图时注意用反色就可以解决吧。
比如现在做了1,2,。。。,n 共n步,
现在撤销n的操作,实际上就是重作n的步骤,
wushicnn 2003-01-10
  • 打赏
  • 举报
回复
zzwu(未名) :

我指的是undo(),因为照你的说法,每undo一次,都要从n=1到n=n-1执行一遍.

而且现在我做的是3D操作,引擎对资源的占用本身就已经很大了,所以想要一个效率高一点的算法
加载更多回复(8)

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧