2011-11-07 65 views
2

我有这样构建的等边三角形网格:索引在正三角形网格给出简单的2D笛卡尔坐标

enter image description here

。现在,因为二维坐标原点是在非常左下角的红点图像,我需要找到这个三角形网格的索引。 X和三角形的Y索引:

鉴于输入:兴趣点(浮点),三角形边的长度和高度

需要输出的X和Y坐标。 (样本索引图像所示)

获得Y(行)三角坐标很简单,因为它是(GivenY/TRIANGLE_HEIGHT)只是整数部分,但我不能让周围的计算没有做对多业务所需的X坐标。

+0

@Mattias回答的作品,我只是尝试它。你应该关闭这个问题。 –

回答

0

更多三角形 如果您从0,0的左下角绘制一条直线到1,0的右上角,则两个三角形的阴影部分现在由四个直角三角形组成。从右上角掉下一条直线,最后一个直角三角形和一个由三个直角三角形组成的三角形高度是您原来的三角形高度,宽度是1.5 *三角形长度,斜边我离开去练习班上。 那么无论是在左边还是右边的三角形都是你的点拦截那条线的地方。 您可以根据三角形长度预先确定大部分。 另一个选择是计算平行四边形,计算它的中心,将它移动到原点,顺时针旋转30度,向后移动,预变换,您有一个宽度为上述斜边的菱形,中间的哪一边是哪个三角形,钻石的高度是三角形的长度,你仍然需要工作,或者平行图像1.0和2.0会重叠。

+0

嗨,托尼!我可以理解你在说什么(但是“点拦截线”的部分......),但是在我试图用这个完成的事情中没有任何意义。我正在寻找一个函数,将参数X和Y作为原点位于图像最左上角的简单笛卡尔坐标,并将它们作为索引返回到三角坐标中,如图中所示。 – Shuun

+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 

它更容易看到这个模式,如果你不加1到Y顶点索引,因此,最终的表:

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) 
相关问题