【问题标题】:A hatching algorithm using lines parallel to X-axis使用平行于 X 轴的线的阴影算法
【发布时间】:2018-11-24 07:58:53
【问题描述】:
我需要一个算法来孵化一个平行于 X 轴线的随机多边形。
我开始写我认为的解决方案。
我的算法实现是这样的(粗体步骤可能不正确):
- 使用多边形的 minY 和 maxY 确定线条的 Y 轴水平
- 为每个 Y 轴级别确定交叉点的 X 坐标。
- 对每个级别的交叉点的 X 进行排序
-
为每对 X 在每个级别上画线
这是结果:result
我需要一种方法来确定多边形内部是什么,什么不是,或者至少是什么算法。
(我知道这是一个现有的算法,但我在任何地方都找不到) p>
【问题讨论】:
标签:
java
algorithm
graphics
【解决方案1】:
- 使用多边形的 minY 和 maxY 确定线条的 Y 轴水平
- 为每个 Y 轴级别确定交叉点的 X 坐标。
- 对每个级别的交叉点的 X 进行排序
- 为每对 X 在每个级别上画线
你的想法是对的。假设对于第 3 步,您有一个 xs = [x0, x1, x2, x3] 列表。然后你需要画线从(x0, y)到(x1, y)和从(x2, y)到(x3, y)。你不想在(x1, y) 和(x2, y) 之间画一条线。
如果你仔细观察模式,你应该能够概括出一种算法来绘制线段。
【解决方案2】:
对于防弹解决方案:
For all equally spaced Y in the range Ymin to Ymax:
Try all edges PiPj in turn (j is the successor of i):
if (Y >= Yi) != (Y >= Yj):
There is an intersection, compute and store the corresponding X
Sort the X's left to right
Draw all segments (X[2i], Y) to (X[2i+1], Y)
一定要如上写交集条件,这样可以保证所有情况下都是偶数。
对于多边的多边形,当您扫描整个多边形的每一层时,这是非常低效的。一种更有效的方法是使用扫描线方法:通过增加最低端点的纵坐标对边缘进行排序。然后当你增加 Y 时,你将维护一个与当前 Y 相交的边列表。每次增加 Y 时,删除具有较低上端点的边,并插入具有较低下端点的边(如果边满足这两个条件,就跳过了)。