Робота зі списками

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Державна освітня установа вищої професійної освіти "Московський державний технічний університет ім. Н.Е. Баумана »
Калузький філія
Факультет "Фундаментальних Наук"
Кафедра "Програмного забезпечення ЕОМ, інформаційних технологій і прикладної математики" (ФН1-КФ)
Курсова робота
ПО КУРСУ: «ПРОГРАМУВАННЯ НА С + +»
На тему: «Робота зі списками»
Калуга - 2008

АНОТАЦІЯ
Список - це динамічна структура, іншими словами, масив даних деякого типу, розміри якого можуть змінюватися в процесі виконання програми. Списки дуже широко використовуються в інформаційних технологіях. У тому числі, в області машинної графіки для опису графічних примітивів. Так, наприклад, деяка геометрична модель може бути представлена ​​списком вершин, ліній або інших об'єктів будь-якої складності.
Дана програма являє собою редактор зображень, дозволяє створювати графічні зображення, в основі яких лежать деякі графічні примітиви, такі як лінії, прямокутники і криві Безьє, а також виділяти і видаляти частини об'єктів і міняти колір об'єктів. Всі графічне зображення представляється списком ліній. Всі можливі у програмі операції з об'єктами - це наочне уявлення операцій зі списками, які здійснюються за допомогою декількох класів для роботи з ними.

ДОСЛІДНА ЧАСТИНА
1.1 Постановка завдання
Створити декілька класів, що реалізують роботу зі списками і застосувати ці класи до задачі побудови геометричних фігур, тим самим продемонструвавши їх працездатність.
1.2Способи реалізації
Для реалізації поставленої задачі використовується стек (він являє собою список типу LIFO, в якому останній доданий елемент зчитується першим), а також зворотна стеку динамічна структура - черга (FIFO). У програмі використовуються методи об'єктно-орієнтованого програмування для полегшення способу вирішення задачі: шаблони класів (для запису в список елементів різного типу), спадкування (для скорочення обсягу програмного коду), віртуальні функції (для коректного перевизначення методів різних класів), абстрактний клас (для загального опису основних функцій).
1.3Ісследованіе поставленої задачі
1.3.1 Створення пакету
Стек являє собою список типу LIFO, в якому останній доданий елемент зчитується першим. Для створення пакету в програмі використовується структура List, що містить поле посилання на наступний елемент і шаблонний тип даних в якості інформаційного поля. Для програмної реалізації стека необхідно описати 2 змінні зазначеного вище типу List: p (вказівник на поточний елемент) і top (вказівник на вершину списку). При додаванні елемента в стек, новому елементу присвоюється посилання на вершину стека, а потім і він сам стає вершиною. Таким чином, стек росте як би тому:
p = new list;
p-> next = top;
p-> inf = value;
top = p;
1.3.2 Створення черги
Черга дуже схожа на стек за винятком того, що елементи в ній розташовуються в нормальному порядку, а не в зворотному. Обхід черги і обхід стека ідентичні. З огляду на це схожість, можна створити клас черзі як спадкоємця класу стека, перевизначивши в ньому тільки функції створення і додавання елемента. Так як у черзі перший елемент повинен бути створений заздалегідь, то заносимо його створення в конструктор класу:
top = new list;
top-> next = NULL;
p = top;
Додавання елемента в чергу теж відрізняється від додавання елемента в стек. Тут вершина списку залишається на своєму місці, змінюється лише положення поточного покажчика, а елементи заносяться в прямому порядку, і посилання на новий елемент створюється з поточного, а не навпаки, як було в стеку, після чого новий елемент стає поточним:
p-> next = new list;
p-> next-> next = NULL;
p-> inf = value;
p = p-> next;
1.4 Актуальність поставленої задачі
Досліджувані алгоритми застосовуються для вирішення багатьох прикладних задач, особливо в області машинної графіки. Робота зі списками дуже важлива при побудові графічних моделей, моделюванні графічних додатків, створення відеоігор, а також для організації пам'яті під дані користувача типів і так далі. Списки - це основна динамічна структура, на якій базуються інші.

2. КОНСТРУКТОРСЬКА ЧАСТИНА
2.1 Обгрунтування вибору засоби програмування
Для написання даної курсової роботи було використано мову Borland C + + Builder 6. C + + Builder дозволяє швидку візуальну розробку програмного забезпечення на C + +. Професійні засоби мови C + + інтегровані в візуальне середовище розробки. Інтегроване середовище розробки об'єднує редактор форм, інспектор об'єктів, палітру компонент, адміністратор проекту і повністю інтегровані редактор коду і відладчик - інструменти швидкої розробки програмних додатків, що забезпечують повний контроль над кодом і ресурсами. C + + Builder втілює найважливіші аспекти об'єктно-орієнтованого програмування в зручному для користування інструменті візуального проектування, що найкраще підходить для реалізації та відображення результатів роботи програми.
Для зручної роботи зі списком необхідно представити його як окремий тип даних. C + + дозволяє визначати користувацькі типи, а також визначати набір операцій, вироблених над примірниками цього типу. Ключовим поняттям C + + є клас. Клас - це тип даних, який визначається користувачем, змінні якого є об'єктами. Т.ч., в програмі, створеної на C + +, визначення класу має бути визначенням типу даних, що містить інформацію про значення, які можуть зберігатися в його змінних, а також про функції-членах цього класу.
Механізм наслідування дозволяє визначати нові класи на основі вже наявних. Клас, на основі якого створюється новий клас, називається базовим (батьківським) класом, а новий - похідним (спадкоємцем). Безпосереднім базовим класом називається такий клас, який входить до списку базових класів при визначенні класу. Будь-який похідний клас може у свою чергу стати базовим для інших створюваних класів. Т.ч. формується спрямований граф ієрархії класів, а при оголошенні об'єктів і ієрархія об'єктів. В ієрархії об'єктів похідний об'єкт має можливість доступу до елементів даних і методів об'єктів, типізованих базовим класом.
У мові існує можливість одиночного і множинного успадкування. При одиночному спадкуванні базовим є один клас, а при множині спадкуванні базовими класами повинні бути декілька класів.
Віртуальні функції є засобом пізнього зв'язування в мові С + +.
Віртуальною функцією називається функція, яка ще, не будучи певною яким-небудь чином, може використовуватися. Ця технологія, коли визначення реалізації процедури відкладається до часу виконання програми, називається пізнім або динамічним зв'язуванням.
Для зручності роботи зі списком потрібно надати спеціальні функції, які дають можливість без змін до реалізації та описі класів отримати додаткову інформацію про нього. З цією метою може бути використаний реалізований в С + + механізм дружності і створений дружній клас, який, оперуючи внутрішніми методами абстрактного типу даних, повертає додаткову інформацію, корисну при роботі зі структурою.
Т.ч. мову С + + містить всі необхідні можливості для реалізації списковому структури, а також можливість роботи з нею як з вбудованим типом даних, що до того ж може бути з часом перетворений і розширений.
2.2 Функціональне призначення
Програма може застосовуватися для створення графічних зображень
Для реалізації цього завдання необхідно створити список, у який будуть заноситися об'єкти різних призначених для користувача типів (наприклад, лінії). Список повинен володіти всіма необхідними методами, використовуваними для обробки що знаходяться в ньому даних: додавання, видалення, пошук, редагування та вибірка елементів.
Користувач може вибрати один з графічних примітивів, создаваймих на основі ліній, наприклад, крива Безьє, встановити колір об'єкта і його позицію на площині малюнка. Після створення об'єкт з'являється на екрані, а список складових його ліній виводиться в ListBox-елемент на формі. Користувач має можливість змінювати колір об'єкта, видаляти об'єкт, а також видаляти окремі складові його лінії.
2.3 Опис логічної структури
Курсова робота представляє собою програму, написану на C + + Builder 6. Для спрощення програмного коду використовується ієрархія класів.
Абстрактний клас Spisok містить основні властивості і методи, які необхідні всім його спадкоємцям, тобто, загальні для всіх списків дані: структура List, покажчики * top і * p, чисто-віртуальні функції:
- Add (Data value, AnsiString name). Додавання елемента з ім'ям «Name», що містить інформацію «Data». Data - це шаблонний тип даних, який може прийняти значення будь-якого переданого в клас типу. Це дозволяє використовувати один і той же клас списку для зберігання даних різних типів. Функція не повертає значень.
- Remove (int index). Видаляє елемент з порядковим номером «Index» зі списку. Для цього створюється додатковий покажчик на видаляється елемент, а посилання з попереднього елемента переноситься на наступний, після чого, відокремлений від списку об'єкт був видалений з пам'яті стандартною процедурою delete (* list). Функція не повертає значень.
- Change (int index, Data value). Змінює значення елемента з порядковим номером «Index» на значення «Data».
- Int count (). Повертає кількість елементів у списку. Підрахунок проводиться за допомогою циклу з передумовою до тих пір, поки не буде досягнутий кінець списку. На кожному кроці циклу відбувається інкремент лічильника.
- Data getvalue (int index). Повертає інформаційне поле елемента з порядковим номером «Index». Відбувається обхід списку до тих пір, поки не буде досягнутий порядковий номер (цикл з параметром). Після цього повертається інформаційне поле.
- AnsiString getname (int index). Повертає ім'я елемента з порядковим номером «Index». Працює аналогічно попередньої функції.
- Int search (AnsiString name). Повертає порядковий номер першого знайденого елемента з ім'ям «Name».
Клас Spisok є абстрактним, так як він містить вище зазначені чисто-віртуальні функції.
Клас Stack - спадкоємець класу Spisok. У ньому перевизначаються все чисто-віртуальні функції предка, їм присвоюється описане вище призначення.
Клас Queue - черга - спадкоємець класу Spisok. Цей клас може використовувати всі функції предка стосовно своїми властивостями, але черга все ж таки відрізняється від стека своїм створенням і додаванням елементів, тому функція додавання елементів в цьому класі перевизначається ще раз, вже для черги.
Клас TLine - лінія. Це основний графічний примітив програми. Інші об'єкти будуються з ліній. Лінія передається в якості інформаційного поля в класи списків. Лінія має кілька властивостей:
- P1, p2 - точки, кожна з яких має 2 координати: x та y. Це кінцеві точки лінії (відрізка). Точка описується окремою структурою point.
- Color - колір лінії. Використовується стандартний тип C + + Builder - TColor.
- Secondary - логічна змінна, що показує, чи є дана лінія допоміжної для побудови об'єкта, або вона основна. Для більш наочного подання способу побудови об'єктів у програмі використовуються допоміжні лінії, які при бажанні користувач може відключати.
Методи класу TLine:
- Setline (point p1, point p2, long int col, bool sec). Встановлює значення властивостей лінії згідно з переданими параметрами.
- Point cut (float k). Повертає крапку на лінії, яка знаходиться на відстані, рівному k * <довжина лінії> від її першого кінця.
Клас BCurve - Крива Безьє. Серед властивостей об'єкта: ім'я, колір основних і допоміжних ліній, 2 опорні лінії і коефіцієнт гладкості k (чим більший коефіцієнт, тим більше лінія схожа на ламану. Максимум k = 0.99, мінімум - 0.01. Оптимальне значення k = 0.25). Клас є 2 функції:
- Queue <Tline> Create (float, Tline, Tline, TColor, TColor, bool, AnsiString). Повертає список ліній, що належать створеної за переданими параметрами кривої Безьє.
- Queue <Tline> Load (). Повертає список ліній, що належать створеної за заздалегідь встановленим параметрам кривої Безьє.
Клас TRectangle - Прямокутник. Створює список з 4-х ліній за переданими параметрами за допомогою функції: queue <Tline> Create (int x1, int y1, int x2, int y2, TColor col).

2.4 Абстрактні типи даних, визначені у програмі
АТД - тип даних, який визначається тільки через операції, які можуть виконуватися над відповідними об'єктами безвідносно до способу представлення цих об'єктів.
2.4.1 ADT Spisok
Дані
Покажчик на вершину списку елементів та на поточний елемент;
Структура, що описує список елементів;
Операції
Add:
Вхід: значення, ім'я;
Передумову: немає;
Процес: додавання елемента в список;
Вихід: немає;
Післяумови: немає;
Remove:
Вхід: порядковий номер;
Передумову: немає;
Процес: видалення елемента зі списку;
Вихід: немає;
Післяумови: немає;
Search:
Вхід: ім'я;
Передумову: немає;
Процес: пошук елемента в списку;
Вихід: порядковий номер знайденого елемента;
Післяумови: немає;
Change:
Вхід: порядковий номер, значення;
Передумову: немає;
Процес: зміна вибраного елемента на елемент з переданим значенням;
Вихід: немає;
Післяумови: немає;
Count:
Вхід: немає;
Передумову: немає;
Процес: підрахунок кількості елементів в списку;
Вихід: кількість елементів у списку;
Післяумови: немає;
Getvalue:
Вхід: порядковий номер;
Передумову: немає;
Процес: отримання інформаційного поля елемента;
Вихід: інформаційне поле елемента;
Післяумови: немає;
Getname:
Вхід: порядковий номер;
Передумову: немає;
Процес: отримання ім'я елемента;
Вихід: ім'я елемента;
Післяумови: немає;
Кінець ADT Spisok
2.4.2 ADT Tline
Дані
2 кінцеві точки, колір, тип лінії;
Операції
Setline:
Вхід: 2 кінцеві точки, колір, тип лінії;
Передумову: немає;
Процес: установка даних об'єкта;
Вихід: немає;
Післяумови: немає;
Cut:
Вхід: коефіцієнт k;
Передумову: немає;
Процес: обчислення точки на лінії, яка знаходиться на відстані, рівному k * <довжина лінії> від її першого кінця;
Вихід: точка на лінії, яка знаходиться на відстані, рівному k * <довжина лінії> від її першого кінця;
Післяумови: немає;
Кінець ADT TLine
2.4.3 ADT BCurve
Дані
Колір допоміжних і основних ліній, 2 базові лінії, коефіцієнт, ім'я;
Операції
Create:
Вхід: Колір допоміжних і основних ліній, 2 базові лінії, коефіцієнт, ім'я;
Передумову: немає;
Процес: створення кривої Безьє;
Вихід: Список ліній, що належать даній кривій;
Післяумови: немає;
Load:
Вхід: немає;
Передумову: немає;
Процес: створення кривої Безьє на основі вже наявних у класі даних;
Вихід: Список ліній, що належать даній кривій;
Післяумови: немає;
Кінець ADT BCurve
2.4.4 ADT TRectangle
Дані
немає;
Операції
Create:
Вхід: Колір 4 координати і колір;
Передумову: немає;
Процес: створення прямокутника;
Вихід: Список ліній, що належать даному прямокутнику;
Післяумови: немає;
Кінець ADT TRectangle

3. ТЕХНОЛОГІЧНА ЧАСТИНА
3.1 Керівництво програміста
3.1.1 Призначення та умови застосування програми
Дана програма призначена для створення графічних зображень на основі декількох графічних примітивів. Підтримує інтерактивне зміна параметрів об'єкту, дозволяє виділяти і видаляти окремі об'єкти або їх частини.
3.1.2 Мінімальні системні вимоги:
1) 64 Мб оперативної пам'яті.
2) 100 Кб вільного місця на жорсткому диску
3) Клавіатура і маніпулятор миша
4) Операційна система Windows 9x/ME/NT/2000/XP
3.1.3 Встановлення програми
Щоб встановити програму, потрібно цілком скопіювати на цільовий комп'ютер *. exe файл програми.
Запустити файл Editor.exe.
3.1.4 Структура програми.
Алгоритм програми
При запуску програми виконуються дії:
· Вибір об'єкта за допомогою клавіатури або за допомогою миші.
· Зазначення місця розташування об'єкта на площині малюнка за допомогою миші (2 або 3 кліки).
· Робота з об'єктами: їх виділення за допомогою ListBox-елемента і зміна їх параметрів або видалення об'єктів або їх частин.
· Закінчення програми відбувається при закритті вікна.
· Створення об'єктів
Після того, як зазначено місце розташування об'єкта, відбувається його створення. Кожен об'єкт являє собою список ліній, тому, для створення будь-якого об'єкта програма створює новий екземпляр класу черги (Queue), якщо він не був створений до цього, і додає в нього отриманий з функції Create (<параметри об'єкта>) відповідного об'єкта список ліній. Для того щоб надати користувачеві можливість роботи з отриманим списком (а значить і об'єктом), цей список заноситься в ListBox-елемент на формі, де користувач зможе отримати до нього доступ.
· Зміна об'єктів та їх частин
Для зміни об'єктів використовується функція класу списків Change (int, Data). При виборі користувачем елемента ListBox'а (окремої лінії-частини об'єкта), в цю функцію передається порядковий номер обраної лінії і нові її параметри, встановлені користувачем.
· Видалення об'єкта або його частини
Для видалення об'єктів необхідно видалити зі списку відповідні їм елементи. Це здійснюється за допомогою функції класу списків Remove (int). У функцію передається порядковий номер обраної лінії.
3.1.5 Тестування програми
Для виконання тестування програми слід зробити наступні дії:
1. Запустити файл "Editor.exe".
2. Вибрати об'єкт
3. Встановити його параметри за допомогою ComboBox-елементів
4. Встановити положення об'єкта на площині шляхом 2-х або 3-х кліків мишкою на білій області форми
5. У разі кривої Безьє можна побачити допоміжні лінії, що використовуються для побудови об'єкта, клацнувши на прапорці «Показати всі лінії». Сюрос цього прапорця прибере допоміжні лінії з екрану
6. У ListBox'е «Всі лінії» вибрати різні лінії. Вони будуть виділятися на об'єкті кольором виділення, який також можна інтерактивно змінити
7. При натисканні на об'єкті в списку «Об'єкти» буде виділена перша лінія виділеного об'єкта в списку вгорі
8. При натисканні Delete виділена лінія видаляється зі списку, залишаючи при цьому об'єкт як єдине ціле. Після видалення ліній з об'єкта над ним можна провести ті ж операції, що і до видалення. При видаленні всіх ліній з об'єкта, він сам видаляється зі списку
9. Закрити вікно для виходу з програми
3.2 Керівництво оператора
У цьому розділі наводиться опис дій оператора (користувача) для досягнення потрібних результатів.
3.2.1 Запуск програми
Щоб запустити програму, потрібно з папки з програмою відкрити файл «Editor.exe».
При запуску програми перед Вами знаходитися наступне вікно:


Рис. 1. Вид головного вікна програми
3.2.2 Створення об'єкта
- Вибрати об'єкт
- Встановити його параметри за допомогою ComboBox-елементів
- Встановити положення об'єкта на площині шляхом 2-х або 3-х кліків мишкою на білій області форми
- У разі кривої Безьє можна побачити допоміжні лінії, що використовуються для побудови об'єкта, клацнувши на прапорці «Показати всі лінії». Сюрос цього прапорця прибере допоміжні лінії з екрану.
3.2.3 Виділення та видалення об'єктів
- У ListBox'е «Всі лінії» вибрати різні лінії. Вони будуть виділятися на об'єкті кольором виділення, який також можна інтерактивно змінити
- При натисканні на об'єкті в списку «Об'єкти» буде виділена перша лінія виділеного об'єкта в списку вгорі
- При натисненні Delete виділена лінія видаляється зі списку, залишаючи при цьому об'єкт як єдине ціле. Після видалення ліній з об'єкта над ним можна провести ті ж операції, що і до видалення. При видаленні всіх ліній з об'єкта, він сам видаляється зі списку
3.2.4 Зміна об'єкта
Для зміни параметрів об'єкта необхідно виділити його в списку об'єктів і встановити нові значення кольорів за допомогою ComboBox-елементів.
3.2.5 Завершення програми
Щоб вийти з програми, потрібно натиснути на кнопку з зображенням хрестика в правому верхньому куті вікна.
3.3 Повідомлення оператору
Вся робота зі списком об'єктів відображається на екрані. При додаванні лінії або об'єкта, він з'являється на екрані, при видаленні - зникає звідти, при виділенні - міняє колір на колір виділення.

СПИСОК ЛІТЕРАТУРИ
1. Дейтел Х., Дейтел П. Як програмувати на С + +: пров. з англ. - М.: «Видавництво Біном», 2003 р .
2. Кондратьєва С.Д. Введення в структури даних: лекції та вправи за курсом. - М.: Видавництво МГТУ ім. Н. Е. Баумана, 2000 р .
3. Стівенс Р. Delphi. Готові алгоритми: Пер. з англ. - М.: Видавництво ДМК Пресс, 2001.-384с.
4. Рейсдорф Кент і Хендерсон Кен Borland C + + Builder. Освой самостійно: [Електронний ресурс].

ДОДАТОК

//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
# Include <stdio.h>
# Include "Unit1.h"
//------------------------------------------------ ---------------------------
# Pragma package (smart_init)
# Pragma resource "*. dfm"
TfrmMain * frmMain;
//==========================================
/ / CLASSES FOR WORK WITH LISTS. IT-41 2007
//==========================================
//***** Structures *****
struct point {
int x, y;
}; / / End struct
//==========================================
/ / 1. Abstract class Spisok
//==========================================
template <class Data> class spisok {
protected:
struct list {
Data inf;
AnsiString name;
list * next;
}; / / End struct list
list * top, * p;
public:
virtual void add (Data value, AnsiString name) = 0;
virtual void remove (int index) = 0;
virtual void change (int index, Data value) = 0;
virtual int count () = 0;
virtual Data getvalue (int index) = 0;
virtual AnsiString getname (int index) = 0;
virtual int search (AnsiString name) = 0;
}; / / End class spisok
//==========================================
/ / 2. CLASS STACK
//==========================================
template <class Data> class stack: public spisok <Data> {
public:
//*************** CONSTRUCTORS ************************
stack () {top = new list; top = NULL;}
~ Stack () {}
//*************** OPERATIONS ************************
int count () {
int i = 0;
p = top;
while (p! = NULL) {
i + +;
p = p-> next;
} / / End while
return (i);
} / / End stack count
void add (Data value, AnsiString name) {
p = new list;
p-> next = top;
p-> inf = value;
p-> name = name;
top = p;
} / / End stack add
int search (AnsiString name) {
int i = 0;
p = top;
while (p! = NULL) {
i + +;
if (p-> name == name) return (i);
} / / End while
return (0);
} / / End function
void remove (int index) {
list * q;
p = top;
for (int i = 1; i <index-1;i++) p=p-> next;
q = p-> next;
if (q == NULL) delete (q); else {p-> next = p-> next-> next; delete (q);}
} / / End stack remove
void change (int index, Data value) {
p = top;
for (int i = 1; i <index;i++) p=p-> next;
p-> inf = value;
} / / End stack change
Data getvalue (int index) {
if (index <= this-> count ()) {
p = top;
for (int i = 1; i <index;i++) p=p-> next;
return (p-> inf);
} / / End if
} / / End function
AnsiString getname (int index) {
p = top;
for (int i = 1; i <index;i++) p=p-> next;
return (p-> name);
} / / End function
void clear () {
} / / End function
}; / / End class stack
//==========================================
/ / 3. CLASS QUEUE
//==========================================
template <class Data> class queue: public stack <Data> {
public:
queue () {top = new list; top-> next = NULL; p = top;}
~ Queue () {}
void add (Data value, AnsiString name) {
p-> next = new list;
p-> next-> next = NULL;
p-> inf = value;
p-> name = name;
p = p-> next;
} / / End function
int count () {
int i = 0;
p = top;
while (p-> next! = NULL) {
i + +;
p = p-> next;
} / / End while
return (i);
} / / End queue count
}; / / End queue class
//==========================================
/ / 4. CLASS LINE
//==========================================
class Tline {
public:
point p1, p2;
TColor color;
bool secondary;
Tline () {color = 0; secondary = 0;}
~ Tline () {}
void setline (point p1, point p2, long int col, bool sec);
point cut (float k);
}; / / End line class
//------------------------------------------
point Tline:: cut (float k) {
point p;
px = p1.x + k * (p2.x-p1.x);
py = p1.y + k * (p2.y-p1.y);
return (p);
} / / End function
void Tline:: setline (point Point1, point Point2, long int col, bool sec) {
p1.x = Point1.x; p1.y = Point1.y;
p2.x = Point2.x; p2.y = Point2.y;
color = col; secondary = sec;
} / / End function
//==========================================
/ / 5. CLASS Bezie Curve
//==========================================
class BCurve {
protected:
bool show_secondary;
public:
TColor color;
AnsiString Name;
TColor scol;
float k;
Tline l1, l2;
BCurve () {}
queue <Tline> Create (float, Tline, Tline, TColor, TColor, bool, AnsiString);
queue <Tline> Load ();
}; / / End BCurve Class
queue <Tline> BCurve:: Create (float koef, Tline line1, Tline line2, TColor col, TColor colsec, bool sec, AnsiString NameOfCurve)
{
queue <Tline> L;
point p1, p2;
Tline l;
k = koef; l1 = line1, l2 = line2; color = col; show_secondary = sec; scol = colsec;
l1.secondary = true; l2.secondary = true; l1.color = colsec; l2.color = colsec; Name = NameOfCurve;
if (show_secondary) {L.add (l1, Name); L.add (l2, Name);}
while (! (l.p1.x == l.p2.x & & l.p1.y == l.p2.y)) {
p1 = l1.cut (k); p2 = l2.cut (k);
l.setline (p1, p2, colsec, 1);
if (show_secondary) L.add (l, Name);
l2.p1 = p2; p2 = l.cut (k); p1 = l1.p1;
l.setline (p1, p2, color, 0); L.add (l, Name);
l1.p1 = p2; l1.p2 = l2.p1;
} / / End while
return (L);
} / / End function
queue <Tline> BCurve:: Load () {
return (this-> Create (k, l1, l2, color, scol, show_secondary, Name));
} / / End function
class TRectangle {
public:
queue <Tline> Create (int x1, int y1, int x2, int y2, TColor col);
}; / / End rectangle class
queue <Tline> TRectangle:: Create (int x1, int y1, int x2, int y2, TColor col) {
queue <Tline> Lines;
Tline l1;
l1.p1.x = x1; l1.p1.y = y1; l1.p2.x = x2; l1.p2.y = y1; l1.color = col; l1.secondary = false;
Lines.add (l1, "Rectangle");
l1.p1.x = x2; l1.p1.y = y1; l1.p2.x = x2; l1.p2.y = y2; l1.color = col; l1.secondary = false;
Lines.add (l1, "Rectangle");
l1.p1.x = x2; l1.p1.y = y2; l1.p2.x = x1; l1.p2.y = y2; l1.color = col; l1.secondary = false;
Lines.add (l1, "Rectangle");
l1.p1.x = x1; l1.p1.y = y2; l1.p2.x = x1; l1.p2.y = y1; l1.color = col; l1.secondary = false;
Lines.add (l1, "Rectangle");
return (Lines);
} / / End function
//=========
/ / Змінні
queue <Tline> LineBufer;
int n = 0;
Tline l1, l2;
queue <int> Objects;
//=========
//------------------------------------------------ ---------------------------
__fastcall TfrmMain:: TfrmMain (TComponent * Owner)
: TForm (Owner)
{
}
//------------------------------------------------ ---------------------------
void LoadLines (bool sec) {
Tline l1;
int checkedItem = frmMain-> ListBox1-> ItemIndex;
frmMain-> ListBox1-> Clear ();
frmMain-> lstObjects-> Clear ();
for (int i = 1; i <= LineBufer.count (); i + +) {
l1 = LineBufer.getvalue (i);
frmMain-> lblPicture-> Canvas-> Pen-> Color = l1.color;
if ((sec & & l1.secondary) | |! l1.secondary) {
if (l1.secondary) frmMain-> lblPicture-> Canvas-> Pen-> Style = 2; else frmMain-> lblPicture-> Canvas-> Pen-> Style = 0;
frmMain-> lblPicture-> Canvas-> MoveTo (l1.p1.x, l1.p1.y);
frmMain-> lblPicture-> Canvas-> LineTo (l1.p2.x, l1.p2.y);
} / / End if
frmMain-> ListBox1-> Items-> Add (IntToStr (l1.p1.x )+";"+ IntToStr (l1.p1.y) + "-" + IntToStr (l1.p2.x )+";"+ IntToStr (l1.p2.y));
} / / Next i
frmMain-> ListBox1-> ItemIndex = checkedItem;
for (int i = 1; i <= Objects.count (); i + +) {
if (Objects.getvalue (i) == 1) frmMain-> lstObjects-> Items-> Add ("Line (1 lines)"); else
if (Objects.getvalue (i) == 4) frmMain-> lstObjects-> Items-> Add ("Rectangle (4 lines)"); else
frmMain-> lstObjects-> Items-> Add ("Bezie Curve (" + IntToStr (Objects.getvalue (i)) + "lines)");
} / / Next i
} / / End function
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: lblPictureMouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (cboObject-> Text == "Крива Безьє") {
n + +;
if (n == 1) {l1.p1.x = X; l1.p1.y = Y;}
if (n == 2) {l1.p2.x = X; l1.p2.y = Y; l2.p1.x = X; l2.p1.y = Y;}
if (n == 3) {
BCurve CurveBufer;
queue <Tline> Lines;
int firstNumber = 0;
l2.p2.x = X; l2.p2.y = Y;
Lines = CurveBufer.Create (0.25, l1, l2, clbColor-> Selected, clbSecond-> Selected, 1, "Bezie");
n = 0;
firstNumber = LineBufer.count ();
for (int i = 0; i <= Lines.count (); i + +) LineBufer.add (Lines.getvalue (i), "Bezie");
LoadLines (chkSecondary-> Checked);
firstNumber = LineBufer.count ()-firstNumber;
Objects.add (firstNumber, "Bezie");
lstObjects-> Items-> Add ("Bezie Curve (" + IntToStr (firstNumber) + "lines)");
} / / End if n == 3
} / / End if Curve
if (cboObject-> Text == "Лінія") {
n + +;
frmMain-> Canvas-> Pen-> Color = clbColor-> Selected;
if (n == 1) {l1.p1.x = X; l1.p1.y = Y;}
if (n == 2) {
l1.p2.x = X; l1.p2.y = Y;
LineBufer.add (l1 ,"");
Objects.add (1, "Line");
LoadLines (chkSecondary-> Checked);
n = 0;
} / / End if n == 2
} / / End if Line
if (cboObject-> Text == "Прямокутник") {
n + +;
queue <Tline> Lines;
TRectangle Rect;
if (n == 1) {l1.p1.x = X; l1.p1.y = Y;}
if (n == 2) {
l1.p2.x = X; l1.p2.y = Y;
Lines = Rect.Create (l1.p1.x, l1.p1.y, l1.p2.x, l1.p2.y, clbColor-> Selected);
for (int i = 0; i <= Lines.count (); i + +) LineBufer.add (Lines.getvalue (i ),"");
Objects.add (4, "Rectangle");
LoadLines (chkSecondary-> Checked);
n = 0;
} / / End if n == 2;
} / / End if rectangle;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: chkSecondaryClick (TObject * Sender)
{
frmMain-> lblPicture-> Refresh ();
LoadLines (chkSecondary-> Checked);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: clbColorChange (TObject * Sender)
{
Tline l1;
int begin = 0;
for (int i = 0; i <lstObjects-> ItemIndex; i + +) begin + = Objects.getvalue (i);
for (int i = begin; i <= begin + Objects.getvalue (lstObjects-> ItemIndex +1); i + +) {
l1 = LineBufer.getvalue (i);
if (! l1.secondary) {
l1.color = clbColor-> Selected;
LineBufer.change (i, l1);
} / / End if
} / / Next i
LoadLines (chkSecondary-> Checked);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: clbSecondChange (TObject * Sender)
{
Tline l1;
int begin = 0;
for (int i = 0; i <lstObjects-> ItemIndex; i + +) begin + = Objects.getvalue (i);
for (int i = begin; i <= begin + Objects.getvalue (lstObjects-> ItemIndex +1); i + +) {
l1 = LineBufer.getvalue (i);
if (l1.secondary) {
l1.color = clbSecond-> Selected;
LineBufer.change (i, l1);
} / / End if
} / / Next i
LoadLines (chkSecondary-> Checked);
}
//------------------------------------------------ ---------------------------
int WhichObject (int number) {
int object = 0;
int i = 0;
while (i <number) {object + +; i + = Objects.getvalue (object);}
if (object == 0) object = 1;
return (object);
} / / End function
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: ListBox1Click (TObject * Sender)
{
Tline l1;
l1 = LineBufer.getvalue (ListBox1-> ItemIndex +1);
frmMain-> lblPicture-> Refresh ();
LoadLines (chkSecondary-> Checked);
for (int i = 2; i> 0; i -) {
frmMain-> lblPicture-> Canvas-> Pen-> Color = clbSelect-> Selected;
frmMain-> lblPicture-> Canvas-> Ellipse (l1.p1.xi, l1.p1.yi, l1.p1.x + i, l1.p1.y + i);
frmMain-> lblPicture-> Canvas-> Ellipse (l1.p2.xi, l1.p2.yi, l1.p2.x + i, l1.p2.y + i);
frmMain-> lblPicture-> Canvas-> MoveTo (l1.p1.x, l1.p1.y);
frmMain-> lblPicture-> Canvas-> LineTo (l1.p2.x, l1.p2.y);
} / / Next
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: ListBox1KeyDown (TObject * Sender, WORD & Key,
TShiftState Shift)
{
if (Key == 46) {
int object = WhichObject (ListBox1-> ItemIndex +1);
frmMain-> lblPicture-> Refresh ();
int z = ListBox1-> ItemIndex;
LineBufer.remove (ListBox1-> ItemIndex +1); ListBox1-> Items-> Delete (ListBox1-> ItemIndex);
ListBox1-> ItemIndex = z;
Objects.change (object, Objects.getvalue (object) -1);
if (Objects.getvalue (object) == 0) {Objects.remove (object); lstObjects-> Items-> Delete (object-1);}
LoadLines (chkSecondary-> Checked);
} / / End if
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: lstObjectsClick (TObject * Sender)
{
int begin = 0;
for (int i = 0; i <lstObjects-> ItemIndex; i + +) begin + = Objects.getvalue (i);
ListBox1-> ItemIndex = begin;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmMain:: lblPictureMouseMove (TObject * Sender,
TShiftState Shift, int X, int Y)
{
lblCoords-> Caption = IntToStr (X) + ";" + IntToStr (Y);
}
//------------------------------------------------ ---------------------------
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
55.9кб. | скачати


Схожі роботи:
Сирітство як соціальна робота Соціальна робота з безробітними
Робота з модемами
Робота з документами
Робота з вікнами 2
Робота і вагітність
Робота з Windows 98
Контрольна робота
Робота з акумуляторами
Робота радіожурналіста
© Усі права захищені
написати до нас