【问题标题】:Find regular grid cells intersecting arbitrary shaped quadrilateral找到与任意形状四边形相交的规则网格单元
【发布时间】:2019-02-22 06:42:49
【问题描述】:

我需要找到与任意形状四边形相交的网格单元的所有索引[x, y],由其角坐标定义;

  • 网格单元格是带有128 x 128 px 的图块
  • 网格单元格具有介于 [-nx, -ny][nx, ny] 之间的整数索引
    (最大扩展是带有 (2nx * 128) * (2ny * 128) px 的正方形)

  • 四边形由角点定义,像素空间中的坐标(qx, qy)(tl, tr, br, bl)

  • 这被集成在一个 three.js 场景中:
    • 角点/坐标是从基础THREE.PlaneBufferGeometry上的摄像头投射的

如何在 JavaScript 中以高效计算的方式获取所有相交图块?

现在我通过使用mx + b 以瓷砖尺寸(128px)作为步骤遍历每个四边形边来计算周长瓷砖;从那里,我只是逐行添加内部瓷砖索引。但这有点笨拙,这可能是也可能不是编码技能问题。我将尝试使用 THREE.Raycaster 来获取周边图块索引,但还不确定如何。

我正在寻找更好的算法解决方案;基本公式、伪代码、想法或确定的解决方案。

【问题讨论】:

  • @Mbo 非常感谢! ...我只是快速阅读,还不能真正完全掌握它:我想的第一件事是我是否可以/应该从像素空间移动到索引空间(让图块索引与角点相交)并实现直接抬头。或者这不是真的相关吗?
  • 在像素坐标和[column, row] 索引单元格中工作 - 下一个单元格的索引与当前单元格的索引相差一个
  • @MBo 确实,“标准化”差异是我的目标。再次感谢,我会赞成你的链接答案;如果你愿意,在这里添加一个,这似乎是要走的路,或者如果我实现了我会发布我的解决方案

标签: javascript performance three.js geometry computational-geometry


【解决方案1】:

为了有效地找到被四边形边缘相交的网格单元,您可以使用 Woo 和 Amanatides 网格遍历算法:文章"Fast Voxel Traversal Algorithm..."
实际实现在grid traversal部分here
示例:

对于凸四边形的内部单元格:在边遍历期间,记住行中最左边的单元格作为“右”边,最右边的单元格作为“左”边,并填充它们之间的水平间隙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2012-12-06
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多