Я пытаюсь сделать равносторонний треугольник, используя библиотеки LibGDX, но я не лучший в геометрии/тригонометрии. Я очень близко, но одна сторона слишком длинная, и я не могу понять, что не так.
Точки относятся к центру формы.
shapeX[0] = x + MathUtils.cos(radians) * Variables.lineLength;
shapeY[0] = y + MathUtils.sin(radians) * Variables.lineLength;
shapeX[1] = x + MathUtils.cos(radians - 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeY[1] = y + MathUtils.sin(radians - 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeX[2] = x + MathUtils.cos(radians + 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeY[2] = y + MathUtils.sin(radians + 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
В круге есть 2pi радианов. Чтобы получить равносторонний n-сторонний многоугольник, разделите 2pi на n частей: (2/n) pi. Вершины многоугольника будут падать на я (2/n) pi для я = 0,1,... (n-1). Так как у вас n = 3, вам нужно 0 * 2/3pi = 0pi, 1 * 2/3pi = 2/3pi и 2 * 2/3pi = 4/3pi. Но, вероятно, проще использовать цикл, чем жестко кодировать эти значения.
Кроме того, если вы хотите, чтобы кромки имели вашу linelength
, вы должны масштабировать с помощью sqrt (3)/3, чтобы найти радиус. Зачем? Длина стороны равностороннего треугольника, ограниченная единичным кругом, равна 3/sqrt (3), поэтому масштабируйте радиус на обратную сторону, чтобы получить стороны от единичной длины. Обертывая все это,
double radius = Math.sqrt(3) / 3 * Variables.lineLength;
for (int i = 0; i < 3; ++i) {
double theta = 2 * Math.PI / 3 * i;
shapeX[i] = x + radius * MathUtils.cos(theta);
shapeY[i] = y + radius * MathUtils.sin(theta);
}
Обратите внимание, что это ставит первую вершину на положительную ось x. Чтобы повернуть многоугольник, добавьте требуемое смещение к theta
. Например, чтобы иметь первую вершину на положительной оси y, используйте pi/2.