Розробка засобами Delphi дидактичного ілюстративного матеріалу для розвязання задачі з аналітичної Створення нескладних

Міністерство освіти і науки України

Українська інженерно-педагогічна академія

Гірничий факультет

Кафедра інформаційних технологій







Пояснювальна записка



до курсової роботи

з дисципліни «Прикладне програмування»

на тему:

«Розробка засобами Delphi дидактичного ілюстративного матеріалу для розв’язання задачі з аналітичної геометрії. Обчислення проекцій вектора на координатні осі в просторі»





			

			

	Виконав:

	ст. гр. ДК-К7-1

	Валуйський О.С.

	Керівник:

	ас. кафедри І.Т.

		Ушакова І.В.

			



Стаханов

		2009


УІПА, гірничий факультет (найменування вищого навчального закладу)

Кафедра інформаційних технологій

Дисципліна “Прикладне програмування”

Спеціальність 6.01010036

Курс 2. Група ДГ-К7-1. Семестр 4

Завдання

на курсовий проект студента

Валуйського Олексія Сергійовича

(прізвище, ім’я, по батькові)

Тема проекту «Розробка засобами Delphi дидактичного ілюстративного матеріалу для розв’язання задачі з аналітичної геометрії. Обчислення проекцій вектора на координатні осі в просторі»

Термін здачі студентом закінченого проекту до 25 травня 2009 р.

Вихідні дані до проекту Середовище програмування Delphi 7, бібліотека VCL. Діапазон значень на координатних осях

Зміст розрахунково-пояснювальної записки (перелік питань, що їх належить розробити):

Вступ, з обов’язковим посиланням на літературу, в якій вказується актуальність і ефективність програмування в середовищі Delphi 7.

Умова задачі, її аналітичне розв’язання в загальному вигляді з обов’язковим посиланням на літературу.

Розв’язання задачі для самостійно заданих початкових даних з врахуванням градуювання осей координат. Програмування в консольному режимі, отримання результату.

Сценарій проекту розв’язання задачі в Delphi. Програмна реалізація. Алгоритми процедур. Інтерфейс проекту обов’язково повинен включати вікна для графічного розв’язання задачі з контролем введення початкових даних та контролем можливості повного графічного відображення результату; вікно з описом аналітичного розв’язання задачі в загальному вигляді; вікно з даними автора проекту. Тестування проекту для тих даних, що використовувалися в консольному режимі.

Опис інтерфейсу з екранними копіями. 

Висновки з обов’язковим переліком кількісних даних, що характеризують результати розробки. 

Використані джерела. 

Додатки. 

Перелік графічного матеріалу (з точним зазначенням обов’язкових креслень). Сторінки формату А4 зі схемами алгоритмів окремих процедур.

Дата видачі завдання 2 лютого 2009 р. 



Календарний план

№

з/п

Найменування етапів

 курсового проектування

Термін

виконання

Примітки

1.

Вступ. Математичне розв’язання задачі.

до 2.03



2.

Розв’язання задачі в консольному режимі.

до 15.03



3.

Розробка сценарію проекту в Delphi, алгоритмів процедур.

до 15.03

Контроль лектора,

завідувача

кафедри

4.

Програмна реалізація проекту. Тестування проекту, внесення в проект необхідних змін та доповнень.

до 2.05



5.

Оформлення тексту пояснювальної записки: вступ, основний текст, висновки, список джерел та додатки. Представлення проекту на перевірку керівнику.

до 7.05



6.

Підготовка роботи до захисту.

до 15.05



7.

Захист курсової роботи

15-25.05

Комісія



Студент _____________

Керівник _____________

2 лютого 2009 р.


ЗМІСТ



Вступ

1 Математичне розв’язання задачі

1.1 Постановка задачи

1.2 Аналітичне розв’язання в загальному виді

1.2.1 Основні вектори

1.2.2 Координати точки

1.2.3 Кут між віссю координат та вектором

1.2.4 Аналітичне розв’язання

1.2.5 Математичний приклад

2 Сценарій розв’язання задачі в Delphi

2.1 Програмування в консольному режимі

2.1.1 Блок-схема алгоритму

2.1.2 Програмний код консольної програми

2.2 Компоненти та їх властивості

2.2.1 Компонент Edit

2.2.2 Компонент Button

2.2.3 Компонент PageControl

2.2.4 Компонент MainMenu

2.2.5 Компонент CheckBox

2.2.6 Компонент TrackBar

2.2.7 Компонент ColorBox

2.2.8 Компоненти Image і PaintBox

2.3 Структура взаємозв’язку компонентів

2.4 Програмний код додатку

3 Опис інтерфейсу

Висновки

Список використаних джерел




Вступ



У наш час програмування вже не є чимось особливим і кожен бажаючий, за допомогою спеціальних програм, може створювати програми практично будь-якої складності, з використанням старих перевірених способів так і за допомогою нових технологій. Зараз є декілька програм, які здатні, буквально за десять хвилин створити працюючу програму, але десять років тому такого не було. Було лише середовище програмування - Delphi, яке стала логічним продовженням мови Turbo Pascal, але містило підтримку графічних версій Windows та набір компонентів VCL, за допомогою яких можна швидко створювати інтерфейси різної складності. Наприкінці дев'яностих Delphi почала займати лідируючі позиції в середовищах RAD і відняло велику кількість користувачів від Visual Basic і Visual C + +. Найпопулярнішою версією стала Delphi 7, яку багато користувачів вважають найбільш вдалою і самої зручною.[1]

Отже, чим же є середовище Delphi насправді 

Зручне середовище для набору програмного коду з повною підтримкою Unicode.

Підтримка об'єктно-орієнтованого програмування.

Швидка побудова програм з використанням візуальних компонентів. 

Вбудований компілятор, відладчик та інші інструменти

Різні способи колективної розробки програм.

Інструменти для створення нових візуальних компонентів.

Детальна довідка по всім компонентам й програмам. 

Набір прикладів для кращого вивчення мови.

Розширена підтримка різних драйверів баз даних.

Головним плюсом середовища Delphi є те, що її можна використовувати як для створення програм для доступу до баз даних, так і для створення ігрових програм. Не буде складнощів і при створенні математичних програм. Середовище включає в себе повний набір компонентів для розробки графічного інтерфейсу програми, які розподіляються за групами. Так само при бажанні можна створити свої компоненти (з використанням ООП) або завантажити з Інтернету. 

Таким чином, для створення в Delphi нескладних програмних продуктів зовсім не обов'язково розуміти внутрішню структуру Windows-програми. Достатньо вміти працювати з деякими компонентами, що постачається разом із середовищем розробника. При цьому почати роботу із середовищем можна практично без попереднього ознайомлення, а написання першої програми не вимагатиме поглиблення знання про особливості системи. Цьому почасти сприяє зручний інтерфейс середовища розробника. [2]

Актуальність цієї робити полягає в рішенні алгебраїчних та геометричних задач з використанням мови Pascal, та на прикладі цієї задачі ми вивчимо мову програмування на прийнятному рівні, адже в даному випадку необхідно використовувати не тільки різні графічні компоненти і заздалегідь заготовлені шаблони коду. За допомогою математичних формул і формул перетворення необхідно обчислювати значення геометричних фігур і виводити графічні даних на екран. Для цього необхідно досконало знати математичні методи Delphi, а також графічну систему виводу 2D графіки GDI+. У процесі виконання роботи передбачається оволодіння всіма основними навичками програмування під Windows.




1 Математичне розв’язання задачі



1.1 Постановка завдання



Система швидкої розробки програм Delphi дозволяє створювати програми для вирішення математичних завдань практично будь-якої складності, а також забезпечити програму зручним інтерфейсом користувача і довідковою системою, для простого освоєння програми. 

Математична задача, в даному випадку це програма для побудови вектора у Декартові системі координат, яка повинна, спочатку, малювати математичну систему координат з позначенням осей, сіткою і градуювання, а потім виводити вектор з наперед заданими умовами.

Мета: розробити програму для розв'язання поставленої математичної задачі в середовищі Delphi.

Завдання:

Вивчити матеріал по заданій темі 

Підготувати коротку математичну довідку з даної задачі 

Провести математичне розв’язання задачі 

Вибрати необхідні компоненти для створення інтерфейсу 

Перевірити правильність розв’язання задачі в програмі 

Додати в програму інформацію про автора та про програму 

Зробити висновки за виконану роботу



1.2 Аналітичне розв’язання в загальному виді



1.2.1 Основні вектори

Три взаємно перпендикулярні осі OX, OY, OZ, що проходять через деяку точку О, утворюють прямокутну систему координат. Точка О називається початком координат, прямі OX, ОУ, OZ - осями координат (OX - ось абсцис, OY - ось ординат, OZ - ось аплікат), а площини XOY, YOZ, ZOX - координатними площинами. Який-небудь відрізок UV приймається за одиницю масштабу для всіх трьох осей. 

Відклавши на осях OX, OY, OZ в позитивному напрямку відрізки OA, OB, ОС, рівні одиниці масштабу, отримаємо три вектора OA, OB, ОС. Вони називаються основними векторами і позначаються відповідно i, j, k.

Позитивні напрямки на осях прийнято вибирати так, щоб поворот на 90°, що поєднують позитивний промінь OX з променем ОУ, здавався відбувається проти годинникової стрілки, якщо спостерігати його з боку променя OZ. Така система координат називається правою. Іноді користуються і лівої системою координат. У ній згаданий поворот відбувається за годинниковою стрілкою.





Рисунок 1.1 Основні вектори



1.2.2 Координати точки

Положення будь-якої точки М в просторі можна визначити трьома координатами наступним чином. Через М проводимо площині MP, MQ, MR, відповідно паралельні площинах YOZ, ZOX, XOY. У перетині з осями отримуємо точки Р, Q, R. Числа х (абсциса), у (ордината), z (апліката), вимірюють відрізки OP, OQ, OR у вибраному масштабі, називаються (прямокутними) координатами точки М. Вони беруться позитивними або негативними, дивлячись по тому, чи мають вектори OP, OQ, OR відповідно ті ж напрямки, що й основні вектори i, j, k, або протилежні. [1]

Приклад. Координатами точки М (на рис. 1.2) є: абсциса х = 2, ордината у = -3, апліката z = 2. Запис: М (2; -3; 2). Вектор ОМ, що йде від початку координат O до деякої точці M, називається радіусом-вектором точки М і позначається літерою r, щоб відрізняти один від одного радіус-вектори різних точок, при букві r ставлять значки: так, радіус-вектор точки М позначається rm . Радіус-вектори точок А1, А2 …, An позначаються r1, r2 …rn





Рисунок 1.2 Координати точки



Прямокутними координатами вектора m називаються алгебраїчні проекції вектора m на осі координат. Координати вектора позначаються великими літерами X, У, Z (координати точки - малими).

Запис: m{Х; У; Z) або m = {X; У; Z)

Замість того, щоб проектувати вектор m на осі OX, ОУ, OZ, можна проектувати його на осі М1А, М1В, М1С (рис. 1.3), проведені через початок М1 вектора m і дорівнює направленню з осями координат.

Координати вектора не змінюються при паралельному перенесенні системи координат. Навпаки, координати точки при паралельному перенесенні системи координат змінюються. [1]

Якщо початкова точка вектора ОМ співпадає з початком координат, то координати вектора ОМ відповідно рівні координатами кінцевої його точки М.





Рисунок 1.3 Координати вектора

1.2.3 Кут між віссю координат та вектором

Кути α, β, γ (рис. 1.4), утворених позитивними напрямками OX, OY, OZ з вектором a{X;Y;Z}, можна знайти за формулами



, (1)

, (2)

, (3)



Приклад









Рисунок 1.4 Кут між віссю координат так вектором



Якщо вектор a має довжину, що дорівнює одиниці масштабу, тобто якщо |a| = 1, то , , .

З формул (1), (2), (3) випливає:



 (4)


Приклад: Знайти кути, утворених осями координат з вектором {2;-2;-1}.

Розв’язання. ,, , звідки  



1.2.4 Аналітичне розв’язання

По заданому модулю вектора і заданими кутах між вектором і осями OX, OY, OZ, обчислити проекції вектора на координатні осі.

Дано: 








Розв’язання:

За формулою  обчислюємо відповідно x, y, z











Отримані значення перетворимо в екранні координати







cpX, cpY – центр системи координат dp – масштаб

Виводимо вектор за отриманими координатами





Рисунок 1.5 Отриманий вектор



1.2.5 Математичний приклад

Дано: 



















Рішення:

За формулою  обчислюємо відповідно x, y, z











Виходить вектор з координатами 

Отримані значення перетворимо в екранні координати







Будуємо вектор у системі координат


2. Сценарій розв’язання задачі в Delphi



2.1 Програмування в консольному режимі



2.1.1 Блок-схема алгоритму





Початок

1

Введення кутів

2

Обчислення

x,y,z

4

вивід результата

6

Кінець

7

Введення модуля

3

Обчислення

Xe, Ye

5





Рисунок 2.1 Блок-схема алгоритму

2.1.2 Програмний код консольної програми

program Console;



{$APPTYPE CONSOLE}



uses

 SysUtils,

 Windows,

 Forms,

 Math;



var

 a,b,v: real; //углы между векторами и осями

 m: integer; //модуль вектора

 x,y,z: integer; //координаты вектора

 xe,ye: integer; //экранные координаты вектора



const

 dp = 14;

 cpX = 250;

 cpY = 200;



//Вывод текста кириллицей на экран

procedure printf(const S: AnsiString);

var

 Result: AnsiString;

begin

 SetLength(Result, Length(S));

 AnsiToOemBuff(@S[1], @Result[1], Length(S));

 writeln(result);

end;



//Задержка

procedure Delay(ms : cardinal);

var

 t1: cardinal;

begin

 t1:=GetTickCount;

 while (GetTickCount - t1) < ms do Application.ProcessMessages;

end;



begin

 //Ввод данных

 printf('Введите угол альфа');

 readln(a);

 printf('Введите угол бета');

 readln(b);

 printf('Введите угол гамма');

 readln(v);

 printf('Введите модуль вектора');

 readln(m);

 //Расчет данных

 printf('Идет расчет данных...');

 x:=round(cos(a*(Pi/180))*m);

 y:=round(cos(b*(Pi/180))*m);

 z:=round(cos(v*(Pi/180))*m);

 delay(4000);

 //Расчет экранных координат

 xe:=cpX + (y * dp) - (x * dp div 2);

 ye:=cpY + (x * dp div 2) - (z * dp);

 //Вывод информации

 printf(Format('Вектор с координатами: a={%d,%d,%d}',[x,y,z]));

 printf(Format('Экранные координаты: Xe=%d, Ye=%d',[xe,ye]));

 readln;

end. 




Рисунок 2.2 Консольна програма



2.2 Компоненти та їх властивості



Створюючи цю програму я використовував багато графічних компонентів, наприклад Edit, Button, CheckBox, MainMenu, ColorBox, PageControl и TrackBar.



2.2.1 Компонент Edit

Компонент для відображення, введення та редагування однорядкових текстів. Є можливість оформлення об'ємного бордюру. Основна властивість — Text. У компоненті Edit текст, що вводиться або виводиться, міститься у властивості Text. Цю властивість можна встановлювати в процесі проектування або вказувати програмно. Вирівнювання тексту, як це має місце в позначках і панелях, неможливо. Неможливе також і перенесення рядків. Текст, який не вміщується по довжині у вікно, просто зрушується, і користувач може переміщуватися по ньому за допомогою курсору.



Таблиця 2.1 - Властивості компоненту Edit

Властивості

Опис

AutoSize

Автоматично налаштування під розмір тексту

Color

Колір тексту

Font: TFont

Вибраний шрифт тексту

Left: integer

Положення компонента по горизонталі

ReadOnly: Boolean

Тільки для читання

Text

Введений текст

Top: integer

Положення компонента по вертикалі

Visible: Boolean

Показує чи видимий компонент в даний час

Width: integer

Ширина форми в пікселях



2.2.2 Компонент Button

Кнопки TButton широко використовуються для управління програмами. Пов'язаний з кнопкою алгоритм управління реалізується в обробнику події OnClick. На відміну від більшості інших видимих компонентів кнопка TButton є компонентом самої Windows і тому не може змінювати свій колір довільним чином - вона його змінює разом зі зміною палітри Windows. Кнопка завжди має системний колір clBtnFace і не має властивості Color. Шрифт напису на кнопці може змінювати свій стиль і розмір, але компонент ігнорує зміну його кольору.



Таблиця 2.2 Властивості компоненту Button

Властивості

Опис

Caption: string

Заголовок компоненту

Cursor: TCursor

Тип курсору, коли він знаходиться на компоненті

Enabled: Boolean

Вмикання/вимикання кнопки

Font: TFont

Параметри шрифту

Height: integer

Висота компонента в пікселях

Left: integer

Положення компонента по горизонталі

ModalResult: TModalResult

Результат модального вікна

Name

Ім'я компонента

Style: TButtonStyle

Стиль кнопки 

bsCommandLink – кнопка-посилання 

bsPushButton - звичайний стиль кнопки 

bsSplitButton - кнопка з випадаючого меню

Top: integer

Положення компонента по вертикалі

Visible: Boolean

Показує чи видимий компонент в даний час

Width: integer

Ширина компонента в пікселях

2.2.3 Компонент PageControl

Дозволяє створювати сторінки, керовані закладками чи іншими органами управління, для економії місця в програмі. Багатосторінкові панелі дозволяють заощаджувати простір вікна додатку, розміщуючи на одному і тому ж місці сторінки різного змісту..



Таблиця 2.3 Властивості компоненту PageControl

Властивості

Опис

Align: TAlignPosition

Вирівнювання компонента, по якомусь краю або по всій формі

Caption: string

Заголовок компоненту

Cursor: TCursor

Тип курсору, коли він знаходиться на компоненті

Height: integer

Висота компонента в пікселях

Left: integer

Положення компонента по горизонталі

Name

Ім’я компонента

Style: TButtonStyle

Стиль компонента 

tsTabs - Закладки 

tsButtons - Кнопки 

tsFlatButtons - Пласкі кнопки

TabIndex: integer

Поточна закладка

TabPosition: TTabPosition

Положення компонента 

tsTop - зверху 

tsRight - справа 

tsBottom - знизу 

tsLeft - зліва

Top: integer

Положення компонента по вертикалі

Visible: Boolean

Показує чи видимий компонент в даний час

Width: integer

Ширина компонента в пікселях



2.2.4 Компонент MainMenu

Дозволяє конструювати та створювати смугу головного меню форми та випадаючі меню. MainMenu — це не візуальний компонент, тобто місце його розміщення на формі в процесі проектування не має ніякого значення для користувача — він все одно побачить не сам компонент, а тільки меню, генероване ним.

Таблиця 2.4 Властивості компоненту MainMenu

Властивості

Опис

AutoHotkeys

maAutomatic

maManual

AutoLineReduction

maAutomatic

maManual

Images: TImageList

Підключаемий компонент ImageList

Items: TMenuItem

Елементи меню



2.2.5 Компонент CheckBox

Дозволяє користувачеві вмикати та вимикати опції програми. Індикатори з прапорцем CheckBox використовуються в додатках в основному для того, щоб користувач міг вмикати та вимикати якісь параметри, або для індикації стану. При кожному натисканні користувача на індикатор його стан змінюється, проходячи в загальному випадку послідовно через три значення: виділення (поява чорної галочки), проміжне (сіре вікно індикатора та сіра пташка) і не виділене (порожнє вікно індикатора). Цим трьом станам відповідають три значення властивості компоненту State: cbChecked, cbGrayed, cbUnchecked



Таблиця 2.5 Властивості компоненту CheckBox

Властивості

Опис

Caption: string

Заголовок компоненту

Checked

Вимкнений компонент чи ні

Enabled: Boolean

Вмикання/вимикання кнопки

Font: TFont

Параметри шрифту

Height: integer

Висота компонента в пікселях

Left: integer

Положення компонента по горизонталі

Name

Ім'я компонента

State: 

cbUnchecked

cbGrayed

cbChecked

Top: integer

Положення компонента по вертикалі

Visible: Boolean

Показує чи видимий компонент в даний час

Width: integer

Ширина компонента в пікселях

2.2.6 Компонент TrackBar

Компонент TrackBar являє собою елемент управління у вигляді повзунка, який користувач може переміщати курсором миші або клавішами клавіатури під час роботи додатку. Таким чином, користувач може керувати якимись процесами: гучністю звуку, розміром зображення і т. п. TrackBar може розташовуватися горизонтально, вертикально, мати шкалу з різних сторін і якийсь виділений діапазон шкали.



Таблиця 2.6 Властивості компоненту TrackBar

Властивості

Опис

Frequency: integer

Заголовок компоненту

Height: integer

Висота компонента в пікселях

Left: integer

Положення компонента по горизонталі

Max: integer

Максимальне значення

Min: integer

Мінімальне значення

Name

Ім'я компонента

Orientation

trVertical

trHorizontal

Position: integer

Позиція

TickMarks

tmBoth

tmBottomRight

tmTopLeft

TickStyle

tsManual

tsAuto

tsNone



2.2.7 Компонент ColorBox

Компонент являє собою комбінований список, опціями якого є кольору, тобто призначений для відображення і вибору кольору. На відміну від компонентів ColorGrid і ColorDialog - склад відображаємих ім кольорів може змінюватися. Багато які властивості, методи та події компонента збігаються з однойменною властивостями, методами і подіями його найближчого родича - компонента CоmbоВох.




Таблица 2.7 Властивості компоненту ColorBox

Властивості

Опис

DefaultColorColor: Tcolor

Стандартний колір

Enabled: Boolean

Вмикання/вимикання кнопки

Font: TFont

Параметри шрифту

Height: integer

Висота компонента в пікселях

Left: integer

Положення компонента по горизонталі

Name

Ім'я компонента

Selected: TColor

Вибраний колір

Style

cbStandartColors

cbExtendedColor

cbSystemColors

Top: integer

Положення компонента по вертикалі

Visible: Boolean

Показує чи видимий компонент в даний час

Width: integer

Ширина компонента в пікселях



2.2.8 Компоненти Image і PaintBox

Компоненти Image та PaintBox представляють собою деяку обмежену поверхню з канвою, на яку можна заносити зображення. При цьому компонент PaintBox, власне кажучи, не дає нічого нового порівняно з малюванням на канві форми. Малювання на PaintBox замість форми не має ніяких переваг, окрім як деякого полегшення у розташуванні одного чи декількох малюнків на площі вікна.


2.3 Структура взаємозв’язку компонентів





Рисунок 2.3 Структура взаємозв’язку компонентів


2.4 Програмний код програми



unit frmMain;



interface



uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, Menus, StdCtrls, Buttons, ComCtrls, ShellAPI, IniFiles;



type

 TMainForm = class(TForm)

 AxisPanel: TPaintBox;

 MainMenu1: TMainMenu;

 Action1: TMenuItem;

 PageControl1: TPageControl;

 TabSheet1: TTabSheet;

 TabSheet2: TTabSheet;

 GroupBox1: TGroupBox;

 Label1: TLabel;

 Label2: TLabel;

 Label3: TLabel;

 editA: TEdit;

 editB: TEdit;

 editC: TEdit;

 GroupBox3: TGroupBox;

 Label5: TLabel;

 Label6: TLabel;

 Label7: TLabel;

 editX: TEdit;

 editY: TEdit;

 editZ: TEdit;

 AnalyticsExecution1: TMenuItem;

 Quickcalculation1: TMenuItem;

 GroupBox4: TGroupBox;

 checkScale: TCheckBox;

 checkGrid: TCheckBox;

 checkFrame: TCheckBox;

 checkNumber: TCheckBox;

 GroupBox5: TGroupBox;

 cbVector: TColorBox;

 Label8: TLabel;

 Label9: TLabel;

 cbAxis: TColorBox;

 Label10: TLabel;

 cbFrame: TColorBox;

 N1: TMenuItem;

 butSave: TButton;

 butDraw: TButton;

 tbScale: TTrackBar;

 StatusBar1: TStatusBar;

 N2: TMenuItem;

 Label4: TLabel;

 EditM: TEdit;

 butCalc: TButton;

 procedure AxisPanelPaint(Sender: TObject);

 procedure FormResize(Sender: TObject);

 procedure butCalcClick(Sender: TObject);

 procedure ShowOrigData(Sender: TObject);

 procedure Exit1Click(Sender: TObject);

 procedure DrawChange(Sender: TObject);

 procedure butDrawClick(Sender: TObject);

 procedure Howtouse1Click(Sender: TObject);

 procedure editExit(Sender: TObject);

 procedure miAboutClick(Sender: TObject);

 procedure FormCreate(Sender: TObject);

 procedure butSaveClick(Sender: TObject);

 procedure tbScaleChange(Sender: TObject);

 procedure checkScaleClick(Sender: TObject);

 procedure N2Click(Sender: TObject);

 private

 procedure DrawLineCustom(ax,ay,az,bx,by,bz: integer; width: byte);

 procedure DrawGrid(ax,ay,az,bx,by,bz: integer);

 procedure DrawText(text: string; px, py: integer);

 public

 { Public declarations }

 end;



var

 MainForm: TMainForm;

 cp: TPoint;

 drawVector, drawArc: boolean;

 vectorx, vectory, vectorz: integer;

 dp, dph: integer;

 step: integer;



const

 xmin = -10; xmax = 10;

 ymin = -14; ymax = 10;

 zmin = -10; zmax = 10;



implementation



uses

 frmOrig, frmAbout;



{$R *.dfm}



//-------------

{Рисование произвольной линии}

procedure TMainForm.DrawLineCustom(ax,ay,az,bx,by,bz: integer; width: byte);

begin

 AxisPanel.Canvas.Pen.Width:=width;

 AxisPanel.Canvas.MoveTo(cp.X + (ay*dp) - (ax*dph),

 cp.Y + (ax*dph) - (az*dp));

 AxisPanel.Canvas.LineTo(cp.X + (by*dp) - (bx*dph),

 cp.Y + (bx*dph) - (bz*dp));

end;



{Вывод текста}

procedure TMainForm.DrawText(text: string; px, py: integer);

begin

 AxisPanel.Canvas.TextOut(px,py,text);

end;



{Рисование сетки}

procedure TMainForm.DrawGrid(ax,ay,az,bx,by,bz: integer);

begin

 AxisPanel.Canvas.Pen.Style:=psDot;

 DrawLineCustom(ax,ay,az,bx,by,bz,1);

end;



{Прорисовка всего и вся}

procedure TMainForm.AxisPanelPaint(Sender: TObject);

var

 i, num: integer;

 vx,vy,vz: integer;

begin

 with AxisPanel.Canvas do

 begin

 //Центр оси координат

 cp.X:=AxisPanel.Width div 2;

 cp.Y:=AxisPanel.Height div 2;

 //Рамка

 Pen.Color:=clBlack;

 Rectangle(0,0,AxisPanel.Width, AxisPanel.Height);

 //Черчение трехмерной сетки

 if checkGrid.Checked then

 begin

 for i := 0 to 12 do

 begin

 DrawGrid(6, ymin + 2*i, zmax, -6, ymin + 2*i, zmax); //Сетка 1

 DrawGrid(6, ymin + 2*i, 0, -6, ymin + 2*i, 0); //Сетка 2

 DrawGrid(6, ymin + 2*i, zmin, -6, ymin + 2*i, zmin); //Сетка 3

 if i < 7 then

 begin

 DrawGrid(-6 + 2*i, ymax, zmax, -6 + 2*i, ymin, zmax);

 DrawGrid(-6 + 2*i, ymax, 0, -6 + 2*i, ymin, 0);

 DrawGrid(-6 + 2*i, ymax, zmin, -6 + 2*i, ymin, zmin);

 end;

 if i < 4 then

 begin

 DrawGrid( 6 - 4*i, ymin, zmax, 6 - 4*i, ymin, zmin);

 DrawGrid(-6 + 4*i, ymax, zmax,-6 + 4*i, ymax, zmin);

 end;

 end;

 end;

 //Подписи осей и нумерация

 DrawText('X', cp.X - 10 * dph, cp.Y + 10 * dph);

 DrawText('Y', cp.X + 10 * dp, cp.Y);

 DrawText('Z', cp.X - 2, cp.Y - 11 * dp);

 if (checkNumber.Checked) then

 begin

 num := xmax;

 for i := 0 to 24 do

 begin

 if num <> 0 then

 begin

 DrawText(IntToStr(num),(cp.X + dp * 10) - (i * dp),cp.Y-15);

 if (i < 21) then

 DrawText(IntToStr(num),cp.X+5, (cp.Y - dp * 10)+(i * dp)-5);

 end;

 num := num - 1;

 end;

 end;

 //Координатные оси

 Pen.Color:=cbAxis.Selected;

 DrawLineCustom(xmin,0,0,xmax,0,0,2);

 DrawLineCustom(0,ymin,0,0,ymax,0,2);

 DrawLineCustom(0,0,zmin,0,0,zmax,2);

 //Каркас

 if drawVector then

 begin

 if checkFrame.Checked then

 begin

 Pen.Color:=cbFrame.Selected;

 Pen.Style:=psSolid;

 DrawLineCustom(0, 0, 0, vectorx, 0, 0, 2);

 DrawLineCustom(0, 0, 0, 0, vectory, 0, 2);

 DrawLineCustom(0, 0, 0, 0, 0, vectorz, 2);

 DrawLineCustom(0, vectory, 0, vectorx, vectory, 0, 1);

 DrawLineCustom(vectorx, vectory, 0, vectorx, 0, 0, 1);

 DrawLineCustom(vectorx, 0, vectorz, 0, 0, vectorz, 1);

 DrawLineCustom(0, vectory, vectorz, 0, 0, vectorz, 1);

 DrawLineCustom(0,vectory,vectorz,vectorx,vectory,vectorz, 1);

 DrawLineCustom(vectorx,vectory,vectorz,vectorx,0,vectorz, 1);

 DrawLineCustom(vectorx, vectory,0,vectorx,vectory,vectorz, 1);

 DrawLineCustom(vectorx, 0, 0, vectorx, 0, vectorz, 1);

 DrawLineCustom(0, vectory, 0, 0, vectory, vectorz, 1);

 end;

 Pen.Color:=cbVector.Selected;

 DrawLineCustom(0, 0, 0, vectorx, vectory, vectorz, 2);

 //Дуги

 if drawArc then

 begin

 vx := round(cos(StrToInt(editA.Text)*(pi/180))*2);

 vy := round(cos(StrToInt(editB.Text)*(pi/180))*2);

 vz := round(cos(StrToInt(editC.Text)*(pi/180))*2);

 Pen.Color:=clBlack;

 DrawLineCustom(2,0,0,vx,vy,vz,2);

 DrawLineCustom(0,2,0,vx,vy,vz,2);

 DrawLineCustom(0,0,2,vx,vy,vz,2);

 end;

 end;

 end;

end;

//---------------



//Создание формы

procedure TMainForm.FormCreate(Sender: TObject);

var

 ini: TIniFile;

begin

 vectorx:=4;

 vectory:=-5;

 vectorz:=5;

 dp := 14;

 dph := dp div 2;

 //Чтение настроек

 ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\DefSet.ini');

 try

 editA.Text:=IntToStr(ini.ReadInteger('DefNumbers','alpha',60));

 editB.Text:=IntToStr(ini.ReadInteger('DefNumbers','beta',135));

 editC.Text:=IntToStr(ini.ReadInteger('DefNumbers','gamma',45));

 editM.Text:=IntToStr(ini.ReadInteger('DefNumbers','module',7));

 step:=ini.ReadInteger('DrawOptions','step',2);

 drawArc:=ini.ReadBool('DrawOptions','arc',false);

 finally

 ini.Free;

 end;

end;



//Расчет данных

procedure TMainForm.butCalcClick(Sender: TObject);

var

 a,b,c,m: integer;

begin

 //Ввод данных

 a := StrToInt(editA.Text);

 b := StrToInt(editB.Text);

 c := StrToInt(editC.Text);

 m := StrToInt(editM.Text);

 //Вычисление

 vectorx := round(cos(a*(pi/180))*m);

 vectory := round(cos(b*(pi/180))*m);

 vectorz := round(cos(c*(pi/180))*m);

 //Вывод данных

 editX.Text := IntToStr(vectorx);

 editY.Text := IntToStr(vectory);

 editZ.Text := IntToStr(vectorz);

end;



//Перерисовка

procedure TMainForm.DrawChange(Sender: TObject);

begin

 AxisPanel.Repaint;

end;



//Исходные данные

procedure TMainForm.ShowOrigData(Sender: TObject);

begin

 OrigForm := TOrigForm.Create(Application);

 case(Sender as TMenuItem).Tag of

 1: begin

 OrigForm.Caption:='Аналитическое решение';

 OrigForm.Image1.Picture.LoadFromFile('Calc1.png');

 end;

 2: begin

 OrigForm.Caption:='Математический пример';

 OrigForm.Image1.Picture.LoadFromFile('Calc2.png');

 end;

 end;

 if (OrigForm.ShowModal = mrOK) then OrigForm.Free;

end;



procedure TMainForm.tbScaleChange(Sender: TObject);

begin

 dp:=tbScale.Position;

 dph:=dp div 2;

 AxisPanel.Repaint;

end;



//Закрытие программы

procedure TMainForm.Exit1Click(Sender: TObject);

begin

 MainForm.Close;

end;



//Изменение размеров формы

procedure TMainForm.FormResize(Sender: TObject);

begin

 AxisPanel.Left:=10;

 AxisPanel.Top:=170;

 AxisPanel.Width:=MainForm.ClientWidth-20;

 AxisPanel.Height:=MainForm.ClientHeight-200;

end;



//Вызов справки

procedure TMainForm.Howtouse1Click(Sender: TObject);

begin

 ShellExecute(MainForm.Handle, nil, PChar('help.chm'), nil, nil, SW_ShowNormal);

end;



//Рисовать вектор

procedure TMainForm.butDrawClick(Sender: TObject);

begin

 if (vectorx >= xmin) and (vectorx <= xmax) then

 if (vectory >= ymin) and (vectory <= ymax) then

 if (vectorz >= zmin) and (vectorz <= zmax) then

 begin

 drawVector := not drawVector;

 if drawVector then

 butDraw.Caption:='Удалить вектор' else

 butDraw.Caption:='Рисовать вектор';

 end else

 begin

 if not drawVector then butDraw.Caption:='Рисовать вектор';

 drawVector := false;

 ShowMessage('Параметры вектора выходят за предел допустимых значений');

 end;

 AxisPanel.Repaint;

end;



//Проверка данных

procedure TMainForm.editExit(Sender: TObject);

label

 error;

begin

 {Значение модуля}

 if (Sender as TEdit) = editM then

 case StrToInt(editM.Text) of

 0..20: Exit;

 else GOTO error;

 end else



 {Значение угла}

 begin

 case StrToInt((Sender as TEdit).Text) of

 0..180: Exit;

 else GOTO error;

 end;

 end;



 error:

 Application.MessageBox('Введено неправильное значение. Значение выходит за диапазон допустимых значений','Предупреждение',0);

 (Sender as TEdit).Text:='0';

end;



//Окно О программе

procedure TMainForm.miAboutClick(Sender: TObject);

begin

 AboutForm.ShowModal;

end;



procedure TMainForm.N2Click(Sender: TObject);

begin

 ShellExecute(MainForm.Handle, nil, PChar('console.exe'), nil, nil, SW_ShowNormal);

end;



//Сохранение картики

procedure TMainForm.butSaveClick(Sender: TObject);

var

 sd: TSaveDialog;

 bmp: TBitmap;

 i,j: integer;

begin

 sd:=TSaveDialog.Create(Application);

 sd.InitialDir:='C:\';

 sd.Filter:='Bitmap|*.bmp';

 bmp:=TBitmap.Create;

 bmp.Width:=AxisPanel.Width;

 bmp.Height:=AxisPanel.Height;

 if sd.Execute then

 begin

 AxisPanel.Repaint;

 for i:=0 to bmp.Width do

 for j:=0 to bmp.Height do

 bmp.Canvas.Pixels[i,j]:=AxisPanel.Canvas.Pixels[i,j];

 bmp.SaveToFile(sd.FileName+'.bmp');

 end;

 bmp.Free;

 sd.Free;

end;



procedure TMainForm.checkScaleClick(Sender: TObject);

begin

 if checkScale.Checked then tbScale.Visible:=true else tbScale.Visible:=false;

end;



end.


3 Опис інтерфейсу



Запуск програми здійснюється подвійним натисненням по файлу vector3d.exe. Перед користувачем з’явиться заставка у якій показуються усі основні дані про проект.





Рисунок 3.1 Заставка



Ця форма стоїть як заставка протягом трьох секунд, після чого вона зникає й з’являється головна форма програми (рис 3.2)





Рисунок 3.2 Головне вікно


Меню «Файл» і «Справка» створені за допомогою компоненту MainMenu

Також у програмі використовуються такі компоненти як StatusBar, PageControl та PaintBox.



 

Рисунок 3.3 Приклад роботи прогами



Для початку роботи з програмою необхідно перейти на вкладку Расчет, та ввести початкові данні про кути, та модуль.

Далі треба натиснути кнопку Расчет

Після чого треба перейти на вкладку Рисовать

На цій вкладці можна вибирати колір осей, масштаб та інші опції

Для виведення вектора треба натиснути кнопку Рисовать вектор

Якщо параметри вектора входять в діапазон допустимих значень, то вектор буде намальован (рис 3.3).




Рисунок 3.4 Аналітичне розв’язання



Якщо треба вивести на екран приклад розв’язання задачі або аналітичне рішення, то треба вибрати в меню Файл відповідний пункт.





Рисунок 3.5 Математичний приклад


Для того щоб показати інформацію про програму необхідно натиснути Справка-Визов справки (рис 3.6)





Рисунок 3.6 Информація про програму



Якщо данні були введені некоректно, то будуть з’являтись відповідні вікна з помилками (рис 3.7, рис 3.8)



 

Рисунок 3.7 Приклад вікна с помилкою





Рисунок 3.8 Вихід за границю дозволенних значень

Висновки



Даний курсовий проект полягає в розробці та створенні програми для розв’язання задачі з аналітичної геометрії. Поставлена на початку мета була досягнута з використанням середовища об’єктно-орієнтованого програмування Delphi. Отриманні теоретичні знання застосовані на практиці, тобто програма була розроблена відповідно до завдання, а також були зроблені додатки, які потрібні для більш зручного використання програми. Найбільш складним завданням було перетворення математичних координат в екранні координати. Об’єктно-орієнтоване середовище програмування Delphi дозволило виконати проект зручним та простим до використовування, за допомогою різноманітних графічних компонентів. Отже середовище Delphi добре підходить для розв’язання програм заснованих на математичних завданнях.

Весь проект складається з 17 файлів, сумарний об’єм яких дорівнює 4.15 Мб.



Таблиця 4.1 Розмір файлів проекту

Файли проекту

Опис

Розмір

frmAbout.dfm

форма AboutForm

32 КБ

frmAbout.pas

код класса AboutForm

1 КБ

frmMain.dfm

форма MainForm

12 КБ

frmMain.pas

код класса MainForm

11 КБ

frmOrig.dfm

форма OrigForm

850 Байт

frmOrig.pas

код класса OrigForm

551 Байт

frmSplash.dfm

форма SplashForm

156 КБ

frmSplash.pas

код класса SplashForm

386 Байт

vector3d.dpr

файл проекту

766 Байт

vector3d.dproj

файл проекту

5 КБ

vector3d.res

ресурси

5 КБ

calc1.png

малюнок 1

37 КБ

calc2.png

малюнок 2

19 КБ

console.exe

консольна програма

503 КБ

defset.ini

файл з настройками

159 Байт

help.chm

файл справки

159 КБ

vector3d.exe

виконавчий файл

1025 КБ




Список використаних джерел



		Хладни И. Внутренний мир Borland Delphi 2006 — К.: Издательский дом "Вильямс", 2006. — 480 с.

		Гаевский А. Разработка программных приложений на Delphi 6 – М.: Киев, 2000. — 457 с.

		Выгодский М.Я. Справочник по высшей математике — М.: АСТ: Астрель, 2006. — 991 с.: ил.

		Бондаренко, М.А. Программирование в Delphi. Харьков: б.н., 2005.

		Ильина Т.А. Программирование на Delphi 6 — М.: Питер, 2000. — 318 с.

		Шапошников И. Delphi 5 — М.: Санкт-Петербург, 2001. — 203 с.

		http://ru.wikipedia.org (онлайн енциклопедія).

		http://www.realcoding.net (онлайн довідник по Delphi).

		http://www.delphisources.ru (онлайн довідник по Delphi).