- •Передмова
- •Загальні теоретичні відомості
- •Області застосування комп'ютерної графіки
- •Способи формування зображень на екрані
- •Формування кольору малюнка
- •Технічні аспекти комп’ютерної графіки
- •Особливості реалізації роботи з графікою у мові Turbo Pascal 7.0
- •Математичні основи графічних побудов
- •Аффінні перетворення на площині
- •Аффінні перетворення в просторі
- •Види проектування
- •Базові алгоритми комп’ютерної графіки
- •Растрове розгорнення відрізка. Алгоритм Брезенхема
- •Заповнення суцільних областей
- •Заповнення багатокутників
- •Алгоритми заповнення області з затравкою
- •Видалення невидимих ліній і поверхонь
- •Деякі підходи до розв’язування задач загороджування
- •Тріангуляція
- •Робота II Графіки функцій у декартових координатах
- •Методичні вказівки
- •Варіанти завдань
- •Робота III Графіки функцій у полярних координатах Загальне формулювання завдання
- •Методичні вказівки
- •Варіанти завдань
- •Робота IV Побудова обмежених областей на площині Загальне формулювання завдання
- •Методичні вказівки
- •Варіанти завдань
- •Робота V Анімація двовимірних зображень
- •Методичні вказівки
- •Варіанти завдань
- •Робота VI Програмування тривимірних статичних сцен
- •Методичні вказівки
- •Варіанти завдань
- •Робота VII Моделювання зображень поверхні
- •Методичні вказівки
- •Варіанти завдань
- •Додаток а Приклади програмної реалізації графічних задач
- •Приклад 3
- •Приклад 4
- •Додаток б Графічна бібліотека компілятора Turbo Pascal 7.0
- •Драйвери
- •Система координат на екрані
- •Перетічний вказівник
- •Фігури і стилі
- •Вікна і бітові образи
- •Обробка помилок
- •Константи
- •Глосарій
- •Додаткова література
Приклад 3
Завдання: Зобразити куб (перший октант, шпиль у початку координат, ребро = 5), відсічений кулею радіусу 2 з центром у точці (5,0,5).
program example3;
Uses Crt, Graph; { Підключення бібліотечних модулів }
const num: array[1..10] of char=('1','2','3','4','5','6','7','8','9','0');
var x,y,i: integer;
edmas: integer;
Gdriver, Gmode: integer;
x1, y1, x2, y2, x3, y3: real;
xt, yt: real;
maxx, maxy: integer;
begin
DetectGraph(Gdriver, Gmode); { Визначаємо графічний режим роботи }
InitGraph(Gdriver,Gmode,' '); { Ініціюємо графічний режим }
SetBkColor(15); { Колір фону білий }
SetColor(8); { Колір зображення темно-сірий }
maxx := GetMaxX; { Визначаємо максимальні розміри экрану }
maxy := GetMaxY;
x := maxx div 2; { Обчислюємо координати центру экрана }
y := maxy div 2;
{ Вісь OX: встановлюємо поточний покажчик у центр, проводимо лінію }
MoveTo(x, y);
LineTo(maxx, y);
{ Відмічаємо масштабні одиниці та робимо цифрові позначки на осі OX }
edmas := 30;
for i:= 1 to 10 do
begin
MoveTo(x + edmas*i,y);
LineTo(x + edmas*i,y-4);
MoveTo(x + edmas*i-2,y-15);
if i = 10 then OutText('10')
else OutText(num[i]);
end;
MoveTo(maxx-30,y-30);
OutText('X');
{ Малюємо стрілку на осі OX }
MoveTo(maxx-5,y-3);
LineTo(maxx,y);
LineTo(maxx-5,y+3);
{ Аналогічно ОХ готуємо вісь OY }
MoveTo(x,y);
LineTo(x,0);
for i:= 1 to 7 do
begin
MoveTo(x, y - edmas*i);
LineTo(x+4,y - edmas*i);
MoveTo(x+8,y - edmas*i-2);
OutText(num[i]);
end;
MoveTo(x+10,0);
OutText('Y');
MoveTo(x-3,5);
LineTo(x,0);
LineTo(x+3,5);
{ Аналогічно готуємо вісь OZ }
MoveTo(edmas * 5 div 2,maxy);
LineTo(x,y);
{ масштабна одиниця на осі OZ, edmas / 2 = 15 пікселям }
for i:= 1 to 10 do
begin
MoveTo(x-edmas div 2 * i,y + edmas div 2 * i);
LineTo(x-edmas div 2 * i - 3,y + edmas div 2 * i - 4);
MoveTo(x-edmas div 2 * i -12,y + edmas div 2 * i -11);
if i = 10 then OutText('10')
else OutText(num[i]);
end;
MoveTo(55,maxy-15);
OutText('Z');
MoveTo(77,maxy-8);
LineTo(75,maxy);
LineTo(85,maxy-5);
{ Малюємо ребра куба }
SetColor(7); { колір ребра сірий }
MoveTo(x - edmas * 5 div 2, y + edmas * 5 div 2);
LineTo(x + edmas * 5 div 2, y + edmas * 5 div 2);
LineTo(x + edmas * 5 div 2, y - edmas * 5 div 2);
LineTo(x - edmas * 5 div 2, y - edmas * 5 div 2);
LineTo(x - edmas * 5 div 2, y + edmas * 5 div 2);
MoveTo(x - edmas * 5 div 2, y - edmas * 5 div 2);
LineTo(x, y - edmas * 5);
LineTo(x + edmas * 5, y - edmas * 5);
LineTo(x + edmas * 5 div 2, y - edmas * 5 div 2);
MoveTo(x + edmas * 5 div 2, y + edmas * 5 div 2);
LineTo(x + edmas * 5,y);
LineTo(x + edmas * 5,y - edmas * 5);
{ Виділяємо грані куба }
SetFillStyle(1,7);
FloodFill(x+1,y-99,7);
SetFillStyle(2,7);
FloodFill(x-48,y-48,7);
SetFillStyle(4,7);
FloodFill(x+77,y-75,7);
{ Заповнюємо область, відсічену кулею, у площині XOY кольором фону}
SetColor(15);
SetLineStyle(0,0,3);
for i:= 1 to 60 do
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 90, 180, i, i);
{ Заповнюємо відсічену область дугами сірого коліру }
SetColor(7);
SetLineStyle(2,0,1);
for i:= 1 to 15 do
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 90, 180, i*4, i*4);
{ Малюємо еліпси у площині, паралельній YOZ кольором фону}
SetColor(15);
SetLineStyle(0,0,3);
for i := 1 to 30 do
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 25, 91, i, i*2);
{ Заповнюємо відсічену частину дугами сірого коліру }
SetColor(7);
SetLineStyle(2,0,1);
for i := 1 to 15 do
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 25, 91, i*2, i*4);
{ Заповнюємо область, відсічену кулею, в площині, паралельній XOZ}
SetColor(15);
SetLineStyle(0,0,3);
for i:= 1 to 30 do
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 0, 360, 2*i, i);
SetColor(7);
SetLineStyle(2,0,1);
Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 63, 180, 60, 30);
repeat until KeyPressed;
CloseGraph; { вихід з графічного режиму }
end.
Вид зображення на екрані: