代码之家  ›  专栏  ›  技术社区  ›  InfinitePii

GDI中的洪水填充+

  •  0
  • InfinitePii  · 技术社区  · 12 年前

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

    我正在用一块面板作为画布。 我把我所有的可绘制对象(形状、线条等等)都放在一个列表中。每次GDI+想要重新绘制内容时,它都会遍历该列表,对每个对象调用Draw()。这个方法对我来说效果很好:它很快,看起来很好,每次我想要Undo()操作时,我都会在重新绘制时忽略列表中的最后一个元素。

    问题是,现在我想添加整体填充功能。我应该如何处理这个问题?首先,我发现的大多数FloodFill实现都可以使用位图——我没有位图,我所有的对象都保存在内存中。我应该把它们画在位图上吗?在这种情况下,怎么办?我再也看不到管理撤消/重做操作的方法了。我不知道重画该怎么办。

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

    1 回复  |  直到 12 年前
        1
  •  0
  •   Rotem CodesInChaos    12 年前

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

    那么,假设您实现了整体填充,那么您希望得到的结果是什么? 在我看来,要么是 Bitmap ,或多边形(数组 Point ).

    由于整体填充算法对位图进行操作,因此可以将所有当前对象绘制到临时缓冲区中 位图 ,然后对此位图进行整体填充。生成的填充区域可以保存到 位图 ,或使用其他算法,追溯到一个多边形(或一系列多边形)。

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