基于方形瓷砖直角三角形象限的坐标系中的边界框

时间:2012-12-05 19:51:06

标签: algorithm math data-structures language-agnostic geometry

我正在为游戏创建一个基于图块的2D地形系统。但是,我也在使用游戏内坐标,需要能够将边界框映射到“平铺坐标”并点击边界框触摸的每个平铺(不要担心,有一个kd树,所有这些工作精细)。使用固定点“真实世界”坐标,我可以使每个图块计数为2 ^ n,并简单地右移位以截断到图块坐标。我使用最小的x,y对和最大的x,y对形成一个边界框。我会分别称他们为R0R1

这是一个边界框,其中R0: 0.8, 0.7R1: 2.2, 1.7坐标被映射到图块。

enter image description here

现在,这很简单。但是,我想将我的瓷砖分成4个三角形象限,这让我可以制作出更有趣的东西。由于每个图块变成4个三角形,我假设它们可以以某种方式被2位引用(不一定是我显示的那个)。我想使用尽可能少的位来“标记”这些三角形。我将把我的三角形标签放在瓷砖坐标旁边的一个点上,形式为[XX],XX是表示它是哪个三角形的位。

enter image description here

但是,我遇到了几个使用它的问题。我需要能够将我的真实世界边界框坐标转换为“三角坐标”,但看起来它有点太过于无法完全描述边界框。三角形中的相同坐标可以描述与不同三角形碰撞的边界框。

我在左侧拥有与之前相同的第一个边界框:R0: 0.8, 0.7R1: 2.2, 1.7
在右侧,我有一个新的边界框R0: 0.8, 0.3R1: 2.2, 1.7,因此左上角的y分部向上移动。它们都转换为相同的三角形坐标,但如果在真实世界坐标中完成,则会与不同的三角形碰撞。但是,三角坐标没有区别,因此数据会丢失并产生一组错误的碰撞。

enter image description here

此外,在同一个三角形中开始和结束的边界框也会出现同样的问题。相同的三角形坐标描述有时完全在该三角形中的边界框,有时不是。

enter image description here

必须有一种方法来映射这些,可能使用更多位,以便在kd树范围查询中执行的所有三角坐标比较可以匹配真实世界边界框将如何与现实世界中的那些相同三角形碰撞坐标。但我不知所措。

我沿着兔子洞走下来创建“子瓦片”,将每个瓦片分成4个轴对齐的正方形,这也是沿着它穿过的轴将每个象限瓦片分成2个,因为我注意到很多情况是由不知道造成的我的坐标映射到的每个三角形的哪一边。

enter image description here

但是当我在异常之后遵循异常更详细的规则时,我最终最终将我的子瓦片转换为相同的4个三角形象限设计并最终到达我开始的地方,除了较小的瓷砖。

我知道只有 可以实现这种“压缩”并进行适当的比较,但每当我尝试时我都会继续进行。怎么办?

修改
Alexey proposed a solution允许我描述一个边界框,但它与使用kd-tree找到边界框重叠是不兼容的。使用我的kd-tree(存储左上角和右下角coords)范围查询和搜索区域[x0, y0], [x1, y1],我执行范围查询:

[0, 0, x1, y1][x1, y1, xmax, ymax]

但即使我试图补偿8维坐标,Alexey的解决方案也无法解决这个问题。

我真的不介意坐标系是否与我最初考虑的不同,只要它仍然能够与三角形象限表现出相同的结果。

1 个答案:

答案 0 :(得分:2)

似乎你需要的最小细分是每个方格到八分圆的细分。每个方格应分为两个对角线和水平和垂直中线。如果对于框的每个角落(不仅仅是左上角和右下角,而是所有四个角落),您可以存储最终找到哪个磁贴的八分圆,您将获得足够的信息来查找与所有原始三角形瓷砖碰撞(但不与所有八分圆形碰撞)。