JavaFx, Canvas, Тригонометрия

190
31 марта 2018, 16:17

В общем, суть задачи такая
Я хочу по заданному массиву рисовать 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);
}

Но у меня оно отображается не корректно, и с искажениями. Т.е. оно идет по самой линии окружности, но не равномерно. Я не могу понять где я допустил ошибку в формуле, или каким образом это лучше отрисовать?

Answer 1

Попробуй так:

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)
READ ALSO
Почему if-ы в цикле не идут по порядку? (Java)

Почему if-ы в цикле не идут по порядку? (Java)

Дано: монетки номиналом 25, 10, 5, 1 цент

228
что не так с pointcut?

что не так с pointcut?

На tutorialspoint приведен такой пример по спрингу:

226
JavaFX LineChart

JavaFX LineChart

Можно ли добавлять точки кликом мышкой по графику?

204
POST, PUT - Проблемы с UTF-8

POST, PUT - Проблемы с UTF-8

Запросы POST и PUT просят UTF-8Сервер выдаёт

180