【问题标题】:How to fill polygons with even-odd rule?如何用奇偶规则填充多边形?
【发布时间】:2016-07-25 13:35:34
【问题描述】:

我有 n 个多边形。每个多边形有 n 个点,以及一些其他属性,如边界框等。我可以用某种颜色单独填充它们,但我想用奇偶规则填充多边形。 有哪些算法可以解决这个问题? (可能基于矢量或基于光栅)

【问题讨论】:

  • 也许自己编程?如果SomePixel 属于多边形的odd numbereven number
  • 答案和这里的基本一致:stackoverflow.com/questions/25422846/…。尽管该解决方案适用于单个多边形,但相同的解决方案适用于多个多边形。

标签: c++ algorithm opengl directx game-engine


【解决方案1】:

如果您可以使用栅格,请计算边与线的所有交叉点(每条线的交叉点列表)。在光栅线之间放置水平线,因此 [for square] 上面的线没有边缘交叉点,下面的线有两个交叉点。

现在每个路口从左到右走每一行,你从“外面”开始,每个路口你都反转当前状态。

(顺便说一句,你可以断言你也以“外部”结束......当然我说的是无限 x-res,你可以进一步将其限制为某个固定分辨率,但计算从哪里开始是第一个路口,我会跑到最后一个路口,只是为了进行断言检查)

正确获取几乎水平的线以及两条边缘之间的连接可能很棘手(想象星形的尖锐末端,在同一个光栅像素处上下移动,只有 0.1 像素的 x 坐标差异等) .

我可能会在纸上画一些图片,如果干净的数学可以做到,或者需要一些极端情况的逻辑,那么就进行大量的单元测试。


如果你想要全向量,它基本上是一样的,只是它不是每条线,而是每条边y坐标(创建虚拟线)的每一端来计算与其他边的所有交点。

实际上,这可能更容易编写,但将结果应用于光栅图像可能会更困难。恕我直言(远没有感觉“确定”,我已经很久没有这样做了)。

【讨论】:

    【解决方案2】:

    使用模板翻转应该是最有效的基于光栅的方法。执行一次以填充模板缓冲区(例如glStencilOp(GL_KEEP, GL_KEEP,GL_INVERT)),然后使用根据模板缓冲区的值设置颜色的全屏四边形进行第二次遍历(例如glStencilFunc(GL_EQUAL, 1 ,1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多