//Черчение трехмерной сетки
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.
Запуск програми здійснюється подвійним натисненням по файлу vector3d.exe. Перед користувачем з’явиться заставка у якій показуються усі основні дані про проект.
Рисунок 3.1 Заставка
Ця форма стоїть як заставка протягом трьох секунд, після чого вона зникає й з’являється головна форма програми (рис 3.2)
Рисунок 3.2 Головне вікно
1. Меню «Файл» і «Справка» створені за допомогою компоненту MainMenu
2. Також у програмі використовуються такі компоненти як StatusBar, PageControl та PaintBox.
Рисунок 3.3 Приклад роботи прогами
1. Для початку роботи з програмою необхідно перейти на вкладку Расчет, та ввести початкові данні про кути, та модуль.
2. Далі треба натиснути кнопку Расчет
3. Після чого треба перейти на вкладку Рисовать
4. На цій вкладці можна вибирати колір осей, масштаб та інші опції
5. Для виведення вектора треба натиснути кнопку Рисовать вектор
6. Якщо параметри вектора входять в діапазон допустимих значень, то вектор буде намальован (рис 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 КБ |
1. Хладни И. Внутренний мир Borland Delphi 2006 — К.: Издательский дом "Вильямс", 2006. — 480 с.
2. Гаевский А. Разработка программных приложений на Delphi 6 – М.: Киев, 2000. — 457 с.
3. Выгодский М.Я. Справочник по высшей математике — М.: АСТ: Астрель, 2006. — 991 с.: ил.
4. Бондаренко, М.А. Программирование в Delphi. Харьков: б.н., 2005.
5. Ильина Т.А. Программирование на Delphi 6 — М.: Питер, 2000. — 318 с.
6. Шапошников И. Delphi 5 — М.: Санкт-Петербург, 2001. — 203 с.
7. http://ru.wikipedia.org (онлайн енциклопедія).
8. http://www.realcoding.net (онлайн довідник по Delphi).
9. http://www.delphisources.ru (онлайн довідник по Delphi).