МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
Кафедра САПР
Звіт
до графічно-розрахункової роботи
з курсу “Геометричне моделювання у конструюванні інженерних обєктів і систем”
Список скорочень
ADI ( Autodesk Device Interface )- Інтерфейс пристроїв фірми Autodesk
AGP ( Accelerated Graphics Port ) - Прискорений графічний порт. Нова графічна підсистемна архітектура, розроблена фірмою Intel. Пропускна спроможність AGP в чоти Розроблено алгоритм афінних перетворень геометричних елементів об’єкту та запрограмовано анімацію. Реалізовано програмно з використанням OpenGL.
ри рази вище, ніж у PCI.
ALPHA-BLENDING ( альфа - змішення ) - Обєднує два зображення з різними рівнями прозорості таким чином, що одне зображення стає видимим через інше. Прозорість обьектов визначається їх альфою-значенням або альфою-рівнем. Використовується для отримання тонових ефектів ( туман, скло, дим, вода і інш.)
ALPHA-CHANNEL ( альфа - канал ) Механізм передачі характеристик кольору, доповнюючий стандартну RGB - палітру. Визначає властивості прозорості обьектов. Звичайно має 8 біт: 0 - абсолютна прозорість, 255 - повна светонепроницаемость. Багато які графічні плати мають спеціальний альфу-буфер.
ANTI-ALIASING ( згладжений ) Усунення нерівностей країв малюнка ( лінії "сходинок" ) за рахунок того, що колір крайніх пікселів контура інтерполюється з кольором фонових пікселів. Простіше: "сходинки" відтіняються з розмазування їх країв.
ATTENUATION ( ослаблення ) Ослаблення світла з відстанню. Обьект, що знаходиться ближче, буде і освітлюватися яскравіше. Додає сцені більше реалізму.
AVI ( Audio Video Interleave ) Формат файлів для запису відео. Інформація про звук і зображення постійно чергується.
AXONOMETRIC ( аксонометричний )Вигляд проекції. Відхилений від перпендикуляра, відображає більше однієї сторони ( перекошений ). Варіанти: ізометричний і ортографический види.
BLINN SHADING ( rendering ) - Варіант Фонга ( Phong ). Відрізняється тільки методом відображення полисків.
BLUR ( змазування ) - Змазування ( розмивання ) обьектов. Частіше застосовується для посилення або підкреслення ефекту руху. Використовує в одному кадрі одночасно декілька проміжних стадій руху.
BOOLEARN OPERATIONS ( булевы операції )Застосовуються в моделюванні для отримання нових обьектов, що утворюються при компонуванні ( відніманні/перетині/обьединений ) старих.
BSP ( Binary Separation Planes ) Площини двійкового відсікання. Застосовуються для спрощення обчислень, пов'язаних з z - буфером. Обчислення проводяться не для кожного пікселя, а відразу для дискретної групи пікселів, розділених BSP.
CGI ( Computer Generated Image ) Зображення, створене на комп'ютері.
CLIPPING ( подрезка )Усуває будь-які зображення, що відображаються поза приреченою формою (багатокутника).
CONSTANT SHADING ( rendering ) Майже аналог методу flat ( трохи відрізняється техніка обчислення полисків ).
DECAL ( деколь / "перевідна картинка" ) Єдиний відбиток бітової карти - протилежність tile. На одній растровій картинці зібрано декілька зображень, кожне з яких повинно попасть на певну частину обьекта ( грань ).
DEPTH CUEING Зміна яскравості і кольору об'єкта в залежності від відстані до спостерігача. Чим далі об'єкт від спостерігача, тим більше він зливається з фоном.
DIGITAL (EN)CODING ( цифрове кодування ) 1) Обробка цифрового сигналу з метою скорочення спектра. 2) Аналогово-цифрове перетворення з урахуванням спектральних характеристик аналогового сигналу, можливостей систем цифрової передачі і інших чинників. Різновиди:
DIGITAL DECODING ( цифрове декодування ) 1) Відновлення аналогового сигналу з цифрового зі стислим спектром.
2) Цифрово-аналогове перетворення з урахуванням властивостей аналогового сигналу, що отримується.
DIME ( DIrect Memory Execute ) Прямий доступ до пам'яті. Один з важливих компонентів стандарту AGP. Текстуры тепер можуть оброблятися в основній пам'яті без зниження продуктивності.
DIRECT X Набір API ( інтерфейсу програмування додатків ), розроблений фірмою Microsoft. Складається з трохи компонент, кожна з яких відповідає за доступ до певного пристрою. Для графіки: DirectDraw (2D) і Direct3D.
DISSOLVE ( розчинення ) Поступове змішення двох клипов з плавним переходом один в одну. Зустрічається в будь-якій програмі відеомонтаж ( може мати назву crossfade ).
DITHERING ( прорідження / підмішування / тремтіння ) Замінюючи комбінації кольорів, ви можете отримати такі кольори, яких немає. Наприклад, якщо ваш комп'ютер дозволяє відображати тільки 256 кольорів і ви завантажуєте зображення, що використовує 65,000 кольорів, ваш комп'ютер може створити заміни для кольорів, які не можна отримати, комбінуючи доступні кольори. Колірна якість прорідженого зображення нижче, ніж звичайного ( non-dithered ). Простіше: створення нових кольорів шляхом змішування декількох. 256 кольорів можна перетворити в 65,000. Але результат буде виглядати не зовсім натурально.
DOUBLE BUFFERING ( подвійна буферизация ) Метод, що дозволяє комп'ютеру працювати із зображенням двома різними шляхами одночасно. Під час виведення вже сформованого, ваша відеокарта обробляє наступне зображення в потоку. Подвійна буферизация дозволяє зробити відтворення відео або многокадровых файлових форматів більш гладким. Простіше: пам'ять розбивається на дві частини. У одній відбувається визуализа- ция ( render ), в іншій організовується буфер кадру ( frame buffer ). Зображення виводиться повністю, а не частинами.
DUMMY OBJECT Допоміжний обьект, использеумый для анимации або моделювання. На остаточній визуализации не видно. Полегшує доступ до дрібним обьектам, утворюючи з ними зв'язок. Часто використовується в ієрархіях.
DVE ( Digital Video Effects ) Цифрове відео ефекти.
DVI ( Digital Video Interactive ) "Цифровий видео_диалоговый" формат. Стандарт фірми Intel для запису змішаної інформації на оптичний диск з дуже високою мірою її стиснення.
DXF; DWG Формат файлів AutoCAD.
Вступ
Зміст понять “модель”, ”моделювання” в різних сферах науки та техніки надзвичайно різноманітний. Але незважаючи на це можна виділити одну суттєву спільну властивість: модель завжди в тій чи іншій мірі імітує або заміняє оригінал. Цей факт дає нам можливість стверджувати, що певний об'єкт А є моделлю об’єкта В відносно деякої системи характеристик (властивостей), якщо А будується(вибирається) для імітації (заміни) В за цими характеристиками. З цієї точки зору моделювання можна розглядати як процес побудови моделей, точніше процес представлення об'єкта-оригінала адекватною моделлю та проведення дослідження цієї моделі з метою отримання певної інформації про оригінал. З філософської точки зору під моделюванням розуміють процес опосередкованого пізнання дійсності. Слід відзначити, що в процесі моделювання модель виступає одночасно і як засіб, так і об'єкт досліджень, який знаходиться у певному відношенні подібності до модельованого об'єкту. Подібність – це взаємно-однозначна відповідність між двома об'єктами коли відомі функції переходу від параметрів одного об'єкту до параметрів іншого, а математичні описи можуть бути зроблені тотожними. Цей своєрідний дуалізм моделі є характерним для різних систем автоматизованого проектування (САПР), оскільки під час автоматизованого проектування розробник оперує не з самими об'єктами, а з їх моделями, тобто моделювання виступає і як предмет, і як засіб створення проекту складної системи.
Отже, модель – це спеціальний об’єкт, який в деякому сенсі заміняє оригінал. Слід чітко усвідомлювати, що з принципової точки зору, не існує моделі, яка б була повним еквівалентом оригіналу. Будь-яка модель відображає лише деякі сторони оригіналу, завдяки чому модель набуває певної ідеалізованої форми. Тому, дуже часто для всестороннього вивчення оригіналу доводиться будувати і досліджувати цілу сукупність моделей. Складність моделювання як процесу полягає у відповідному виборі такої сукупності моделей, які заміняють реальний об’єкт у потрібному відношенні.
В основі процесу моделювання лежать інформаційні процеси, оскільки в процесі реалізації моделі отримують інформацію про об’єкт-оригінал, проведення експерименту з моделями супроводжується керуючою інформацією і на останньому етапі відбувається обробка (інтерпретація) отриманих результатів.
Машинна графіка ще відносно молода, і відповідним тут є стандарт, що саме розвивається. Тиск головним чином відчувається з боку виробників CAD систем - кошти просторового моделювання вже стали повсякденним інструментом для багатьох інженерів і проектувальників.
Фахівці прийшли до висновку, що тип взаємодії з моделлю, відомий як проектування в контексті, дозволяє виявляти такі помилки як некоректне розташування компонентів, ще на ранніх етапах циклу розробки, а це определеннейшим образом приводить до зменшення трудовитрат і вартості проекту.
У ідеалі потрібні такі CAD - системи, в яких можна було б візуалізувати і взаємодіяти з базою даних будь-яких масштабів, від окремих деталей до закінчених проектів. Як показала практика, отримати такі кошти, не зачіпаючи рівень базового графічного апарату, неможливо. А для базового рівня задача складається в тому, щоб добитися визуализации великих інженерних моделей з інтерактивною швидкістю, не жертвуючи при цьому точністю відтворення в тій мірі, в якій це може привести до помилкової інтерпретації результуючих зображень.
Завдання
Для антикварного фотоапарата
а) Побудова каркасної моделі геометричного об’єкта з графічною побудовою
б) Побудова матриці суміжності з відповідною нумерацією вершин графа та зазначенням її на графічній побудові
в) Побудова матриці інцеденції з відповідною нумерацією вершин та дуг графа та зазначенням її на графічній побудові
а) Визначити координати точки, яка симетрична відносно бісектриси першогокоординатного кута точки А(2, 3).
б) Визначити у яких чвертях може бути розміщена точка М(х, у), якщо ху>0.
в) Полюс полярної системи координат співпадає з початком декартових прямокутнихкоординат, а полярна вісь співпадає з додатньою піввіссю абсцис. У полярній системі
координат задана точка А(6;). Визначити декартові координати цієї точки.
г) Перевести координати точки Р з однорідного представлення у вигляді: (5, 10, 6, 1) всистему афінних координат.
ґ) Написати формули перетворення координат, якщо початок координат у декартовій системі (без зміни напрямку осей) перенесено у точку: А(3;4).
Дана окружність х2 + у2 — 4х — 5 = 0 та точка С(+5;+4). Написати рівняння окружності, що має центр в точці С та дотикається даної окружності зовнішнім чином. Якщо до окружності дотикаються одна одну зовнішнім чином, то сума їх радіусів рівна відстані між центрами.
Побудувати криву Без'є на основі шести вершин багатокутника, що заданий точками з координатами: Ро[4,5], Р1[2,14], Р2[7,11], Рз[12,2], Р4[15,4], Р5[16,9]
а) провести перетворення кольору (див. Додаток 2, номер кольору=номеру варіанту) з RGB => СІЕ XYZ
б) зробити два кольори (див. Додаток 2, перший колір = номер варіанту, та другий колір = номер варіанту+35) світлішими на 40% та змішати два отриманих кольори.
Написати імітаційну програму з застосуванням афінних перетворень, яка дозволяє в автоматичному режимі та при ручному керуванні створювати динамічно змінну візуалізацію при якій моделюється рух газольодової комети, що випаровується у хвості комети.
Написати програму із застосуванням графічних функцій WinAPI, яка дозволяє
візуалізувати графік(и) функції з можливостями масштабування у вікні на певному
інтервалі. Застосувати функції зміни кольору, штриховки, зафарбування замкнутих
областей, текстових підписів, виводу координатної сітки. Організувати вивід графіка у
зовнішній метафайл.
Побудувати графіки функції, заданої в параметричній формі, в різних областях вікна
для різних значень коефіцієнта "А".
X(t)= Sin(At); Y(t)= Sin(3t); t=[-2..2]; A=[-l 2 4 5]
Написати програму із застосуванням 2D графічних функцій бібліотеки OpenGL, яка дозволяє візуалізувати у вікні програми зафарбований брусок, що зсковзує від вертикального до горизонтального положення, доторкаючись двома своїми вершинами сторін прямого кута (див. рис). Точка торкання вертикалі рухається авноприскорено, при досягненні горизонталі рух припиняється.
а) Cиметричною відносно бісектриси першого координатного кута точки А(2, 3) буде B(3, 2).
б) Точка М(х, у), якщо ху>0 буде розміщена в I і III четвертях .
в) Полюс полярної системи координат співпадає з початком декартових прямокутних координат, а полярна вісь співпадає з додатньою піввіссю абсцис. У полярній системі координат задана точка А(6;). Визначити декартові координати цієї точки.
х = ρ*cosφ,
у = ρ*sinφ .
B(6*cos, 6*sin ) B(0, 6 ).
г) В системі афінних координат точка Р (5, 10, 6, 1) матиме вигляд P’ (5, 10, 6,) .
ґ) Формули перетворення координат:
x’=x+3;
y’=y+4;
Рівняння окружності радіуса R з центром С(хо,уо): (x - xo)2+(y - yo)2= R2
х2 + у2 — 4х — 5 = 0
х2— 4х + у2 — 5 + 4= 0 + 4
(х - 2)2 + у2 = 9
(х - 2)2 + у2 = 32
Центр кола окружності буде: O(-2;0)
А). Перетворення RGB => CIE XYZ
X=ED; Y=EB; Z=EA
Б). FA EB D7 світліше на 40% -> FC F3 E7
00 CE D1 світліше на 40% -> 66 E2 E3
При змішуванні вийде: B0 E6 DD
Program lab_2;
Uses graph,crt;
Var
comet : array[1..10,1..2] of integer;
grDriver, grMode :Integer;
x,y,i,j,dx,z,k:integer;
c:char;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'c:\pascal\bgi');
if GraphResult <> grOk then Halt(1);
x:=1;
y:=240;
randomize;
setcolor(3);
for i:=1 to 400 do
begin
dx:=1-random(2);
circle(x+i,y+dx,4);
for j:=1 to 40 do putpixel(x+i-j+random(5)-2,y+random(5)-2+dx,3);
delay(500);
cleardevice;
end;
i:=100;
repeat
c:=readkey;
if c=#0 then c:=readkey;
case c of
#80: begin z:=z+1;k:=1;end;
#72: begin z:=z-1;k:=0;end;
end;
i:=i+1;
cleardevice;
dx:=1-random(2);
circle(x+i,y+dx+z,4);
if k=1 then for j:=1 to 40 do putpixel(x+i-j+random(5)-2,y+random(5)-2+dx+z-round(j/10),3)
else for j:=1 to 40 do putpixel(x+i-j+random(5)-2,y+random(5)-2+dx+z+round(j/10),3);
delay(1);
until c=#27;
CloseGraph;
end.
program Vityuk;
uses
SysUtils,
Windows,
Messages;
var
wc : TWndClassEx; // Зміна шаблону класу вікна.
MainWnd : HWND; // Описувач головного вікна.
Mesg : TMsg; // Змінна для циклу збора повідомлень.
xPos, yPos, nWidth, nHeight : Integer;
MyDC, WMFDC, OldDC : HDC; // Контекст пристрою.
zoom : Integer; // Масштаб (по замовчуванню 100).
brush : HBrush;
// Координати початків координат для всіх графіків.
ox1, oy1, ox2, oy2, ox3, oy3, ox4, oy4, ox5, oy5, ox6, oy6 : integer;
MFile : HMetaFile; // Дескриптор метафайлу.
count : integer; // Допоміжна змінна.
rec : TRect; // Область вікна для малювання.
prec : PRect; // Область для метафайлу.
// Віконна процедура головного вікна.
function WindowProc(wnd : HWND; Msg : Integer; Wparam : Wparam; Lparam : Lparam) : Lresult;
stdcall;
Begin
// Далі проходить цикл обробки повідомлень.
case msg of
wm_destroy :
// Повідомленні, яке надсилається при знищенні вікна.
begin
postquitmessage(0);
exit;
Result := 0;
end
else Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
end;
// Процедура побудови графіка функції, з використанням ліній.
procedure DrawGraphicWithLines(ox, oy, zoom : integer; A, krok : double; color : longint);
var
x, y : integer;
Fi, Ro : double;
pen : HPen;
begin
pen := CreatePen(ps_Solid, 2, color);
SelectObject(MyDC, pen);
Fi := -2;
x := Round(sin(A+fi)*zoom) + ox;
y := Round(sin(3+fi)*zoom) + oy;
MoveToEx(MyDC, x, y, nil);
repeat
x := Round(sin(A+fi)*zoom) + ox;
y := Round(sin(3+fi)*zoom) + oy;
LineTo(MyDC, x, y);
Fi := Fi + krok;
until Fi > 2;
DeleteObject(pen);
end;
// Процедура побудови графіка функції, з використанням точок.
procedure DrawGraphicWithPoints(ox, oy, zoom : integer; A, krok : double; color : longint);
var
x, y : integer;
Fi, Ro : double;
begin
Fi := -2;
repeat
x := Round(sin(A+fi)*zoom) + ox;
y := Round(sin(3+fi)*zoom) + oy;
SetPixel(MyDC, x, y, color);
Fi := Fi + krok;
until Fi > 2;
end;
// Процедура побудови координатних осей.
procedure DrawOsi(ox, oy, zoom : integer);
Var
pen : HPen;
brush : HBrush;
point : array [1..5] of TPoint;
begin
// 1. Створуємо перо.
pen := CreatePen(ps_Solid, 2, RGB(0, 0, 0));
SelectObject(MyDC, pen);
// 2. Створюємо пензлик.
brush := CreateSolidBrush(RGB(0, 0, 0));
SelectObject(MyDC, brush);
SetBkMode(MyDc, 1); // Робимо прозорий фон.
// 3. Малюємо осі координат.
MoveToEx(MyDC, ox - zoom - 30, oy, nil);
LineTo(MyDC, ox + zoom + 30, oy); // Малюємо OX.
MoveToEx(MyDC, ox, oy + zoom + 30, nil);
LineTo(MyDC, ox, oy - zoom - 30); // Малюємо OY.
// 4. Малюємо стрілку для осі OX.
point[1].X := ox + zoom + 33;
point[1].Y := oy - 1;
point[2].X := ox + zoom + 13;
point[2].Y := oy + 4;
point[3].X := ox + zoom + 23;
point[3].Y := oy - 1;
point[4].X := ox + zoom + 13;
point[4].Y := oy - 5;
point[5].X := ox + zoom + 33;
point[5].Y := oy - 1;
Polygon(MyDC, point, 4);
// 5. Малюємо стрілку для осі OY.
point[1].X := ox - 1;
point[1].Y := oy - zoom - 33;
point[2].X := ox - 5;
point[2].Y := oy - zoom - 13;
point[3].X := ox;
point[3].Y := oy - zoom - 23;
point[4].X := ox + 4;
point[4].Y := oy - zoom - 13;
point[5].X := ox - 1;
point[5].Y := oy - zoom - 33;
Polygon(MyDC, point, 4);
// 6. Виводимо назви осей.
TextOut(MyDc, ox + zoom + 30, oy + 4, 'X', 1);
TextOut(MyDc, ox + 4, oy - zoom - 40, 'Y', 1);
// 7. Знищуємо об'єкти.
DeleteObject(brush);
DeleteObject(pen);
end;
// Процедура побудови координатної сітки.
procedure DrawGrid(ox, oy, zoom : integer);
Var
pen : HPen;
x, y, krok : integer;
begin
pen := CreatePen(ps_Dot, 1, RGB(0, 0, 0));
SelectObject(MyDC, pen);
SetBkMode(MyDc, 1); // Робимо прозорий фон.
krok := 40;
y := oy + krok;
while y <= oy + zoom + 30 do
begin
MoveToEx(MyDC, ox - zoom - 30, y, nil);
LineTo(MyDC, ox + zoom + 30, y);
y := y + krok;
end;
y := oy - krok;
while y >= oy - zoom - 30 do
begin
MoveToEx(MyDC, ox - zoom - 30, y, nil);
LineTo(MyDC, ox + zoom + 30, y);
y := y - krok;
end;
x := ox - krok;
while x >= ox - zoom - 30 do
begin
MoveToEx(MyDC, x, oy + zoom + 30, nil);
LineTo(MyDC, x, oy - zoom - 30);
x := x - krok;
end;
x := ox + krok;
while x <= ox + zoom + 30 do
begin
MoveToEx(MyDC, x, oy + zoom + 30, nil);
LineTo(MyDC, x, oy - zoom - 30);
x := x + krok;
end;
DeleteObject(pen);
end;
//---------------------------------------------------------------------------
begin
// Далі йде заповнення шаблону класу вікна.
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := HInstance;
wc.hIcon := LoadIcon(0, idi_application);
wc.hCursor := LoadCursor(0, idc_arrow);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := nil;
wc.lpszClassName := 'WinMin: Main';
RegisterClassEx(wc); // Реєстрація нового класу в системі.
// Заповнення зменних xPos, yPos, nWidth, nHeight.
xPos := 0;
yPos := 0;
nWidth := 1024;
nHeight := 739;
// Створення головного вікна.
MainWnd := CreateWindowEx(0, // Прапорці розширених стилів.
'WinMin: Main', // Ім'я класу вікна, яке задане при заповненні структури wc.
'Варіант №13', // Заголовок вікна.
ws_overlappedwindow, // Прапорці стилів вікна.
xPos, // Горизонтальна позиція вікна.
yPos, // Вертикальна позиція вікна.
nWidth, // Ширина вікна.
nHeight, // Висота вікна.
0, // Описувач батьківського вікна (parent) чи вікна-володаря (owner).
0, // Описувач меню вікна (меню нема, нема і описувача).
Hinstance, // Описувач програми (application).
nil); // Address of window-creation data.
ShowWindow(MainWnd, CmdShow); // Відображуємо вікно.
// Задання початкових значень.
count := 0;
zoom := 100;
ox1 := 150;
oy1 := 170;
ox2 := 500;
oy2 := 170;
ox3 := 850;
oy3 := 170;
ox4 := 150;
oy4 := 520;
ox5 := 500;
oy5 := 520;
GetClientRect(MainWnd, rec);
new(prec);
prec.Left := rec.Left;
prec.Top := rec.Top;
prec.Right := rec.Right;
prec.Bottom := rec.Bottom;
// Цикл обробки повідомлень. Він може трохи видозмінюватися, але цей код присутній завжни.
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
// Робота з графічними функціями.
MyDC:=GetDC(MainWnd); // Отримання контексту пристрою виводу.
SaveDC(OldDC);
if (Mesg.message = 256) or (Mesg.message = 15) or (Mesg.message = 49366) then
begin
if (count = 0) or (count >= 2) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
// 1. Натиснення '+'.
if (Mesg.message = 256) and (Mesg.wParam = 107) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
zoom := zoom + 20;
ox2 := ox2 + (zoom - 100)*2;
ox3 := ox3 + (zoom - 100)*4;
oy4 := oy4 + (zoom - 100)*2;
ox5 := ox5 + (zoom - 100)*2;
oy5 := oy5 + (zoom - 100)*2;
ox6 := ox6 + (zoom - 100)*4;
end
else if (Mesg.message = 256) and (Mesg.wParam = 109) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
if zoom >= 100 then
begin
ox2 := ox2 - (zoom - 100)*2;
ox3 := ox3 - (zoom - 100)*4;
oy4 := oy4 - (zoom - 100)*2;
ox5 := ox5 - (zoom - 100)*2;
oy5 := oy5 - (zoom - 100)*2;
ox6 := ox6 - (zoom - 100)*4;
end;
zoom := zoom - 20;
end
else if (Mesg.message = 256) and (Mesg.wParam = 37) then
begin
ox1 := ox1 - 80;
ox2 := ox2 - 80;
ox3 := ox3 - 80;
ox4 := ox4 - 80;
ox5 := ox5 - 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 39) then
begin
ox1 := ox1 + 80;
ox2 := ox2 + 80;
ox3 := ox3 + 80;
ox4 := ox4 + 80;
ox5 := ox5 + 80;
ox6 := ox6 + 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 38) then
begin
oy1 := oy1 - 80;
oy2 := oy2 - 80;
oy3 := oy3 - 80;
oy4 := oy4 - 80;
oy5 := oy5 - 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 40) then
begin
oy1 := oy1 + 80;
oy2 := oy2 + 80;
oy3 := oy3 + 80;
oy4 := oy4 + 80;
oy5 := oy5 + 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 112) then
begin
// WMFDC := CreateEnhMetaFile(MyDC, 'd:\TPMark3.wmf', prec, nil);
// MFile := CloseEnhMetaFile(WMFDC);
end
else if (Mesg.message = 256) and (Mesg.wParam = 113) then
begin
// PlayEnhMetaFile(WMFDC, MFile, rec);
end;
// 1. Малюємо перший графік.
DrawOsi(ox1+zoom-100, oy1+zoom-100, zoom);
DrawGrid(ox1+zoom-100, oy1+zoom-100, zoom);
DrawGraphicWithPoints(ox1+zoom-100, oy1+zoom-100, zoom, -1, 0.05, RGB(205, 1, 27));
TextOut(MyDc, ox1+zoom-100 - zoom - 20, oy1 + zoom+zoom-100 + 50, 'Рис. 1. Значення (A = -1).', 26);
// 2. Малюємо другий графік.
DrawOsi(ox2+zoom-100, oy2+zoom-100, zoom);
DrawGrid(ox2+zoom-100, oy2+zoom-100, zoom);
DrawGraphicWithLines(ox2+zoom-100, oy2+zoom-100, zoom, -1, 0.01, RGB(0, 168, 0));
TextOut(MyDc, ox2+zoom-100 - zoom - 20, oy2+zoom-100 + zoom + 50, 'Рис. 2. Значення (A = -1).', 26);
// 3. Малюємо третій графік.
DrawOsi(ox3+zoom-100, oy3+zoom-100, zoom);
DrawGrid(ox3+zoom-100, oy3+zoom-100, zoom);
DrawGraphicWithLines(ox3+zoom-100, oy3+zoom-100, zoom, 2, 0.01, RGB(0, 0, 255));
TextOut(MyDc, ox3+zoom-100 - zoom - 25, oy3+zoom-100 + zoom + 50, 'Рис. 3. Значення (A = 2 ).', 26);
// 4. Малюємо перший графік.
DrawOsi(ox4+zoom-100, oy4+zoom-100, zoom);
DrawGrid(ox4+zoom-100, oy4+zoom-100, zoom);
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 4, 0.01, RGB(0, 168, 0));
TextOut(MyDc, ox4+zoom-100 - zoom - 20, oy4 + zoom+zoom-100 + 50, 'Рис. 1. Значення (A = 4 ).', 26);
// 5. Малюємо другий графік.
DrawOsi(ox5+zoom-100, oy5+zoom-100, zoom);
DrawGrid(ox5+zoom-100, oy5+zoom-100, zoom);
DrawGraphicWithLines(ox5+zoom-100, oy5+zoom-100, zoom, 5, 0.01, RGB(0, 168, 0));
TextOut(MyDc, ox5+zoom-100 - zoom - 20, oy5+zoom-100 + zoom + 50, 'Рис. 2. Значення (A = 5 ).', 26);
end;
end;
count := count + 1;
// ***********************************************************************
ReleaseDC(MainWnd,OldDC); // Звільнення зсилки.
DeleteDC(MyDC); // Видалення зсилки.
end;
WMFDC := CreateEnhMetaFile(MyDC, 'd:\TPMark3.wmf', prec, nil);
MFile := CloseEnhMetaFile(WMFDC);
// DeleteEnhMetaFile(MFile);
end.
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGl, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
hrc: HGLRC; // зсилка на контекст відтворення
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
public
{ Public declarations }
end;
var
Form1: TForm1;
i,x,y,angle:glfloat;
c:glint;
implementation
{$R *.dfm}
procedure DrawS;stdcall;
var
k,j:integer;
x1,y1,x2,y2,x3,y3,x4,y4,koef:glfloat;
begin
{******* ДАЛI РОЗМIЩУЮТЬСЯ КОМАНДИ РИСОВАННЯ OpenGL **************}
glViewPort (0, 0, Form1.ClientWidth, Form1.ClientHeight);
// область виводу ширина, висота розміру форми Form1 програми
glClearColor (0.95, 0.95, 0.95, 1.0); // колiр фону
glClear (GL_COLOR_BUFFER_BIT); // очищення буфера кольору
glColor3f (1.0, 0.0, 0.0); // поточний колiр примiтивiв
koef:=Form1.ClientWidth/Form1.ClientHeight;
x1:=0;
y1:=0.5-c/100;
x2:=0.5+c/100;
y2:=0;
x3:=x1+0.1-c/500;
y3:=y1+0.1;
x4:=x2+0.1-c/500;
y4:=y2+0.1;
glBEGIN (GL_LINES);
glVertex2f (x1-0.5, y1*koef-0.5);
glVertex2f (x2-0.5, y2*koef-0.5);
glVertex2f (x3-0.5, y3*koef-0.5);
glVertex2f (x4-0.5, y4*koef-0.5);
glVertex2f (x1-0.5, y1*koef-0.5);
glVertex2f (x3-0.5, y3*koef-0.5);
glVertex2f (x2-0.5, y2*koef-0.5);
glVertex2f (x4-0.5, y4*koef-0.5);
glEnd;
glBEGIN (GL_LINES);
glVertex2f (-0.5, 0.6);
glVertex2f (-0.5, -0.5);
glVertex2f (-0.5, -0.5);
glVertex2f (0.6, -0.5);
glEnd;
{end;}
wglMakeCurrent (0, 0); // перед завершенням роботи необхiдно,
// щоб контекст нiкем не використовувався
end;
procedure TForm1.FormPaint(Sender: TObject);
var i:integer;
begin
wglMakeCurrent(Canvas.Handle, hrc); // встановлюється поточний контекст канви форми вiдтворення
Draws;
end;
{Формат пікселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor; //данi формату пiкселiв
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
nPixelFormat := ChoosePixelFormat (hdc, @pfd); // запит системi - чи підтримується вибраний формат пiкселiв
SetPixelFormat (hdc, nPixelFormat, @pfd); // встановлює