Приблизительное положение на окружности для n точек

Я борюсь со следующей проблемой: мне даны n точки и радиус, и я должен разместить их на окружности как можно симметричнее.

В настоящее время я использовал что-то вроде этого:

float theta = 360.0f / n;
int i = 0;
for (Word w : e.getValue()) {
    double newX = Math.sin(theta * i) * RADIUS + I_OFFSET_X;
    double newY = Math.cos(theta * i) * RADIUS + I_OFFSET_Y;
    mxCell v2 = (mxCell) graph.insertVertex(parent, null, w.getValue(), newX, newY, OW_WIDTH, OW_HEIGHT,"shape=ellipse");
    graph.insertEdge(parent, null, "", v1, v2);
    i++;
}

где n — количество моих баллов.

Это отлично работает для достаточно большого n, но, например, для n=3 я получаю что-то вроде:

n=3

Я действительно хотел бы иметь что-то вроде:

введите здесь описание изображения

(плохие навыки рисования - это плохо..)

В общем, что-то настолько симметричное, насколько это возможно, было бы здорово.

Любые подсказки о том, как решить эту проблему?

Спасибо ‹3


person Alexandr    schedule 02.05.2015    source источник
comment
Что это за язык? (И, возможно, имеет значение, какая графическая библиотека?) Действительно ли она использует степени для sin и cos, как вы предполагаете?   -  person Jongware    schedule 02.05.2015
comment
Java и jgraphx и да, я предполагаю, что они работают с степенями, но я действительно могу ошибаться   -  person Alexandr    schedule 02.05.2015
comment
Что ж, это было легко. docs.oracle.com/javase/7/docs/ api/java/lang/Math.html: cos .. Параметры: a - угол в радианах.   -  person Jongware    schedule 02.05.2015
comment
эпический фейспалм на моей стороне. конечно, это сработало. спасибо!   -  person Alexandr    schedule 02.05.2015


Ответы (1)


Благодаря Jongware ответ был очевиден. Поскольку я имею дело с Java, все параметры sin/cos должны быть в радианах. Исправить:

double newX = Math.sin(Math.toRadians(theta * i)) * RADIUS + I_OFFSET_X;
double newY = Math.cos(Math.toRadians(theta * i)) * RADIUS + I_OFFSET_Y;

Работает как шарм

person Alexandr    schedule 02.05.2015