设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1862|回复: 6
打印 上一主题 下一主题

[已经过期] 填充一个任意多边形

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2123
在线时间
740 小时
注册时间
2010-9-6
帖子
338
跳转到指定楼层
1
发表于 2014-7-8 00:08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 804173948 于 2014-7-8 11:39 编辑

填充一个任意的多边形(已经在位图上绘制了顶点和线)、、求各位大神的思路或代码、、

点评

额、、打错-、  发表于 2014-7-8 11:40
看标题我表示我不知道如何任意多变形……  发表于 2014-7-8 11:30
undefined

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2014-7-8 06:29:01 | 只看该作者
选取合适的位图大小

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

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

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

当然,你直接拿一个现成的多边形的jpg或者png就可以了

点评

我也太可怜了吧。。  发表于 2014-7-9 09:02
不懂-、、  发表于 2014-7-8 15:13
直线方程哪里复杂了……  发表于 2014-7-8 11:51
直线方程-、、好复杂。。。  发表于 2014-7-8 11:39

评分

参与人数 1星屑 +18 收起 理由
化螺耕 + 18 好像奥赛题。。

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
帖子
424
3
发表于 2014-7-8 07:39:50 手机端发表。 | 只看该作者
本帖最后由 SuperMario 于 2014-7-8 07:53 编辑

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

对了想到个更好的,直接填充就行了。首先任取一个多边形内的点,填充它。然后与它相邻的点如果是空的填充上,然后在处理与它们相邻的点。递归计算下去就可以填充整个图形了。

点评

“首先任取一个多边形内的点,填充它。”这个点怎么求出来是在多边形内呢。。  发表于 2014-7-8 11:37
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2123
在线时间
740 小时
注册时间
2010-9-6
帖子
338
4
 楼主| 发表于 2014-7-8 11:29:21 | 只看该作者
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 12:07
undefined
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
8 小时
注册时间
2014-4-30
帖子
24
5
发表于 2014-7-8 17:37:22 | 只看该作者
你知道不用线性规划来表示是很麻烦的

点评

不懂-、、  发表于 2014-7-8 20:43
同,线性规划神马的最舒服了  发表于 2014-7-8 19:43
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
555
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
6
发表于 2014-7-8 17:59:06 | 只看该作者
既然你已经画好了,那么直接填充就是了。
通常的填充思路是:

(MCEdit好像都是这么填的……
假设下图中蓝色点为多边形,那么填充过程如下:
  • 从一个点开始
  • 向上下左右填充一个像素,碰到蓝色就停止
  • 将之前填充的那4个点再次按照第一个点的方法填充
绿色的点由于是原来的那个点,因此不继续填充。
(这个方法好像谁都想得出来吧……

点评

递归啊。  发表于 2014-7-11 10:50
貌似很难实现额。。。  发表于 2014-7-10 22:06
。。。竟然想不出来、、、我试试。。  发表于 2014-7-8 20:44

评分

参与人数 1星屑 +150 收起 理由
taroxd + 150 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
帖子
424
7
发表于 2014-7-9 05:29:18 手机端发表。 | 只看该作者
本帖最后由 SuperMario 于 2014-7-9 05:32 编辑

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

点评

所以说,线性规划啦,会点数学就能解决了-。-  发表于 2014-7-9 06:03
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-25 17:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表