В общем, суть задачи такая
Я хочу по заданному массиву рисовать n угольник(или скорее окружность) его элементов, где n - длинна массива.
x0,y0 - центр окружности, r - радиус
context.setFill(Paint.valueOf("red"));
String[] elements = ..возвращает массив.. ;
int n = elements.length;
for (int i = 1; i < n+1; i++) {
float x = (float) (x0 + Math.cos((180 * (i * 180/n)) / Math.PI) * r);
float y = (float) (y0 + Math.sin((180 * (i * 180/n)) / Math.PI) * r);
context.fillOval(x, y, 4, 4);
context.fillText(elements[i-1], x - 8, y - 8);
}
Но у меня оно отображается не корректно, и с искажениями. Т.е. оно идет по самой линии окружности, но не равномерно. Я не могу понять где я допустил ошибку в формуле, или каким образом это лучше отрисовать?
Попробуй так:
int n = elements.length;
/* вычисляем угол одной грани */
float angleBase = (float)(2 * Math.PI / n);
for (int i = 0; i < n; i++) {
/* текущий угол поворота */
float angle = angleBase * i;
float x = (float) (x0 + Math.cos(angle) * r);
float y = (float) (y0 + Math.sin(angle) * r);
/* ... */
}
Угол необходимо задавать в радианах, поэтому и была ошибка.
Функцию можно ещё оптимизировать, по идее так должно быстрее работать:
for (int i = 0, angle = 0; i < n; i++, angle += angleBase)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей