Построить в паскале правильные многоугольники вписанные и описанные около заданной окружности - 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.

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы