none
系统自带画图那油漆桶怎么实现的? RRS feed

答案

全部回复

  • 你可以使用floodfill算法。它的步骤如下:

    首先,记录目标像素的颜色值origColour以及坐标origin。

    作一个队列q,把origin放入队头。作一个二维bool数组hasVisited记录每个像素是否已经访问过,把origin点对应的那个bool值设为true,其他为false。把起点的颜色设置为新的颜色。

    如果队不空,就进行下面的操作,直到队空:

    1、取出队头,记队头表示的点为f。

    2、计算f上下左右的四个相邻的点的坐标,如果这些点在画布上,并且没有访问过这个点,且这点对应颜色和origColour一样,则将这个点的颜色改成新颜色,并把这点放入队尾,并用hasVisited记下此点已经访问过。

    此时,和原来点同色的区域已经被修改为新颜色。

    这个问题属于算法类问题。

    2013年1月29日 16:39
  • 画图中油漆桶的实现应该是边界填充算法(Boundary Fill Algorithm),但它和注入填充(floodfill)算法的本质其实是一样的,都是递归和搜索,区别只在于对边界的确认,也就是递归的结束条件不一样。注入填充算法没有边界的概念,只是对联通区域内指定的颜色进行替换,而边界填充算法恰恰强调边界的存在,只要是边界内的点无论是什么颜色,都替换成指定的颜色。

    你可以参考下这篇文章:http://blog.csdn.net/orbit/article/details/7323090


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2013年1月30日 2:19
    版主
  • 还是有问题啊   首先这种算法只能指定边界颜色才能填充,而画图中用户使用的颜色是变化的

    其次这种算法不能处理不同颜色组成的边界填充问题  而自带画图可以,,,有什么更好的办法吗


    Visual Basic 初学者 望关照!

    2013年2月6日 15:00
  • 为什么不能?
    2013年2月7日 14:43
  • 根据算法是“到边界停止”需要指定边界眼色啊

    Visual Basic 初学者 望关照!

    2013年2月19日 1:34
  • 边界的颜色是一切不等于原色的颜色集合。
    2013年2月20日 9:54
  • 等一下  原色?万一内部有不同的颜色呢?

    Visual Basic 初学者 望关照!

    2013年2月20日 12:54
  • 等一下  原色?万一内部有不同的颜色呢?

    Visual Basic 初学者 望关照!


    看你的标题,你要求的是实现mspaint.exe的“用颜色填充”工具,这个工具的作用是将和原点同色四连通的区域改为另一种颜色。
    2013年2月21日 2:29
  • 太感谢了!!!

    Visual Basic 初学者 望关照!

    2013年2月21日 12:23