Grid 给定简单二维笛卡尔坐标的等边三角形网格索引

Grid 给定简单二维笛卡尔坐标的等边三角形网格索引,grid,geometry,coordinates,Grid,Geometry,Coordinates,我有一个等边三角形网格,构造如下: 现在,假设二维坐标原点是图像左下角的红点,我需要找到这个三角形网格的索引 给定输入:感兴趣点(浮点)的X和Y坐标,三角形边长和高度 需要输出:三角形的X和Y索引。(如图所示为示例索引) 获取三角形的Y(行)坐标很简单,因为它只是(给定的/三角形的高度)的整数部分,但如果不进行大量操作,我无法计算所需的X坐标。更多三角形 如果从0,0的左下角到1,0的右上角绘制一条线,则两个三角形的着色区域现在由四个直角三角形组成。从1,0的右上角往下画一条线,你会看到另一个

我有一个等边三角形网格,构造如下:

现在,假设二维坐标原点是图像左下角的红点,我需要找到这个三角形网格的索引

给定输入:感兴趣点(浮点)的X和Y坐标,三角形边长和高度

需要输出:三角形的X和Y索引。(如图所示为示例索引)

获取三角形的Y(行)坐标很简单,因为它只是(给定的/三角形的高度)的整数部分,但如果不进行大量操作,我无法计算所需的X坐标。

更多三角形 如果从0,0的左下角到1,0的右上角绘制一条线,则两个三角形的着色区域现在由四个直角三角形组成。从1,0的右上角往下画一条线,你会看到另一个直角三角形,一个由三个直角三角形组成的三角形。高度是你原来的三角形高度,宽度是1.5*三角形长度,斜边是我留给课堂练习的。 那么不管它在左三角形还是右三角形中,都是你的点截取那条线的地方。 您可以根据三角形长度预先确定其中的大部分。
另一个选择是计算平行四边形,计算它的中心,移动到原点,顺时针旋转30度,向后移动,预转换,你有一个斜边以上宽度的钻石,中间的哪一边是哪个三角形,钻石的高度是三角形长度,你仍然需要工作,否则1.0和2.0的平行图会重叠。

这里有一个更明确的答案,供有问题(或太懒)的人来计算几何体

首先将坐标缩放到方便的基础上

vec2 pos=(input-origin)/vec2(edge/2,median);
将坐标拆分为整数和小数部分

int x=pos.x, y=pos.y; float u=pos.x-x, v=pos.y-y;
测试对角线(不同奇偶校验的x,y)或反对角线边缘(相同奇偶校验的x,y)

如果不向y顶点索引中添加1,则更容易查看模式,因此最终的表格为:

00 -> 00 10 01
10 -> 11 01 10
01 -> 00 11 01
11 -> 11 00 10
每列分别为:x,x!x、 x^y,x!十,。或者,您可以简单地使用查找表

它适用于任意面索引,您只需添加(x/2,y)并在(x%2,y%2)上进行查找

最后,三角形顶点索引为:

x/2 + x%2, y + x%2; x/2 + !(x%2), y + (x%2^y%2); x/2 + (x%2), y + !(x%2)
使用原始笛卡尔空间中的顶点坐标:

origin+vec2(2*x+y%2),y)*vec2(edge/2,median)

嗨,托尼!我能理解你的意思(但“点截线”的部分…),但这对我试图用它来实现的目标毫无意义。我正在寻找一个函数,它将参数X和Y作为简单的笛卡尔坐标,原点位于图像的左上方,并将它们作为索引返回到三角形坐标中,如图所示。这是几何体的原理,用英语说有点跛行。@Mattias答案有效,我刚刚尝试过。你应该结束这个问题。
x/2 + x%2, y + x%2; x/2 + !(x%2), y + (x%2^y%2); x/2 + (x%2), y + !(x%2)
origin+vec2(2*x+y%2),y)*vec2(edge/2,median)