Реферат по предмету "Информатика, программирование"


Графічні роботи на комп’ютері

МІНІСТЕРСТВООСВІТИ УКРАЇНИ
Бердичівськийполітехнічний коледж
Контрольнаробота
з дисципліни“Комп’ютерна графіка”
(варіант№20)
Виконав:
студент групи Пзс-604
Лифар Сергій Олександровчи
Перевірив:
Козик Вадим Юрієвич
м. Бердичів
2009р.

/>Зміст
1.        Алгоритм побудови ліній
2.        Графічна бібліотека DirectX
3.        Практичне завдання
Список використаної літератури

/>1. Алгоритм побудовиліній
Сформувати растрове зображення можнапо-різному. Для того, щоб створити зображення на растровому дисплеї, можнапросто скопіювати готовий растр у відеопам'ять. Цей растр може бути отриманий,наприклад, за допомогою сканера або цифрового фотоапарата. А можна створитизображення об'єктів просторових сцен шляхом послідовного рисування окремихпростих елементів.
Прості елементи, які можна використати длявізуалізації об'єктів, будемо називати графічними примітивами. Фактично,зображення об'єктів складається з геометричних елементів. Тут необхідно зробититаке зауваження. Для того щоб чітко уявляти суть речей, потрібно відрізнятивізуалізацію об'єктів від опису, моделі об'єктів. Для опису об'єктів такожможуть використовуватися деякі геометричні елементи, однак це — примітиви дляопису у базі даних. Зручно, коли набір елементів опису об'єктів у базі тойсамий, як і набір графічних примітивів візуалізації — це значно спрощує процесвізуалізації. Однак, у загальному випадку, елементи опису об'єктів відрізняютьсявід графічних примітивів.
Найпростішим і, водночас, найбільшуніверсальним растровим графічним примітивом є піксел. Будь-яке растровезображення можна нарисувати за допомогою пікселах, але це складно й довго.Необхідні складніші елементи, для яких рисуються відразу декілька пікселів.
Розглянемо графічні примітиви, яківикористовуються найчастіше часто в сучасних графічних системах, — це лінії йфігури.
Алгоритми виводу прямої лінії.
Розглянемо растрові алгоритми для відрізківпрямої лінії. Припустимо, що задано координати (х1, у1 — х2, у2) кінціввідрізка прямої. Для виводу лінії необхідно зафарбувати в певний колір усіпіксели вздовж лінії. Для того щоб зафарбувати кожний піксел, необхідно знатийого координати.
Найбільш просто нарисувати відрізокгоризонтальної лінії:
for (х = х1; х
Обчислення поточних координат піксела тутвиконується як прирощення по х (необхідно, щоб х1 ≤ х2), а вивід пікселазабезпечується функцією Піксел( ). Оскільки в мові С, С++ для назви функції неможна використовувати кирилицю, то будемо далі використовувати її як коментар.
Аналогічно рисується відрізок вертикалі:
for (y = y1; х
Як бачимо, в циклі виводу горизонтальногота вертикального відрізків виконуються найпростіші операції – прирощення наодиницю, перевірка на "
Можна поставити таке запитання: яка лініярисується швидше — горизонталь чи вертикаль? На перший погляд — однаковошвидко. Якщо враховувати тільки математичні аспекти, то швидкість повинна бутиоднаковою при однаковій довжині відрізків ліній, оскільки в обох випадкахвиконується однакова кількість однакових операцій. Але, якщо окрім обчисленнякоординат аналізувати також вивід пікселів у конкретний растр, то можуть бутивідмінності. У растрових системах рисування піксела зазвичай означає записодного або декількох бітів у пам'ять, де зберігається растр. І тут вже неоднаково — по рядках чи по стовпчиках заповнюється растр. Необхідно враховуватилогічну організацію пам'яті комп'ютера, яка зберігає біти або байти растра.Навіть для комп'ютера одного типу (наприклад, персонального комп'ютера) длярізних поколінь процесорів та пам'яті швидкість запису по сусідніх адресах можесуттєво відрізнятися від швидкості запису по не сусідніх адресах. Особливо цепомітно, коли для растра використовується віртуальна пам'ять із зберіганням окремихсторінок на диску та (або) в оперативній пам'яті (RАМ). При роботі графічних програму середовищі операційної системи Windows часто трапляється так, що горизонталі рисуютьсяшвидше вертикалей, тому що в кожній сторінці пам'яті зберігаються сусідні байти— піксели вздовж горизонталі растра. Подібний ефект також мас місце при використаннікеш-пам'яті. А може бути, що RАМ достатньо, і навіть весь растр розміщується вкеші, а швидкості рисування все ж відрізняються. Наприклад, якщовикористовується чорно-білий растр у форматі один біт на піксел, то длявертикалі бітова маска однакова для всіх пікселів лінії, а для горизонталімаску потрібно змінювати на кожному кроці. Тут необхідно зауважити, щорисування чорно-білих горизонталей можна суттєво прискорити, якщо записувативідразу вісім сусідніх пікселів — байт у пам'яті.
Горизонталі та вертикалі являють собоюокремий випадок ліній. Розглянемо лінію загального виду. Для неї такожнеобхідно обчислювати координати кожного піксела. Відомі декілька методіврозрахунків координат точок лінії.
Пряме обчислення координат.
Нехай задані координати кінцевих точоквідрізка прямої. Знайдемо координати точки всередині відрізка (мал. 1).
/>

Запишемо співвідношення катетів дляподібних прямокутних трикутників:
/>
Перепишемо це співвідношення як x=f(y):
/>,
а також, як y=F(x):
/>
У залежності від кута нахилу прямоївиконується цикл по осі x або по y (мал. 2).
/>

Мал. 2. Загальна схема алгоритму виводу відрізкапрямої лінії
Наведемо приклад запису цього алгоритму накомп'ютерній мові програмування С, С++. Для скорочення тексту розглянемофрагмент програми, де виконується цикл по осі х, причому x1>x2:
for (x=x1; x
{
y=y1+((x-x1)*(y2-y1))/(x2-x1);
//Піксел (x, y);
}
Тут усі операції виконуються над цілими числами.Подвійні скобки необхідні для того, щоб ділення виконувалося після множення.Недоліки такої програми — в циклі виконується багато зайвих операцій, присутніоперації ділення та множення. Це обумовлює малу швидкість, роботи. Щодо зайвихоперацій у циклі. Можна винести обчислення (у2‑у1)/(х2‑х1) за межіциклу, оскільки це значення не змінюється. Однак для цього необхідно вжевикористовувати операції над числами у форматі з плаваючою точкою:
float k;// або double чи long double
k = (float) (y2-y1) / (float) (x2-x1);
for (x = x1; x
{
y = y1 + (float) (x – x1) * k;
// Піксел (x, y);
}
Оскільки ми вирішили використати формат ізплаваючою точкою, то спробуємо ще зменшити кількість операцій у циклі. Якщорозкрити дужки у виразі у = у1 + (х – х1) k; то' отримаємо у = у1 + х k – х1 k.Тут значення (y1- x1 k) є константою — ці операції також винесемо за межіциклу.
float yy, k;
k = (float) (y2 – y1) / (float) (x2-x1);
yy = (float) y1 – (float) x1*k;
for (x = x1; x
{
y = yy + (float) x*k;
// Піксел (x, y);
}
У циклі виконуються тільки дві арифметичніоперації й перетворення х із цілого у формат float.
Якщо розглядати цикл обчислення у, повідповідних значеннях хі = х1, х1 +1, ..., х2 як ітеративний процес, то можнапоставити таке запитання: чому дорівнює різниця (yi+1 –yi)? Вона дорівнює yi+1‑yi=x1+(xi+1‑x1)k‑x1‑(xi‑x1)k=(xi+1‑xi)k=k;оскільки xi+1‑xi=1. Різниця (yi+1 –yi) є константою, яка дорівнює k. Виходячиз цього, можна побудувати цикл таким чином:
float k;
k = (float)(y2-y1)/( float)(x2-x1);
y = y1;
for (x = x1; x
{
// Піксел (x, y);
y = k;
}
У тілі циклу е тільки одна операція дляобчислення координати у (якщо не враховувати операції "
Якщо порівнювати останній варіант ізпопереднім, то останній кращий за швидкодією. Також суттєво відрізняютьсяспособи обчислення координати у. В останньому варіанті значення у обчислюєтьсядодаванням прирощення k на кожному кроці, і на останньому кроці циклу (коли х =х2) повинно стати y = у2. Із суто математичних міркувань тут усе коректно,однак необхідно врахувати, що в програмі дробові числа репрезентуються уформаті з плаваючою точкою не точно. Окрім похибки представлення таких чисел,існує помилка виконання арифметичних операцій. Помилка залежить від розрядностімантис, і найменша – для long double, але все одно не нульова. З кожним крокомциклу помилки накопичуються, і може так статися, що у не дорівнюватиме у2 наостанньому кроці. Це необхідно враховувати при використанні алгоритму.
Позитивні риси прямого обчисленнякоординат.
Простота, ясність побудування алгоритму.
Можливість роботи з нецілими значеннямикоординат відрізка.
Недоліки.
Використання операцій із плаваючою точкою,або цілочислових операцій множення та ділення обумовлює малу швидкість. Однакце залежить від процесора, й для різних типів комп'ютерів може бути по-різному.У сучасних комп'ютерах, в яких процесори використовують ефективні засобиприскорення (наприклад, конвеєр арифметичних операцій з плаваючою точкою), часвиконання цілочислових операцій вже не набагато менший. Для старих комп'ютеріврізниця могла складати десятки разів, тому й намагалися розробляти алгоритмитільки на основі цілочислових операцій.
При обчисленні координат додаваннямприрощень може накопичуватися помилка обчислень координат.
/>2. Графічна бібліотекаDirectX
Що таке DirectX? Відповідь на це запитаннядамо такою цитатою. DirectX — це набір низькорівневих програмних інтерфейсів(АРІ) для створення ігор та інших швидкісних мультимедійних програм.Розробником DirectX є Microsoft.
Надамо загальний перелік основнихкомпонентів DirectX та їхнє призначення.
Direct3D — підтримка 3D-графіки.
DirectАпітаtіоп — створення анімаційнихефектів.
DirectDraw — швидка двовимірна графіка наоснові прямого доступу до відеопам'яті.
DirectInput — підтримка периферійнихпристроїв — джойстика, миші, клавіатури тощо.
DirectXMusic — обробка музичних даних.
DirectРІау — модемна комунікація й мережніінтерфейси програмування ігор.
DirectSetup — простий АРІ для встановленнякомпонентів DirectX.
DirectShow — відтворення ущільнених аудіо-та відеоданих.
DirectSound — програмування звуку і йоговідтворення.
Тут необхідно зауважити, що складкомпонентів та їхні назви змінюються відповідно до версій DirectХ.
Можна відзначити швидку зміну версій DirectХ(особливо їхніх номерів). Суттєвим моментом є сумісність — програми, щорозроблені для старих версій, коректно виконуються у середовищі нових версій DirectХ.
Поява DirectХ пов'язується із ОС Windows 95OSR2. Окрім підтримки ігрових та мультимедійних програм, DirectХ інтегрується вопераційну систему для її внутрішніх потреб, наприклад, для підтримкиграфічного інтерфейсу користувача. Кожна наступна версія Windows, як правило,постачається з відповідною версією DirectХ, проте, передбачена можливістьвстановлення нових версій DirectХ і на старі операційні системи.
Зробимо короткий огляд версій DirectХ.Розпочнемо із сьомої версії. Можна зазначити, що DirectХ 7 забезпечив доступ доусіх апаратних можливостей графічних процесорів сучасних відеоадаптерів(геометричні розрахунки, освітлення, мультитекстурування та bump-текстури,антіаліасінг тощо). Багато комп'ютерних ігор використовували інтерфейсиDirectDraw та Direct3D сьомої версії. Проте, впровадженню DirectХ 7 у широкупрактику програмістів заважала надзвичайна складність програмування цьогоінтерфейсу. Багато хто віддавав перевагу OpenGL, що має набагато простіший та зрозумілішийінтерфейс (і це незважаючи на те, що Microsoft у своїх операційних системахявно робить преференцію для DirectХ).
З появою графічних процесорів, якіпідтримують шейдери (наприклад, АТІ Radeon 8500), стає актуальним удосконаленняDirectХ. Вже гостро відчувається обмеженість фіксованого конвеєра графічнихкоманд, DirectХ повинен забезпечити доступ до програмованого конвеєра шейдернихмікропрограм GPU.
Восьма версія DirectХ (кінець 2000 р.) булазначним кроком еволюції. З'явилася не тільки підтримка шейдерів, але суттєвозмінилася загальна архітектура DirectХ. Зі складу DirectХ зник DirectDraw, ізамість Direct3D зявився DirectX Graphics, який містить також функціїколишнього DirectDraw. Завдяки цьому суттєво спростився інтерфейс дляпрограмістів.
Версія DirectX 8.1 постачається у складіWindows XP та інших сучасних ОС. Основні відмінності від попередньої версії 8.0– подальший розвиток шейдерних можливостей. Проте, мова програмування шейдерівє асемблероподібною й, отже, недуже зручною.
Наприкінці 2003 року з'явився DirectX 9.Головна відмінність – високорівнева мова програмування шейдерів.
Як дізнатися, яку версію DirectXвстановлено на вашому комп’ютері? Для цього запустіть програму DxDiag.exe. цяпрограма знаходиться у папці Windows\System або Windows\System32 (у залежностівід ОСWindows). Для отримання інформації про апаратні можливості вашоговідеоадаптера ви можете використати таку програму, як 3DMark.
Є можливість оновлювати DirectX накомп’ютері. Для цього можна встановити необхідні файли, які поділяються на двічастини: runtime-файли і SDK (Software Developr Kit). Для розробки програмнеобхідні усі файли, а для запуску програм DirectX досить лише runtime-файлів.
SDK DirectX містить усі файли, необхіднідля розробки програм, у першу чергу, це – файли заголовків (*.h) та бібліотеки длякомпіляторів (*.lib). крім того, до складу SDK також входить ряд прикладів програмта документація для розробки.
/>3. Практичне завдання.
Приклад файлу форми Delphi3 для побудовисфери:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,
OpenGL, Menus;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; varKey: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure FormKeyPress(Sender: TObject; varKey: Char);
private
DC: HDC;
hrc: HGLRC;
ry: GLfloat;
tx: GLfloat;
end;
var
frmGL: TfrmGL;
mx,my:byte;
implementation
uses DGLUT;
{$R *.DFM}
procedure TfrmGL.FormPaint(Sender:TObject);
begin
glClear (GL_COLOR_BUFFER_BIT orGL_DEPTH_BUFFER_BIT);
glPushMatrix;
glScalef (my/mx, my/mx, my/mx);
glRotatef (ry, 0.0, 1.0, 0.0);
glTranslatef (tx, 0.0, 0.0);
glutSolidSphere (1.5, 20, 20);
glScalef (mx/my, mx/my, mx/my);
glPopMatrix;
SwapBuffers(DC);
end;
procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW orPFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc,@pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
procedure TfrmGL.FormCreate(Sender:TObject);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0);
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glColor3f (1.0, 0.0, 0.0);
ry := 0.0;
tx := 0.0;
mx:=10;
my:=10;
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender:TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
If Key = VK_LEFT then begin
ry := ry + 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_RIGHT then begin
ry := ry — 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin
tx := tx — 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin
tx := tx + 0.1;
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormResize(Sender:TObject);
begin
glViewport(0, 0, ClientWidth,ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -5.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(70.0, 0.0, 1.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormKeyPress(Sender:TObject; var Key: Char);
begin
if key = '-' then mx:=mx+1;
if key = '+' then mx:=mx-1;
InvalidateRect(Handle, nil, False);
end;
end.
/>/>

Список використаної літератури
1.        Тихомиров Ю. В. Программирование трехмерной графикив Visual C++. — Санкт-Петербург, 1998.
2.        Майкл Янг. Программирование графики в Windows 95:Векторная графика на языке С++. 1997.
3.        Шикин А. В., Боресков А. В. Компьютерная графика.Динамика, реалистические изображения. 1998.
4.        Конспект лекцій.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.