Есть правильный шестиугольник разбитый на равносторонние треугольники как на рисунке. Нажмите для просмотра прикрепленного файла
Координаты некоторых точек я указал. Все пляшет от величины а - расстояния от центра до удаленной вершины.
И есть точка с координатами x,y которая находится где-то в гексагоне. Задача - определить, в каком треугольнике 1-24 она находится.
Возможно Вы скажете "просто", но есть ограничения - задача будет решаться на микроконтроллере, поэтому просто "взять тангенс от x/y" и т.д. не получится. Умножать на любое число и делить на константу можно, но корень, тригонометр функции и деление на число - нельзя. Число а - сравнительно медленно измеряемая величина, поэтому от нее корень и деление можно использовать.
Пока есть и работает алгоритм определения треугольников 1-18, но с добавлением внутренних треугольников - проблема.
Вот как я делаю:
Код
%% Quarter calculation and rotation
if X<0
X=-X;
Xinv=1;
else
Xinv=0;
end
if Y<0
Y=-Y;
Yinv=1;
else
Yinv=0;
end
%% Triangle calculation
Xshift=X-a/4;
if (Y<(a*sqrt(3)/4)) %If Y less than half height then point is in triangle 1 or 2
Yshift=Y+a*sqrt(3)/4;
if (Yshift>sqrt(3)*Xshift)
triangle=2;
else
triangle=1;
end
else %otherwise it is in triangles 3, 4 or 5
Yshift=Y-a*sqrt(3)/4;
if (Xshift==0)
triangle=4;
else
if (Xshift<0)
if Yshift>(-sqrt(3))*Xshift
triangle=4;
else
triangle=5;
end
else
if (Yshift>sqrt(3)*Xshift)
triangle=4;
else
triangle=3;
end
end
end
end
if X<0
X=-X;
Xinv=1;
else
Xinv=0;
end
if Y<0
Y=-Y;
Yinv=1;
else
Yinv=0;
end
%% Triangle calculation
Xshift=X-a/4;
if (Y<(a*sqrt(3)/4)) %If Y less than half height then point is in triangle 1 or 2
Yshift=Y+a*sqrt(3)/4;
if (Yshift>sqrt(3)*Xshift)
triangle=2;
else
triangle=1;
end
else %otherwise it is in triangles 3, 4 or 5
Yshift=Y-a*sqrt(3)/4;
if (Xshift==0)
triangle=4;
else
if (Xshift<0)
if Yshift>(-sqrt(3))*Xshift
triangle=4;
else
triangle=5;
end
else
if (Yshift>sqrt(3)*Xshift)
triangle=4;
else
triangle=3;
end
end
end
end
Таким образом я разбираюсь только с одной четвертью, а остальные треугольники получаю, просто поворачивая координаты точки.