Построение многоугольников и примитивных объемных фигур в полярной системе координат
Построение многоугольников и примитивных объемных фигур в полярной системе координат
Урок 1. Построение правильных выпуклых многоугольников.
Урок 2. Построение правильных самопересекающихся многоугольников.
Урок 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. Изображение объемной фигуры, радиус которой меняется по синусоидальному закону.
Объемные аналогичные изображения могут быть получены при нелинейном изменении размеров основания фигур, которые не являются окружностями.
Контрольные вопросы и упражнения
Что называется аксонометриями?
Назовите правила построения пространственного изображения?
Попробуйте вписать звездчатый многоугольник в N-лепестковую розу.
Расскажите, как получить непрозрачное изображение примитивной объемной фигуры?
Используя приемы, которые используются в программе V2L05P11, попробуйте “изобрести ” необычные объемные фигуры.
Для заметок, ответов на вопросы и упражнения
Построение многоугольников и примитивных объемных фигур в полярной системе координат. Занятие 8
13PAGE 147015
Заголовок 1Заголовок 2Заголовок 3Заголовок 415