Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
/
Розрахункова робота
з дисципліни
«Проблемно-орієнтовані мови програмування»
на тему
Екранні перетворення двовимірних об’єктів
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Завдання на розрахункову роботу
з дисципліни
«Проблемно-орієнтовані мови програмування»
Прізвище, ім’я студента Славич Юрій
Група КН-21
Тема розрахункової Екранні перетворення двовимірних об’єктів
Спеціальна частина завдання :
Провести огляд літератури по методах знаходження оберненої матриці.
Здійснити програмну реалізацію на мові Сі.
Реалізувати користувацький інтерфейс та редагування оголошень програмних елементів.
Середовище функціонування програми – MS DOS.
Завдання видано
Керівник Шпак Зореслава Ярославівна
Студент Славич Юрій Васильович
Зміст
Вступ 2
1. Огляд літератури
1.1. Деякі відомості з представлення і перетворення точок та приклади реалізації 3
1.1.1. Перетворення точок 3
1.1.2. Перетворення прямих ліній 4
1.1.3. Обертання 5
1.1.4. Відображення 5
1.1.5. Зміна масштабу 6
4. Програмні реалізації алгоритму 7
4.1. Алгоритм виконання 8
6. Контрольні приклади та аналіз їх реалізації
Висновки
Додаток 1. Текст програми на мові Турбо-Сі
Вступ
В даній розрахунковій роботі представлено програму, яка реалізовує екранні перетворення вдовимірних об’єктів за допомогою матриці перетворення. За допомогою цієї матриці можна виконувати різноманітні перетворення графічних об’єктів. Наприклад: змінити масштаб по осі х; змінити масштаб по осі/осях x/y; відобразити відносно координатної осі у; відобразити відносно початку координат та інші.
Представлення і перетворення точок.
Представлення точок здійснюється наступним чином:
На площині
Перетворення точок.
Розглянемо результати матричного множення , що визначає точку Р, і матриці перетворення 2х2 загального виду:
(3.1)
Дослідимо декілька часткових випадків.
1) а=d=1 і c=b=0. Змін не відбувається
. (3.2)
2) d=1, b=c=0. Зміна масштабу по осі x
. (3.3)
3) b=c=0. Зміна масштабу по осях x і y
. (3.4)
4) b=c=0, d=1, a=-1. Відображення координат відносно осі y
. (3.5)
5) b=c=0, a=d<0. Відображення відносно початку координат
. (3.6)
6) а=d=1,c=0. Зсув
. (3.7)
Для початку координат маємо інваріантно
.
/
Рис.3.1. Перетворення точок.
Перетворення прямих ліній.
Пряма задана 2 векторами.
Вектори положення точок А і В рівні і .
/
Рис.3.2. Перетворення прямих ліній.
Матриця перетворення
.
Одержимо:
, (3.8)
. (3.9)
Альтернативне представлення лінії AB
.
Після цього множення матриці L на Т дасть
. (3.10)
Операція зсуву збільшила довжину лінії і змінила її положення.
Обертання.
Розглянемо плоский трикутник ABC.
Здійснимо поворот на 90° проти годинникової стрілки.
/
Рис.3.3. Обертання і відображення.
Одержимо
. (3.11)
В результаті отримаємо трикутник A*B*C*. Поворот на 180° задається матрицею
,
поворот на 270( навколо початку координат - за допомогою матриці:
.
Відображення.
Відображення визначається поворотом на 180° навколо осі, що лежить у площині ху.
1) Обертання навколо прямої y=x задається матрицею:
.
Нові вирази визначаються співвідношенням:
. (3.12)
2) Обертання навколо осі y=0 задається матрицею:
.
Нові вершини визначаються співвідношенням:
. (3.13)
Зміна масштабу.
Зміна масштабу визначається значенням 2-х елементів головної діагоналі матриці.
Якщо використовуємо матрицю маємо збільшення в 2 рази.
Якщо значення елементів не рівні, то має місце спотворення.
Трикутник ABC перетворений за допомогою матриці . Трикутник DEF перетворений за допомогою матриці . Маємо спотворення.
/
Рис.3.4. Рівномірна і нерівномірна зміна масштабів.
4. Програмні реалізації алгоритму
4.1. Опис програми на мові C.
Програма написана на мові С збережена у файлі graph.cpp Об’єм програми в байтах – 2 097 байт. Це 110 рядків програмного коду.
Програма призначена для здійснення екранних перетворень двовимірних об’єктів.
В програмі використовуються наступні стандартні бібліотечні функції [3]:
initgraph() – встановлення графічного режиму;
textcolor() – встановлює певний колір тексту;
setcolor() – встановлює перний колір зображення;
line() – малює лінію;
getch() – повертає код натиснутої клавіші без еходруку на екрані;
printf() – форматований вивід інформації;
scanf() – форматований ввід інформації;
closegraph() – завершення графічного режиму;
Вхідною інформацією для програми є кількість вершин фігури, значення координат та мартиця перетворення.
Вихідна інформація виводиться на екран зображення двох фігур: первинної та перетвореної..
4.1 Алгоритм виконання
1.Вводимо кількість точок.
2.Вводимо координати точок.
3.Вводимо матрицю перетворення.
3.Створюється новий масив модифікованих через матрицю точок.
4.Запускаємо графічний режим.
5.Відображаємо координатну сітку.
6. Виводимо фігуру, яка складається з не модифікованих точок і другу фігуру, яка складається з модифікованих точок.
Список використаної літератури
Вікіпедія – вільна Інтернет енциклопедія http://uk.wikipedia.org
Повний правочник по С/ Г. Шилдт, 2008.
Програмування мовою С/ З.Я. Шпак. – 2-ге вид., доп. – Львів, 2011.
Технічні, математичні та алгоритмічні основи комп’ютерної графіки/ Різник О.Я. Львів 2004.
Висновки
В даній розрахунковій роботі, тема якої, «Екранні перетворення двовимірних об’єктів» я скористався матрицями перетворення для побудови змінених двовимірних об’єктів. Спершу я виводив на екран первинну фігуру, яка задається введенням координат вершин з клавіатури. Після цього перемножував координати вершин на матрицю перетворення та виводив на екран перетворену фігуру. Зліва – первинна фігура, а справа – перетворена.
В роботі використав стандартні бібліотечні функції та знання, які набув на протязі навчального року.
Програма робоча, і результат її виконання співпадає з математичними обчисленнями за допомогою відповідних формул.
Додаток 1.
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#define N 20
int main ()
{
int n,x[N],y[N],mx[N],my[N];
printf ("Введіть кількість вершин фігури: ");
scanf ("%d",&n);
for (int i=0; i<n; i++)
puts(“Введіть координати х та у:”)
{
scanf ("%d",&x[i]);
scanf ("%d",&y[i]);
}
printf ("Ведіть матрицю перетворення:\n");
printf ("[ [ ] [ ] ]\n");
printf ("[ ]\n");
printf ("[ [ ] [ ] ]\n");
int a,b,c,d;
int px=wherex(),py=wherey();
gotoxy (px+3,py-3);
scanf ("%d",&a);
gotoxy (px+8,py-3);
scanf ("%d",&b);
gotoxy (px+3,py-1);
scanf ("%d",&c);
gotoxy (px+8,py-1);
scanf ("%d",&d);
for (i=0; i<n; i++)
{
mx[i]=a*x[i]+c*y[i];
my[i]=b*x[i]+d*y[i];
}
//Починаємо малювати:
/* Необхідно автовизначення */
int gdriver = DETECT, gmode, errorcode;
int xmax, ymax;
/* Ініціалізація графічних та локальних змінних */
initgraph(&gdriver, &gmode, "");
/* зчитуємо результат ініціалізації */
errorcode = graphresult();
if (errorcode != grOk) { /* якщо відбулася помилка */
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
xmax = getmaxx();
ymax = getmaxy();
///////////////////////////////
//Малюємо сітку
setcolor (7);
for (i=0; i<xmax; i+=20)
line (i,0,i,ymax);
for (i=0; i<ymax; i+=20)
line (0,i,xmax,i);
//Малюємо x&y лінії
setcolor (10);
line (0,ymax/2+1,xmax,ymax/2+1);
line (xmax/2+1,0,xm ax/2+1,ymax);
//Визначаємо центер
int cx,cy;
cx=xmax/2+1;
cy=ymax/2+1;
//Малюємо першу фігуру
setcolor (14);
for (i=0; i<n-1 ;i++)
{
line (cx+20*x[i],cy+(-20)*y[i],cx+20*x[i+1],cy+(-20)*y[i+1]);
}
line (cx+20*x[n-1],cy+(-20)*y[n-1],cx+20*x[0],cy+(-20)*y[0]);
//Малюємо перетворену фігуру
setcolor (4);
for (i=0; i<n-1 ;i++)
{
line (cx+20*mx[i],cy+(-20)*my[i],cx+20*mx[i+1],cy+(-20)*my[i+1]);
}
line (cx+20*mx[n-1],cy+(-20)*my[n-1],cx+20*mx[0],cy+(-20)*my[0]);
/* очищення */
getch();
closegraph();
return 0;
}