我正在制作一个简单的绘图应用程序,我需要一个算法来填充洪水 用户工作流程将如下所示(类似于Flash CS,更简单):
如果在应用填充后移动线条,则相应地更改填充区域。
任何人都有一个好主意,如何实现这样的算法?主要任务基本上是确定一个点周围的线段。 (以某种方式存储此信息,移动线条)
编辑:解释图片:(画布中当然可以有其他行,对填充算法无关紧要)
EDIT2:更困难的情况:
EDIT3:我找到了一种用孔http://alienryderflex.com/polygon_fill/填充多边形的方法,现在主要的问题是,我如何找到我的多边形?
答案 0 :(得分:4)
您正在寻找点位置算法。它不是太复杂,但在这里解释并不简单。本书中有一个很好的章节:http://www.cs.uu.nl/geobook/
当我回到家时,我会得到我的书副本,看看我是否可以尝试。您需要了解很多细节。这一切都归结为构建输入的DCEL并在添加或删除线时维护数据结构。使用鼠标坐标的任何查询都将返回组件的内半部分,特别是那些包含指向所有内部组件的指针,这正是您所要求的。
但有一件事是你需要知道输入中的交叉点(因为如果你有相交的线就不能建立梯形图),如果你可以侥幸逃脱它(即输入是足够的段)我强烈建议您只使用天真的O(n²)算法(简单,可编码且可在不到1小时内测试)。 O(n log n)算法需要几天的时间来编码并使用一个聪明且非常重要的数据结构来处理状态。然而,书中也提到了这一点,所以如果你能够完成任务,你就有2个理由购买它。这是一本关于几何问题的书,所以对于这个原因,任何对算法和数据结构感兴趣的程序员都应该有副本。
答案 1 :(得分:2)
试试这个:
http://keith-hair.net/blog/2008/08/04/find-intersection-point-of-two-lines-in-as3/
该函数返回ActionScript中两行之间的交集(如果有)。你需要将所有的线路相互循环以获得所有线路。
当然,如果你打算填补它们,那么积分的顺序将会非常重要 - 这可能会更难!
答案 2 :(得分:0)
使用ActionScript,您可以使用beginFill
和endFill
,例如
pen_mc.beginFill(0x000000,100);
pen_mc.lineTo(400,100);
pen_mc.lineTo(400,200);
pen_mc.lineTo(300,200);
pen_mc.lineTo(300,100);
pen_mc.endFill();
http://www.actionscript.org/resources/articles/212/1/Dynamic-Drawing-Using-ActionScript/Page1.html
Flash CS4还引入了对路径的支持:
http://www.flashandmath.com/basic/drawpathCS4/index.html
如果你想变得疯狂并编码你自己的洪水填充,那么维基百科有一个decent primer,但我认为这将是为了这些目的重新发明原子。