Построение многоугольников и примитивных объемных фигур в полярной системе координат

Использование полярных координат в построении плоских изображений графиков сложных функций, а также материал, излагающий алгоритмы и приемы построения объемных изображений, которые по простоте их получения и форме автор назвал примитивными.Подобная тема практически не представлена в литературе по программированию на TurboPascal. Занятие строятся таким образом, что после прослушивания теоретического материала (10 –15 мин.), учащимся предлагается несложное практическое задание, которое выполняется...
Раздел Информатика
Класс -
Тип Конспекты
Автор
Дата
Формат doc
Изображения Есть
For-Teacher.ru - все для учителя
Поделитесь с коллегами:

Построение многоугольников и примитивных объемных фигур в полярной системе координат


  1. Урок 1. Построение правильных выпуклых многоугольников.

  2. Урок 2. Построение правильных самопересекающихся многоугольников.

  3. Урок 3. Построение примитивных объемных фигур.

Идея построения выпуклых многоугольников вписанных в окружность проста. Для этого следует циркулем изобразить окружность, на ее дуге отметить минимум 3 точки и последовательно соединить эти точки прямыми линиями с помощью линейки. В случае равенства этих линий получаем правильные выпуклые многоугольники. Следует отметить, что окружность, построенная программой V2L05P1 и показанная на рис. 46 представляет собой правильный трехсот шестидесяти угольник.

Урок 1. Построение правильных выпуклых многоугольников

Правильным называется выпуклый многоугольник, все стороны и углы которого равны. Приведенная ниже программа позволяет это сделать (см. рис. 77 - 79). При этом необходимо отметить, что все коэффициенты следует вводить единицами.

Program V2L07P1; {Построение многоугольников в полярных координатах}

Uses Crt,Graph;

Var Gd,Gm,x,y,r,n,kk,ks:integer; i,rn,krk,krs:real;

{}

Procedure PoleGr; {Процедура формирования поля графика}

begin

SetFillStyle(1,15); {Стиль и цвет заполнения закрашенного прямоугольника}

Bar(220,140,420,340); {Построение закрашенного прямоугольника}

SetViewPort(220,140,420,340,False);

SetColor(7); {Установка цвета линий сетки}

{Цикл построения вертикальных линий сетки}

x:=0; {Начальное значение переменной шага сетки}

while x<=200 do

begin

Line(x,0,x,200); {Построение линии сетки}

x:=x+10 {Расчет шага сетки}

end;

{Горизонтальные линии сетки}

y:=0;

while y<=200 do

begin

Line(0,y,200,y);

y:=y+10

end;

{}

SetColor(0); {Цвет линий осей координат}

Line(0,100,200,100); {Ось абсцисс}

Line(100,0,100,200); {Ось ординат}

end;

{}

Procedure Dizine; {Процедура формирования дизайна графика}

begin

OutTextXY( 87, 106, '0');

SetColor(15); {Установка цвета следующих строк}

OutTextXY(106,- 10, 'Y');

OutTextXY(206, 90, 'X');

OutTextXY(205, 106,'100');

OutTextXY(-27, 0,'100');

OutTextXY(-37, 194,'-100');

OutTextXY(-37, 106,'-100');

end;

{}

begin

ClrScr;

{}

Write('Введи радиус окружности '); Read(r);

Write('Введи количество сторон многоугольника '); Read(n);

Write('Введи коэффициент при радиусе косинуса '); Read(krk);

Write('Введи коэффициент при радиусе синуса '); Read(krs);

Write('Введи коэффициент при аргументе косинуса '); Read(kk);

Write('Введи коэффициент при аргументе синуса '); Read(ks);

{Установка графического режима}

Gd:=Detect;

InitGraph(Gd,Gm,'c:\bp\bgi');

if GraphResult<>0 then Halt(1);

{}

PoleGr; {Вызов процедуры формирования поля графика}

{}

i:=-180; {Начальное значение аргумента функции}

rn:=i*Pi/180;

x:=100+Round(r*Cos(rn)); {Вычисление значения функции x}

y:=100-Round(r*Sin(rn)); {Вычисление значения функции y}

MoveTo(x,y); {Перемещение графического курсора в указанную коорд. точку}

{}

while i<=200 do {Цикл вычисления функции}

begin

rn:=i*Pi/180; {Пересчет градусной меры угла в радианную}

x:=100+Round(krk*r*Cos(kk*rn)); {Вычисление значения координаты x}

y:=100-Round(krs*r*Sin(ks*rn)); {Вычисление значения координаты y}

LineTo(x,y); {Построение отрезков кривой графика}

i:=i+360/n {Увеличение аргумента функции}

end;

{}

Dizine; {Вызов процедуры формирования дизайна графика}

{}

ReadKey;

CloseGraph;

end.

Построение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координат



Рис. 77. Правильный треугольник: Рис. 78. Правильный пятиугольник: Рис. 79. Правильный десятиугольник:

r = 80, n = 3, krk = 1, krs = 1, r = 80, n = 5, krk = 1, krs = 1, r = 80, n = 10, krk = 1, krs = 1,

kk = 1, ks = 1. kk = 1, ks = 1. kk = 1, ks = 1.

Урок 2. Построение правильных самопересекающихся многоугольников

Если стороны правильного многоугольника с числом сторон больше четырех продолжить до их пересечения, то можно получить правильный звездчатый многоугольник, а в программе V2L07P1, следуя подсказкам, ввести коэффициенты при аргументе синуса и косинуса, сумма которых должна быть равна количеству сторон многоугольника или кратна этому количеству.

Построение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координат



Рис. 80. Звездчатый пятиугольник, Рис. 81. Звездчатый десятиугольник, Рис. 82. Звездчатый десятиугольник,

вписанный в окружность: вписанный в окружность: вписанный в фигуру Лиссажу:

r = 80, n = 5, krk = 1, krs = 1, r = 80, n = 10, krk = 1, krs = 1, r = 30, n = 10, krk = 3, krs = 2,

kk = 2, ks = 3. kk = 3, ks = 7. kk = 3, ks = 2.

Урок 3. Построение примитивных объемных фигур

Задача получения объемного изображения на плоскости - перспектива, была решена художниками эпохи Возрождения: Филиппо Брунелевски (1377 - 1446), Леоном Батисто Альберти (1404 - 1472), Пьетро делла Франческа (1420 - 1492) и др.. Особое место среди них занимает Леонардо да Винчи (1452 - 1519), который сформулировал правила создания имитации пространства. По мере "удаления" от зрителя изображаемых на картине предметов с ними должно происходить:

  • уменьшение геометрических размеров (линейная перспектива);

  • изменение четкости изображения (контрастно - яркостная перспектива);

  • изменение цвета изображения на более светлый цвет (цветовая или воздушная перспектива).

Эти приемы используются в архитектуре с более точными правилами и геометрическими построениями. В машиностроении и приборостроении наряду с техническими рисунками и чертежами, которые показывают виды сторон деталей (сбоку, сверху, спереди), существуют объемные изображения этих деталей - аксонометрии, которые служат для облегчения чтения чертежа. В машиностроительном черчении эти изображения называются проекциями диметрической и изометрической, которые отличаются ракурсом и правилами их изображения на плоскости чертежа.

Построение многоугольников и примитивных объемных фигур в полярной системе координатСистема координат трехмерного изображения состоит из трех координат: X - абсцисса, Y - ордината и Z - аппликата (см. рис. 80).

Построение многоугольников и примитивных объемных фигур в полярной системе координатZ Z

Построение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координат

Построение многоугольников и примитивных объемных фигур в полярной системе координатПостроение многоугольников и примитивных объемных фигур в полярной системе координат X

Y X Y

a) b)

Рис. 83. Аксонометрические проекции: a) диметрическая проекция (углы между осями X, Y = 135 и X, Z = 90 градусов), b) изометрическая проекция (углы между осями X, Y, Z = 120 градусов).

В изображении диметрической проекции размер по оси абсцисс уменьшается в два раза. По всем остальным осям берутся размеры с чертежа видов объекта. В изображении изометрической проекции размеры по осям координат не изменяются.

Алгоритм построения на экране дисплея примитивных объемных фигур: цилиндр, конус, усеченный конус, куб, параллелограмм, призма, пирамида, весьма прост. Для этого достаточно строить изображения окружности, куба, параллелепипеда, изменяя с каждой итерацией, координаты центра окружности, радиуса окружности и линейных размеров сторон параллелепипеда или куба. При этом будем получать "прозрачные" объемные фигуры.

Program V2L07P2; {Изображение "прозрачного" цилиндра}

Uses Crt, Graph; {Вызов библиотечных модулей}

Var Gd, Gm,f :integer; {Определение целых переменных}

x,y,r,c,i,t,xz,yz,st,cz :word; {Определение целых переменных}

{}

begin

ClrScr; {Стирание экрана}

Write('Введи через пробел координаты X, Y центра окружности: ');

Read(x,y);

Write('Введи радиус окружности: ');Read(r);

Write('Введи код 0 -:-15 цвета линии окружности: ');Read(c);

Write('Введи код 3 толстой линии или любой другой - тонкая линия: ');Read(t);

Write('Введи через пробел координаты X, Y точки заполнения: ');Read(xz,yz);

Write('Введи 0 -:- 11 - код заполнения поверхности окружности: ');Read(st);

Write('Введи код 0 -:-15 цвета заполнения поверхности окружности: ');Read(cz);

{}

Gd:=0;Gm:=0; {Значения графического драйвера и модуля}

InitGraph(Gd,Gm,'c:\bp\bgi'); {Установка графического режима}

if GraphResult<>0 then Halt(1); {Проверка на ошибку инициализации}

SetLineStyle(0,0,t); {Установка толщины линии окружности}

i:=0; {Начальное значение переменной цикла}

f:=0; {Начальное значение флага}

while i<50 do {Цикл построения окружностей}

begin

SetColor(c); {Установка цвета линии окружности}

Circle(x-i,y+i,r); {Построение окружности}

if f=0 then

begin

SetFillStyle(st,cz); {Установка координат точки начала и цвета заполнения}

FloodFill(xz-i,yz+i,c); {Установка координат точки начала и цвета заполнения}

f:=1; {Установка флага}

end;

i:=i+5; {Шаг изменения координат центра окружностей}

end;

{}

ReadKey; {Задержка выполнения программы до нажатия любой клавиши клавиатуры}

CloseGraph {Закрытие графического режима}

end.

Построение многоугольников и примитивных объемных фигур в полярной системе координат

Возможный результат работы программы

Введи через пробел координаты X, Y центра окружности: 320 240

Введи радиус окружности: 50

Введи код 0 -:-15 цвета линии окружности: 15

Введи код 3 толстой линии или любой другой - тонкая линия: 1

Введи через пробел координаты X, Y точки заполнения: 320 240

Введи 0 -:- 11 - код заполнения поверхности окружности: 1

Введи код 0 -:-15 цвета заполнения поверхности окружности: 5

Рис. 84. Изображение "прозрачного" цилиндра.

Для изображения "непрозрачного" цилиндра необходимо удалять части линий окружностей, которые не должны быть видны на изображении. Для этого сначала строится окружность одним (дополнительным) цветом её линии и заливается выбранным цветом, затем строится окружность другим (основным) цветом и заливается выбранным цветом. Это делается для того, чтобы заливка продолжалась до линии окружности основного цвета. Процесс повторяется необходимое количество раз.

Program V2L07P3; {Изображение "непрозрачного" цилиндра}

Uses Crt, Graph; {Вызов библиотечных модулей}

Var Gd, Gm :integer; {Определение целых переменных}

x,y,r,c,i,t,xz,yz,st,cz :word; {Определение целых переменных}

{}

begin

ClrScr; {Стирание экрана}

Write('Введи через пробел координаты X, Y центра окружности: ');

Read(x,y);

Write('Введи радиус окружности: ');Read(r);

Write('Введи код 0 -:-15 цвета линии окружности: ');Read(c);

Write('Введи код 3 толстой линии или любой другой - тонкая линия: ');Read(t);

Write('Введи через пробел координаты X, Y точки заполнения: ');Read(xz,yz);

Write('Введи 0 -:- 11 - код заполнения поверхности окружности: ');Read(st);

Write('Введи код 0 -:-15 цвета заполнения поверхности окружности: ');Read(cz);

{}

Gd:=0;Gm:=0; {Значения графического драйвера и модуля}

InitGraph(Gd,Gm,'c:\bp\bgi'); {Установка графического режима}

if GraphResult<>0 then Halt(1); {Проверка на ошибку инициализации}

SetLineStyle(0,0,t);

i:=0; {Начальное значение переменной цикла}

while i<50 do {Цикл построения окружностей}

begin

SetColor(c-1); {Установка цвета линии окружности}

Circle(x-i,y+i,r); {Построение окружности}

SetFillStyle(st,cz); {Установка стиля и цвета заполнения поверхности окружности}

FloodFill(xz-i,yz+i,c-1); {Установка координат точки начала и цвета заполнения}

{}

SetColor(c); {Установка цвета линии окружности}

Circle(x-i,y+i,r); {Построение окружности}

SetFillStyle(st,cz); {Установка координат точки начала и цвета заполнения}

FloodFill(xz-i,yz+i,c); {Установка координат точки начала и цвета заполнения}

i:=i+5; {Шаг изменения координат центра окружностей}

end;

{}

ReadKey; {Задержка выполнения программы до нажатия любой клавиши клавиатуры}

CloseGraph {Закрытие графического режима}

end.

Построение многоугольников и примитивных объемных фигур в полярной системе координатВозможный результат работы программы

Введи через пробел координаты X, Y центра окружности: 320 240

Введи радиус окружности: 50

Введи код 0 -:-15 цвета линии окружности: 15

Введи код 3 толстой линии или любой другой - тонкая линия: 1

Введи через пробел координаты X, Y точки заполнения: 320 240

Введи 0 -:- 11 - код заполнения поверхности окружности: 1

Введи код 0 -:-15 цвета заполнения поверхности окружности: 5

Рис. 85. Изображение "непрозрачного" цилиндра.

Для изображения "непрозрачного" конуса, следует изменять не только координаты центра окружности, но радиус окружности с каждой итерацией цикла, что и происходит при работе нижеприведенной программы.

Program V2L07P4; {Изображение конуса с невидимыми линиями}

Uses Crt, Graph; {Вызов библиотечных модулей}

Var Gd, Gm :integer; {Определение целых переменных}

x,y,r,c,i,t,xz,yz,st,cz :word; {Определение целых переменных}

{}

begin

ClrScr; {Стирание экрана}

Write('Введи через пробел координаты X, Y центра окружности: ');

Read(x,y);

Write('Введи радиус окружности: ');Read(r);

Write('Введи код 0 -:-15 цвета линии окружности: ');Read(c);

Write('Введи код 3 толстой линии или любой другой - тонкая линия: ');Read(t);

Write('Введи через пробел координаты X, Y точки заполнения: ');Read(xz,yz);

Write('Введи 0 -:- 11 - код заполнения поверхности окружности: ');Read(st);

Write('Введи код 0 -:-15 цвета заполнения поверхности окружности: ');Read(cz);

{}

Gd:=0;Gm:=0; {Значения графических драйвера и модуля}

InitGraph(Gd,Gm,'c:\bp\bgi'); {Установка графического режима}

if GraphResult<>0 then Halt(1); {Проверка на ошибку инициализации}

SetLineStyle(0,0,t);

i:=0; {Начальное значение переменной цикла}

while i<50 do {Цикл построения окружностей}

begin

SetColor(c-1); {Установка цвета линии окружности}

Circle(x-i,y+i,r-i); {Построение окружности. С каждой итерацией цикла радиус уменьшается}

SetFillStyle(st,cz); {Установка стиля и цвета заполнения поверхности окружности}

FloodFill(xz-i,yz+i,c-1); {Установка координат точки начала и цвета заполнения}

{}

SetColor(c); {Установка цвета линии окружности}

Circle(x-i,y+i,r-i); {Построение окружности. С каждой итерацией цикла радиус уменьшается}

SetFillStyle(st,cz); {Установка координат точки начала и цвета заполнения}

FloodFill(xz-i,yz+i,c); {Установка координат точки начала и цвета заполнения}

i:=i+5; {Шаг изменения координат центра окружностей}

end;

{}

ReadKey; {Задержка выполнения программы до нажатия любой клавиши клавиатуры}

CloseGraph {Закрытие графического режима}

end.

Построение многоугольников и примитивных объемных фигур в полярной системе координатВозможный результат работы программы

Введи через пробел координаты X, Y центра окружности: 320 240

Введи радиус окружности: 50

Введи код 0 -:-15 цвета линии окружности: 15

Введи код 3 толстой линии или любой другой - тонкая линия: 1

Введи через пробел координаты X, Y точки заполнения: 320 240

Введи 0 -:- 11 - код заполнения поверхности окружности: 1

Введи код 0 -:-15 цвета заполнения поверхности окружности: 5

Рис. 86. Изображение "непрозрачного" конуса.

Если основанием объемной фигуры будет прямоугольник, правильный или неправильный многоугольник, то, используя вышеприведенные программы V2L07P3 и V2L07P4, можно получить призму или пирамиду. Для чего в программы следует внести коррекцию, которую авторы доверяют читателю.

Если радиус окружности менять по нелинейному закону, то получаем примитивные изображения фигур вращения .

Program V2L07P5; {Изображение фигур с нелинейным изменением радиуса окружности}

Uses Crt, Graph; {Вызов библиотечных модулей}

Var Gd, Gm :integer; {Определение целых переменных}

x,y,r,c,t,xz,yz,st,cz :word; {Определение целых переменных}

g,rn,rtf:real;

{}

begin

ClrScr; {Стирание экрана}

Write('Введи через пробел координаты X, Y центра окружности: ');

Read(x,y);

Write('Введи радиус окружности: ');Read(r);

Write('Введи код 0 -:-15 цвета линии окружности: ');Read(c);

Write('Введи код 3 толстой линии или любой другой - тонкая линия: ');Read(t);

Write('Введи через пробел координаты X, Y точки заполнения: ');Read(xz,yz);

Write('Введи 0 -:- 11 - код заполнения поверхности окружности: ');Read(st);

Write('Введи код 0 -:-15 цвета заполнения поверхности окружности: ');Read(cz);

{}

Gd:=0;Gm:=0; {Значения графического драйвера и модуля}

InitGraph(Gd,Gm,'c:\bp\bgi'); {Инициализация графического режима}

if GraphResult<>0 then Halt(1); {Проверка на ошибку инициализации}

SetLineStyle(0,0,t); {Установка типа линии окружности}

g:=0.0; {Начальное значение переменной цикла}

while g<180 do {Цикл построения окружностей}

begin

rn:=g*Pi/180; {Пересчет градусной меры угла в радианную}

rtf:=Abs(r*Sin(2*rn)); {Расчет радиуса как тригонометрической функции}

SetColor(c-1); {Установка цвета линии окружности}

Circle(Round(x-g),Round(y+g),Round(rtf)); {Построение окружности}

SetFillStyle(st,cz); {Установка стиля и цвета заполнения поверхности окружности}

FloodFill(Round(xz-g),Round(yz+g),c-1); {Установка координат начала цвета заполнения}

{}

SetColor(c); {Установка цвета линии окружности}

Circle(Round(x-g),Round(y+g),Round(rtf)); {Построение окружности}

SetFillStyle(st,cz); {Установка координат точки начала и цвета заполнения}

FloodFill(Round(xz-g),Round(yz+g),c); {Установка координат начала цвета заполнения}

g:=g+2.5; {Шаг изменения координат центра окружностей}

end;

{}

ReadKey; {Задержка выполнения программы до нажатия любой клавиши клавиатуры}

CloseGraph {Закрытие графического режима}

end.

Построение многоугольников и примитивных объемных фигур в полярной системе координат

Возможный результат работы программы

Введи через пробел координаты X, Y центра окружности: 320 240

Введи радиус окружности: 50

Введи код 0 -:-15 цвета линии окружности: 15

Введи код 3 толстой линии или любой другой - тонкая линия: 1

Введи через пробел координаты X, Y точки заполнения: 320 240

Введи 0 -:- 11 - код заполнения поверхности окружности: 1

Введи код 0 -:-15 цвета заполнения поверхности окружности: 5

Рис. 87. Изображение объемной фигуры, радиус которой меняется по синусоидальному закону.

Объемные аналогичные изображения могут быть получены при нелинейном изменении размеров основания фигур, которые не являются окружностями.

Контрольные вопросы и упражнения

  1. Что называется аксонометриями?

  2. Назовите правила построения пространственного изображения?

  3. Попробуйте вписать звездчатый многоугольник в N-лепестковую розу.

  4. Расскажите, как получить непрозрачное изображение примитивной объемной фигуры?

  5. Используя приемы, которые используются в программе V2L05P11, попробуйте "изобрести " необычные объемные фигуры.

Для заметок, ответов на вопросы и упражнения



© 2010-2022