Френсис Хилл

Рис. 3.30. Примеры п-угольников Вершины я-угольника лежат на так называемой порождающей окружности (parent circle) данного и-угольника, и их расположение легко вычисляется. Случай шестиугольника (гексагона) показан на рис. 3.31; его вершины расположены на одинаковом расстоянии через каждые 60° по окружности. Центр порождающей окружности радиуса R (на рисунке она не показана) находится в начале координат, а первая вершина Р0 лежит на положительной части оси х. Другие вершины располагаются следующим образом: Р. = (Rcos(ia), Rsin(ia)), для і = 1,5, где а = л/3 радиан. Аналогично вершины и-угольника общего вида располагаются так:

P.-(R cos(2ni/n), R sin(2ra'/«)), для і = 0.....n-1. (3.6)

Данный я-угольник легко модифицировать. Для того чтобы его центр имел координаты (сх, су), необходимо только добавить сх и су к координатам х и у соответственно. Для масштабирования и-угольника в 5 раз необходимо просто умножить R на 5. Для поворота на угол А необходимо просто прибавить А к аргументу при cos( ) и sin( ). Более общие методы осуществления геометрических преобразований рассматриваются в главе 5.

Легко реализовать подпрограмму, рисующую и-угольник, как это показано в листинге 3.12. Здесь и-угольник нарисован с центром в (сх, су), его радиус равен radius, он повернут на rotAngle градусов.

Глава 3. Дополнительные инструменты для рисования

Френсис Хилл

Рис 3.31. Нахождение вершин 6-угольника Листинг 3.12. Построение п-угольника в памяти

void ngon(int п. float ex. float су. float radius, float rotAngle) {

// assumes global Canvas object, cvs

// принимает глобальный объект класса Canvas - cvs

if(n < 3) return; // bad number of sides // недопустимое число сторон

double angle - rotAngle * 3.14159265 / 180; // initial angle // начальный угол

double anglelnc - 2 * 3.14159265 /n; // angle increment // увеличение угла

cvs.moveToCradius * cos(angle) + ex.radius * sin(angle) + cy);

for(int k - 0: k < n; k++) // repeat n times // повторяем n раз

{

angle +- anglelnc:

cvs.lineTo(radius * cos(angle) + ex. radius * sin(angle) + cy);


⇐ Предыдущая| |Следующая ⇒