Вот более четкий ответ для людей, имеющих проблемы (или слишком ленивые), чтобы выяснить геометрию.
Сначала масштабируйте ваши координаты на удобной основе
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)