使用平行于X轴的线的阴影算法

时间:2018-06-14 13:53:59

标签: java algorithm graphics

我需要一种算法来孵化与X轴线平行的随机多边形。 我开始写我认为是解决方案。 我的算法实现类似于(粗体步骤可能不正确)

  1. 使用多边形的minY和maxY确定线的Y轴级别
  2. 对于每个Y轴水平,确定交叉点的X坐标。
  3. 对每个级别的交叉点的X进行排序
  4. 为每对X的每个级别绘制线条
  5. 结果如下:result 我需要一种方法来确定多边形内部是什么,什么不是,或者至少是什么算法 (我知道这是一个现有的alogirthm,但我无法在任何地方找到它)

2 个答案:

答案 0 :(得分:2)

  
      
  1. 使用多边形的minY和maxY确定线的Y轴级别
  2.   
  3. 对于每个Y轴水平,确定交叉点的X坐标。
  4.   
  5. 对每个级别的交叉点的X进行排序
  6.   
  7. 为每对X
  8. 在每个级别上绘制线条   

你有正确的想法。假设对于步骤#3,您有一个xs = [x0, x1, x2, x3]列表。然后,您需要从(x0, y)(x1, y)以及从(x2, y)(x3, y)绘制线条。您不希望从(x1, y)(x2, y)绘制一条线。

如果仔细观察模式,您应该能够推广算法以绘制线段。

答案 1 :(得分:0)

对于防弹解决方案:

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时,删除具有较低上端点的边,并插入具有较低下端点的边(如果边缘相交这两个条件,它只是跳过了。)