Как нарисовать правильный многоугольник так, чтобы одно ребро было параллельно оси X? - PullRequest
4 голосов
/ 29 марта 2011

Я знаю, что для рисования правильного многоугольника из центральной точки вы используете что-то вроде:

for (int i = 0; i < n; i++) {  
    p.addPoint((int) (100 + 50 * Math.cos(i * 2 * Math.PI / n)),
               (int) (100 + 50 * Math.sin(i * 2 * Math.PI / n))
              );
}

Однако есть ли возможность изменить этот код (без добавления поворотов), чтобы убедиться, чточто многоугольник всегда нарисован так, что самый верхний или самый нижний край параллелен линии 180 градусов?Например, обычно приведенный выше код для пятиугольника или квадрата (где n = 5 и 4 соответственно) выдает что-то вроде:

http://i.stack.imgur.com/Nv6Xf.gif http://i.stack.imgur.com/or967.gif

Когда что я 'm ищет:

http://i.stack.imgur.com/Tfxs1.gif http://i.stack.imgur.com/BIORA.gif

Есть ли какой-нибудь математический способ сделать это?

Ответы [ 2 ]

7 голосов
/ 29 марта 2011

Вы должны добавить Pi/2-Pi/n

k[n_] := Pi/2 - Pi/n;
f[n_] := Line[
   Table[50 {Cos[(2 i ) Pi/n + k[n]] ,Sin[(2 i) Pi/n + k[n]]}, {i,0,n}]];

GraphicsGrid@Partition[Graphics /@ Table[f[i], {i, 3, 8}], 3]  

enter image description here

Редактировать

Отвечая на ваш комментарий, я объясню, какЯ пришел к формуле.Посмотрите на следующее изображение:

enter image description here

Как вы можете видеть, мы хотим, чтобы средняя точка стороны была выровнена с Pi / 2.Итак ... что такое α ?Это очевидно

2 α = 2 Pi / n (одна сторона) -> α = Pi / n

Редактировать 2

Если вы хотите, чтобы нижняя сторона была выровнена по оси x, добавьте 3 Pi/2- Pi/n вместо ...

enter image description here

0 голосов
/ 29 марта 2011

Добавьте Math.PI / n к углам.

...