Project1

标题: 填充一个任意多边形 [打印本页]

作者: 804173948    时间: 2014-7-8 00:08
标题: 填充一个任意多边形
本帖最后由 804173948 于 2014-7-8 11:39 编辑

填充一个任意的多边形(已经在位图上绘制了顶点和线)、、求各位大神的思路或代码、、
作者: taroxd    时间: 2014-7-8 06:29
选取合适的位图大小

多边形的边构成直线方程。可以通过这些直线方程判断是否在多边形内。

对于位图里的每一个点,如果在多边形内,则填充上颜色(set_pixel)

-------------------------------------------------------------------

当然,你直接拿一个现成的多边形的jpg或者png就可以了
作者: SuperMario    时间: 2014-7-8 07:39
本帖最后由 SuperMario 于 2014-7-8 07:53 编辑

逐行或者逐列扫描,拿逐行来说,自左向右获取每个像素,遇到多边形边界开始填充每个像素,超过边界停止填充。
如果不是凸多边形,还要考虑再次进入填充的可能性。

对了想到个更好的,直接填充就行了。首先任取一个多边形内的点,填充它。然后与它相邻的点如果是空的填充上,然后在处理与它们相邻的点。递归计算下去就可以填充整个图形了。
作者: 804173948    时间: 2014-7-8 11:29
SuperMario 发表于 2014-7-8 07:39
逐行或者逐列扫描,拿逐行来说,自左向右获取每个像素,遇到多边形边界开始填充每个像素,超过边界停止填充 ...

我开始就是按这种方法填充的、、这是我的代码

bitmap 是 绘制有那个多边形的 位图
px, py 分别是 多边形每个的顶点的 x ,y 坐标组成的数组
color 是填充颜色
side_color 是边界的颜色

  def fill_block(bitmap,px,py,color = Color.new(255,255,255),side_color = Color.new(255,255,255))
    draw = false
    maxx,minx,maxy,miny = px.max,px.min,py.max,py.min
    for x in minx+1...maxx
      for y in miny+1...maxy
        draw = !draw if bitmap.get_pixel(x, y) == side_color
        bitmap.set_pixel(x, y, color) if draw
      end
      draw = false
    end
  end

可是不行、、
作者: 御用调教者    时间: 2014-7-8 17:37
你知道不用线性规划来表示是很麻烦的


作者: satgo1546    时间: 2014-7-8 17:59
既然你已经画好了,那么直接填充就是了。
通常的填充思路是:

(MCEdit好像都是这么填的……
假设下图中蓝色点为多边形,那么填充过程如下:
绿色的点由于是原来的那个点,因此不继续填充。
(这个方法好像谁都想得出来吧……
作者: SuperMario    时间: 2014-7-9 05:29
本帖最后由 SuperMario 于 2014-7-9 05:32 编辑

那个有问题,至少线的厚度超过2就出错。
那些点是怎么生成的,随机?怎么能保证它们一定能围成一个唯一确定的多边形?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1