0

现在我正在使用 WinForms 和 GDI+ 开发一个简单的类似绘画的程序,并且我已经解决了一个简单的问题:

我使用面板作为我的画布。我将所有可绘制对象(形状、线条等)保存在一个列表中。每次 GDI+ 想要重绘内容时,它都会遍历该列表,在每个对象上调用 Draw()。这种方法对我很有用:它很快,看起来不错,每次我想要 Undo() 操作时,我都会在重绘等时忽略列表中的最后一个元素。

问题是,现在我想添加一个 Flood Fill 功能。我应该如何解决这个问题?首先,我发现的大多数 FloodFill 实现都适用于位图——我没有位图,我所有的对象都保存在内存中。我应该把它们画在那个位图上吗?在这种情况下,然后呢?我再也看不到管理撤消/重做操作的方法了。我不知道重绘是什么。

我被困住了,我真的指望任何帮助,因为我怀疑我在这里的想法是错误的。

4

1 回答 1

0

你说你保留了一个可绘制对象的列表(形状、线条等等)。

好吧,假设你实现了洪水填充,你希望得到的结果是什么?我看它的方式,它要么是Bitmap,要么是多边形( 的数组Point)。

因为洪水填充算法在位图上运行,您可以将所有当前对象绘制到临时缓冲区上Bitmap,然后在此位图上进行洪水填充。生成的填充区域可以保存到一个Bitmap,或者使用其他算法,追溯到一个多边形(或一系列多边形)。

http://en.wikipedia.org/wiki/Flood_fill#Vector_implementations

于 2013-09-08T14:24:31.820 回答