这是一个更明确的答案,适用于有问题(或太懒)无法弄清楚几何形状的人。
首先将您的坐标缩放到方便的基础
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)