Построить в паскале правильные многоугольники вписанные и описанные около заданной окружности - Pascal
Формулировка задачи:
построить в паскале правильные многоугольники вписанные и описанные около заданной окружности
Решение задачи: «Построить в паскале правильные многоугольники вписанные и описанные около заданной окружности»
textual
Листинг программы
uses CRT, Graph, u_draw; VAR grDriver : Integer; grMode : Integer; ErrCode : Integer; XCenter, YCenter: Integer; Radius : Integer; BEGIN grDriver:=Detect; InitGraph(grDriver, grMode, 'd:/bp/bgi'); {Третий параметр - путь к файлу EGAVGA.BGI} ErrCode:=GraphResult; If ErrCode = grOk Then Begin { Графика } SetBkColor(White); {Устновка цвета фона - белый} XCenter := GetMaxX div 2; {Вычисление центра экрана по горизонтали} YCenter := GetMaxY div 2; {Вычисление центра по вертикали} Radius := YCenter div 2; {Радиус окружности = 1/4 размера экрана по вертикали} SetColor(DarkGray); {Темно-серый цвет для линий, черный = прозрачный - особенность графического режима} SetLineStyle(SolidLn, 0, ThickWidth); {Установка стиля линии - толстая} Circle(XCenter, YCenter, Radius); {Рисуем окружность} SetLineStyle(SolidLn, 0, NormWidth); {Возвращаем стиль - тонкая линия} {Рисуем синий треугольник угольник внутри окружности} DrawInOutPoly(XCenter, YCenter, Radius, 3, blue, 0); {Светлосиний треугольник вокруг окружности} DrawInOutPoly(XCenter, YCenter, Radius, 3, lightblue, 1); {пятиугольник} DrawInOutPoly(XCenter, YCenter, Radius, 5, green, 0); DrawInOutPoly(XCenter, YCenter, Radius, 5, lightgreen, 1); {восьмиугольник} DrawInOutPoly(XCenter, YCenter, Radius, 8, red, 0); DrawInOutPoly(XCenter, YCenter, Radius, 8, lightred, 1); {Ждем нажатия клавиши} ReadKey; CloseGraph; {Переход в текстовый режим} End Else WriteLn('Ошибка инициализации графики:', GraphErrorMsg(ErrCode)); END. {Код модуля} {Процедура рисования} unit u_draw; interface {Объявление подпрограммы, которой передаются параметры: координаты x и y - центра окружности радиус окружности, число вершин в многоугольнике, цвет многоугольника, если последний параметр where равен 0, то рисуется многоугольник, вписанный в окружность, если не ноль, то описывающий многоугольник} procedure DrawInOutPoly(x_center, y_center, radius, sides, color, where: Integer); implementation uses Graph; procedure DrawInOutPoly(x_center, y_center, radius, sides, color, where: Integer); var x, y: Integer; i : Integer; begin SetColor(color); {Вычисление производится по формуле: xi = x0 + R cos(fi0 + 2*pi*i/n) yi = y0 + R sin(fi0 + 2*pi*i/n) n - число вершин fi0 - начальный угол. Полагаю равным нулю x0, y0 - координаты центра R - радиус окружности, вписанной в многоугольник Для окружности, описанной вокруг многоугольника, r = R/cos(pi/n) } if where <> 0 then radius := round(radius/cos(pi/sides)); {i = 0 - Первая и последняя точка} x := x_center + radius; y := y_center; {Перемещение без риования в эту точку Перемещается, так называемый графический курсор - "текущее" положение на графическом экране Переведи обычный курсор на MoveTo и нажми Ctrl+F1 - получишь справку об операции} MoveTo(x, y); {Цикл вычисления других вершин и рисования линии от текущего положения графического курсора} for i := 1 to sides do begin x := x_center + round(radius*cos(2*pi*i/sides)); y := y_center + round(radius*sin(2*pi*i/sides)); {Коордианты очередной вершины вычислены рисуем линию из текущего положения графического курсора в вычисленную. Делается это с помощью поцедуры LineTo} LineTo(x, y) end; end; begin end.
Объяснение кода листинга программы
В представленном коде используется библиотека Graph, которая предназначена для работы с графикой в Pascal.
Главная функция DrawInOutPoly
отвечает за отрисовку многоугольника. В ней определены следующие параметры:
x_center
,y_center
- координаты центра окружности;radius
- радиус окружности;sides
- количество вершин в многоугольнике;color
- цвет многоугольника;where
- флаг, указывающий, рисуется ли вписанный или описывающий многоугольник. Внутренний цикл функции выполняет отрисовку многоугольника. Для этого используются функцииMoveTo
иLineTo
для перемещения и рисования линий между вершинами многоугольника. ФункцияDrawInOutPoly
использует следующие переменные:x
,y
- координаты текущей вершины многоугольника;i
- номер текущей вершины;R
- радиус окружности;fi0
- начальный угол;x0
,y0
- координаты центра окружности. Еслиwhere
равно 0, то рисуется вписанный многоугольник, иначе - описывающий. Для определения координат каждой вершины многоугольника используется формула для точки на окружности. В начале функции происходит установка цвета фона на белый, вычисление центра экрана по горизонтали и вертикали, а также установка радиуса окружности, равного 1/4 размера экрана по вертикали. Затем происходит вызов функцииCircle
для отрисовки окружности. Далее вызывается функцияDrawInOutPoly
с параметрами, соответствующими вписанному многоугольнику. Еслиwhere
равно 0, то радиус окружности, через которую рисуется многоугольник, делится наcos(pi/sides)
, чтобы получить радиус вписанной окружности. После этого происходит вызов функцииDrawInOutPoly
для отрисовки описывающего многоугольника. Для него параметрwhere
равен 1. В конце функции происходит ожидание нажатия клавиши с помощьюReadKey
. Если при выполнении функции возникла ошибка, то выводится сообщение об ошибке инициализации графики. В целом, код выполняет отрисовку вписанного и описывающего многоугольника на экране с использованием графической библиотеки Pascal.