Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
37
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Программа 34. Звезда

На экране рисуется звезда с заданным числом лучей N, вписанная в окружность. Для построения звезды понадобятся некоторые математические вычисления. На рис.52 показана схема экрана, действующая на нем физическая система координат и геометрические построения, необходимые для изображения семиугольной звезды. Показан случай, когда используется драйвер VGA и действует режим работы экрана VGAHI с разрешение 640*480. Максимальная координата пикселя по горизонтальной оси в этом случае будет 639, а по вертикальной 479.

Р ис.53. Чертеж для построения звезды

Через xc, yc обозначены координаты центра звезды, R – радиус звезды. Будем нумеровать лучи, начиная с 0. Пусть нулевой луч направлен вверх. Положение лучей можно определять углом fi, отсчитываемым от вертикали. Для i-го луча этот угол будет

.

Из чертежа видно, что координаты первой вершины можно найти по формулам:

.

Координаты i-й вершины рассчитываются по аналогичным формулам, только вместо 1 нужно подставить i.

Когда рассчитаны координаты вершин, построение сводится к соединению их отрезками прямых. Если соединять соседние вершины, получится просто правильный многоугольник. Для семи вершин можно построить два вида звезды, пропуская либо два, либо три отрезка разбиения. Такая возможность в программе реализована с помощью переменной m, задающей число пропускаемых отрезков разбиения.

// Файл Star.cpp

// Программа изображает на экране правильную звезду,

// вписанную в окружность.

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

#include <iostream.h>

int main()

{

int Driver, Mode;

int xc, yc; // Координаты центра звезды

const int N = 7; // Количество лучей звезды

int m = 3; // Количество пропускаемых отрезков

const int ColorCircle = YELLOW; // Цвет окружности

const int ColorStar = LIGHTRED; // Цвет звезды

int R = 100; // Радиус окружности

double df = 2 * M_PI / N; // Угол между лучами

double f;

int x[N], y[N]; // Координаты концов лучей

int i;

Driver = DETECT; // Автоматическое определение драйвера

// Инициализация графического режима

initgraph(& Driver, & Mode, "C:\\TC30\\BGI");

if (graphresult() != grOk){ // Если ошибка,

cerr << "Не удалось инициализировать графику \n";

exit(1); // завершить программу

}

xc = getmaxx() / 2; // Координаты

yc = getmaxy() / 2; // центра экрана

for(i = 0; i < N; i++){ // Вычисление координат концов лучей

f = df * i; // Угол i-го луча

x[i] = xc + R * sin(f); // Координаты

y[i] = yc - R * cos(f); // вершины

}

setcolor(ColorCircle); // Установка цвета для окружности

circle(xc, yc, R); // Рисование окружности

setcolor(ColorStar); // Установка цвета для звезды

for(i = 0; i < N; i++) // Рисование лучей

line(x[i], y[i], x[(i + m) % N], y[(i + m) % N]);

getch();

closegraph();

return 0;

}

Обратите внимание на строку "C:\\TC30\\BGI", задающую путь к папке, в которой находятся файлы графических драйверов. В DOS и Windows принято имена вложенных папок отделять обратной наклонной чертой. Для изображения обратной наклонной черты в программе на языке C++, она удваивается.

Координаты вершин звезды хранятся в массивах x и y из N элементов. Для изображения звезды, например, при N=7 и m=3 нужно провести 7 отрезков, соединяющих следующие вершины: 0 и 3, 1 и 4, 2 и 5, 3 и 6, 4 и 0, 5 и 1, 6 и 2. Отрезки рисуются в цикле с помощью функции line. Номера начальных точек i возрастают от 0 до N-1, а номера конечных точек находятся с помощью выражения

(i + m) % N,

где % – оператор нахождения остатка от деления. В правильности данного выражения легко убедиться подстановкой.

Полученное на экране изображение показано на рис.54.

Рис.54. Звезда на экране