给出简单的2D笛卡尔坐标,在等边三角形网格中索引

时间:2011-11-07 23:04:02

标签: grid geometry coordinates

我有一个等边三角形网格,如下所示:

enter image description here

现在,鉴于2D坐标原点是图像最左下方的红点,我需要在这个三角形网格中找到索引。

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

需要输出:三角形的X和Y索引。 (图中看到的样本索引)

得到三角形的Y(行)坐标很简单,因为它只是(GivenY / TRIANGLE_HEIGHT)的整数部分,但我无法计算所需的X坐标,而无需进行大量操作。

2 个答案:

答案 0 :(得分:2)

这是一个更明确的答案,适用于有问题(或太懒)找出几何图形的人。

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

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)

if(x%2 ^ y%2) { if(v+u<1) x--; } else { if(v-u>0) x--; }

这就是它(x,y)现在是你的面部索引。

查找每个面的顶点索引要多一些。

您有四种情况,以下是每个面的CCW顶点索引列表:

face  vertices
xy    xy xy xy
00 -> 00 10 01
10 -> 11 01 10
01 -> 01 12 02
11 -> 12 01 11

如果不向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。或者,您只需使用查找表即可。

它适用于任意面部索引,你只需要添加(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)

答案 1 :(得分:0)

更多三角形 如果从0,0的左下角绘制一条直线到1.0的右上角,则两个三角形的阴影现在由四个直角三角形组成。从1.0的右上角向下放一条线你最后用另一个直角三角形和一个由三个直角三角形组成的三角形高度是你原来的三角形高度,宽度是1.5 *三角形长度,斜边我留下来做练习班级。 那么它是在左三角形还是右三角形是你的点截取那条线的地方。 您可以根据三角形长度预先确定大部分内容。 另一种选择是计算出平行四边形,计算它的中心,将其移动到原点,顺时针旋转30度,向后移动,预制变换,你有一个宽度在上面的斜边的钻石,中间的哪一边是哪个三角形,钻石的高度是三角形长度,你仍然需要工作或1.0和2.0的平行重叠。