Система координат канви - Программирование, компьютеры и кибернетика курсовая работа

Система координат канви - Программирование, компьютеры и кибернетика курсовая работа



































Компоненти C++Builder та властивість Canvas. Викреслювання прямої лінії, метод LineTo. Способи малювання на канві. Вивід зображень за допомогою пікселів. Збереження конфігурації в файлах ini. Методи читання: ReadString, Readlnteger, ReadFloat, ReadBool.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Багато компонентів в C++Builder мають властивість Canvas (канва, полотно), є областю компоненту, на якій можна малювати або відображати готові зображення. Цю властивість мають форми, графічні компоненти Image, PaintBox, Bitmap і багато інших. Канва містить властивості і методи, що істотно спрощують графіку C++Builder. Всі складні взаємодії з системою заховані для користувача, так що малювати в C++Builder може людина абсолютно не досвідчена в машинній графіці.
Кожна точка канви має координати X і Y. Система координат канви, як і скрізь в C++Builde, має початком лівий верхній кут канви. Координата X зростає при переміщенні зліва направо, а координат Y -- при переміщенні зверху вниз.
З координатами ви вже мали справу багато разів, але поки вас не дуже цікавило, що стоїть за ними, в яких одиницях вони вимірюються. Координати вимірюються в пікселах. Піксел -- це найменший елемент поверхні малюнка, з яким можна маніпулювати. Найважливіша властивість піксела -- його колір. Для опису кольору використовується тип TColor. З кольором ви зустрічаєтеся практично в кожному компоненті і знаєте, що в C++Builder визначена безліч констант типу TColor. Одні з них безпосередньо визначають кольори (наприклад clBlue -- синій), інші визначають кольори елементів вікон, які можуть мінятися залежно від вибраної користувачем палітри квітів Windows (наприклад, clBtnFace -- колір поверхні кнопок).
1.1 Компонент Image і деякі його властивості
Нерідко виникає потреба прикрасити своє застосування якимись картинками. Це може бути графічна заставка, що є логотипом вашого застосування. Або це можуть бути фотографії при розробці застосування, що працює з базою даних співробітників якоїсь установи. У першому випадку вам буде потрібно компонент Image, розташований на сторінці Additional бібліотеки компонентів, в другому -- його аналог DBImage, пов'язаний з даними і розташований на сторінці Data Controls.
Почнемо знайомство з цими компонентами. Відкрийте нове застосування і перенесіть на форму компонент Image. Його властивість, яка може містити картинку, -- Picture. Натисніть на кнопку з багатокрапкою біля цієї властивості або просто зробіть подвійне клацання на Image, і перед вами відкриється вікно Picture Editor, що дозволяє завантажити у властивість Picture який-небудь графічний файл (кнопка Load), а також зберегти відкритий файл під новим ім'ям або в новому каталозі. Клацніть на Load, щоб завантажити графічний файл. Перед вами відкриється вікно Load Picture. У міру переміщення курсора в списку по графічних файлах в правому вікні відображаються зображення, що містяться в них. Ви можете знайти графічні файли в каталозі Images. Він зазвичай розташований в каталозі ... \Program files\Common Files\Borland Shared.
У вікні завантаження графічного файлу ви можете не тільки проглянути зображення, що зберігається у вибираному файлі, але і побачити розмір зображення -- цифри в дужках справа вгорі. В деяких випадках, як ви побачите пізніше, це важливо.
Після завантаження файлу клацніть на ОК і у вашому компоненті Image відобразиться вибрана вами картинка. Можете запустити ваше застосування і помилуватися нею. Втім, ви і так побачите картинку, навіть не виконуючи програма.
Коли ви в процесі проектування завантажили картинку з файлу в компонент Image, він не просто відображає її, але і зберігає в застосуванні. Це дає вам можливість поставляти ваше застосування без окремого графічного файлу. Втім, як ми побачимо пізніше, в Image можна завантажувати і зовнішні графічні файли в процесі виконання застосування.
Повернемося до розгляду властивостей компоненту Image.
Якщо встановити властивість AutoSize в true, то розмір компоненту Image автоматично підганятиметься під розмір помішаної в нього картинки. Якщо ж властивість AutoSize встановлена в false, то зображення може не поміститися в компонент або, навпаки, плошадь компоненту може опинитися багато більше площі зображення.
Інша властивість -- Stretch дозволяє підганяти не компонент під розмір малюнка, а малюнок під розмір компоненту. Встановіть AutoSize в false, розтягніть або стисніть розмір компоненту Image і встановіть Stretch в true. Ви побачите, що малюнок займе всю площу компоненту, але оскільки навряд чи реально встановити розміри Image пропорційними розміру малюнка, те зображення спотвориться. Встановлювати Stretch в true може мати сенс тільки для якихось узорів, але не для картинок. Властивість Stretch не діє на зображення піктограм, які не можуть змінювати своїх розмірів.
Властивість -- Center, встановлене в true, центрує зображення на площі Image, якщо розмір компоненту більше розміру малюнка.
Розглянемо еше одна властивість - - Transparent (прозорість). Якщо Transparent рівне true, то зображення в Image стає прозорим. Це можна використовувати для накладення зображень один на одного. Помістите на форму другий компонент Image і завантажите в нього іншу картинку. Тільки постарайтеся узяти яку-небудь малозаполненую, контурну картинку. Можете, наприклад, узяти картинку з числа тих, що поміщаються зазвичай на кнопки, наприклад, стрілку (файл ... \program files\common files\borland shared\images\buttons\arrowlr.bmp ). Пересуньте ваші Image так, щоб вони перекривали один одного, і у верхньому компоненті встановите Transparent рівним true. Ви побачите, що верхня картинка перестала затуляти нижнюю. Одне з можливих застосувань цієї властивості -- накладення на картинку написів, виконаних у вигляді бітової матриці. Ці написи можна зробити за допомогою вбудованої в C++Builder програми Image Editor, яка буде розглянута пізніше.
Врахуйте, що властивість Transparent діє тільки на бітові матриці.
Будь-яка картинка, креслення або схема можуть розглядатися як сукупність графічних примітивів: крапок, ліній, кіл, дуг і ін. Таким чином, для того, щоб на екрані з'явилася потрібна картинка, програма повинна забезпечити викреслювання (вивід) графічних елементів - примітивів, складових цю картинку.
Викреслювання графічних примітивів на поверхні (форми або компоненту image - області виведення ілюстрації) здійснюється застосуванням відповідних методів до властивості Canvas цієї поверхні.
Викреслювання прямої лінії виконує метод LineTo. Метод малює лінію з тієї точки, в якій в даний момент знаходиться олівець (ця точка називається поточною позицією олівця або просто "поточною"), в точку, координати якої вказані в інструкції виклику методу.
малює лінію в точку з координатами (100, 200), після чого поточною стає точка з координатами (100, 200).
Початкову точку лінії можна задати, перемістивши олівець в потрібну точку графічної поверхні. Зробити це можна за допомогою методу MoveTo, вказавши як параметри координати точки початку лінії. Наприклад, оператори
Canvas->MoveTo(10,10); //встановити олівець в точку (10,10)
// лінія з точки (10,10) в точку (50,10)
малюють горизонтальну лінію з точки (10, 10) в точку (50, 10).
Використовуючи властивість поточної точки, можна намалювати ламану лінію. Наприклад, оператори
Виведення тексту (рядків типу AnsiString) на поверхню графічного об'єкту забезпечує метод TextOutA. Інструкція виклику методу TextOutA в загальному вигляді виглядає таким чином:
Параметр текст задає текст, що виводиться. Параметри х і у визначають координати точки графічної поверхні, від якої виконується виведення тексту.
Шрифт, який використовується для виведення тексту, визначається значенням властивості Font відповідного об'єкту Canvas. Властивістю Font є об'єкт типу TFont. У табл. 3.4 перераховані властивості об'єкту TFont, що визначають характеристики шрифту, використовуваного методом TextOutA для виведення тексту.
Name Використовуваний шрифт. Як значення слід використовувати назву шрифту (наприклад, Arial)
Size Розмір шрифту в пунктах (points). Пункт - це одиниця вимірювання розміру шрифту, використовується в поліграфії. Один пункт рівний 1/72 дюйми.
Style Стиль зображення символів. Можливо: нормальним, напівжирним, курсивним, підкресленим, перекресленим. Стиль задається за допомогою наступних констант: fsBold (напівжирний), fsltalic (курсив), fsUnderline (підкреслений), fsStrikeOut (перекреслений). Властивість Style є множиною, що дозволяє комбінувати необхідні стилі. Наприклад, інструкція, яка встановлює стиль "напівжирний курсив", виглядає так:
Canvas->Font->Style=TFontStyles() <Brush->Color = clWhite; Canvas->FillRect(aRect);
// нижню половину вікна фарбуємо блакитним
aRect = Rect(0,ClientHeight/2,ClientWidth,ClientHeight);
Canvas->Font->Name = "Times New Roman";
// Canvas->Font->Style = TFontStyles() <TextWidth(ms))/2;
у = ClientHeight/2 - Canvas->TextHeight(ms)/2;
Canvas->Brush->Style = bsClear; // область виведення тексту
Canvas->Font->Color = clBlack; Canvas->TextOutA(x,y,ms); // вивести текст }
1.2 Вивід зображень за допомогою пікселів
Малювати на канві можна різними способами. Перший варіант -- малювання по пикселам. Для цього використовується властивість канви Pixels. Цією властивістю є двовимірний масив Canvas->Pixels[intX][int Y], який відповідає за кольори канви. Наприклад, Canvas->PixeIs[10][20] відповідає кольору пиксела, 10-го зліва і 20-го зверху. З масивом пикселов можна звертатися як з будь-якою властивістю: змінювати колір, задаючи пикселу нове значення, або визначати його колір по значенню, що зберігається в нім. Наприклад, Canvas->PixeIs[10][20]= clBlack -- це завдання пикселу чорного кольору.
Давайте спробуємо намалювати графік деякої функції F(X) наканве компоненту Imagel, якщо відомий діапазон її зміни Ymax і Ymin і діапазон зміни аргументу Xmin і Хтах. Це можна зробити такою процедурою:
for (РХ = 0: РХ <= Imagel->Width; Рх++)
//Х- координата, відповідна пикселу з координатою РХ
X = Xmin + РХ * (Xmax - Xmin) / Imagel->Width;
Y = F(X); //PY - координата пиксела, відповідна координаті Y
PY = imagel->Height - (Y - Ymin)*Imagel->Height/(Ymax-Ymin); //Устанавливается чорний колір вибраного пиксела
Imagel->Canvas->Pixels[PX][PY] = clBlack;}
У цьому коді вводяться змінні X і Y, що є значеннями аргументу і функції, а також змінні РХ і PY, що є координатами пикселов, відповідними X і Y. Сама процедура складається з циклу по всіх значеннях горизонтальної координати пикселов РХ компоненту Imagel. Спочатку вибране значення Рхнересчитиваєтсявсоответствующєєзначенієх. Потім проводиться виклик функції і визначається її значення Y. Це значення перераховується у вертикальну координату пиксела PY. І на закінчення колір пиксела з координатами (РХ, PY) встановлюється чорним.
Спробуйте створити відповідне застосування і подивитися, як воно працює. Хай для простоти ми орієнтуватимемося на функцію sin(X), для якої Xmin=0, Хmax=4pi (2 періоди в радіанах), Ymin=-1, Ymax=l.
Почніть новий проект, помістіть на нього компонент Image і кнопку з написом «Намалювати», в обробник події OnClick якою запишіть код, аналогічний приведеному вище, але що конкретизує функцію:
for (РХ = 0: РХ <- Imagel->Width; PX++)
{//X - координата, відповідна пикселу з координатою РХ
Y = sin(X); //PY - координата пиксела, відповідна координаті У
PY = Imagel->Height - (Y+1) * Imagel->Height / 2; //Устанавливается чорний колір вибраного пиксела
Imagel->Canvas->Pixels(PX][PY] = clBlack; }
1.3 Збереження конфігурації в файлах ini
| Файли .ini - це текстові файли, призначені для зберігання інформації про настройки різних програм. Інформація у файлі логічно групується в розділи, кожен з яких починається оператором заголовка, поміщеним в квадратні дужки. Наприклад [Desktop|]. У рядках, наступних за заголовком, міститься інформація, що відноситься до даного розділу, у формі:
Driver32=C|: \WINDOWS\SYSTEM\odbcjt32.dll
Файли .ini, як правило, зберігаються в каталозі Windows|, який можна знайти за допомогою функції GetWindowsDirectory|.
У C++Builder| роботу з файлами .ini найпростіше здійснювати за допомогою створення в програмі об'єкту типу TIniFile|. Цей тип описаний в модулі inifiles|, який треба підключати до програми оператором uses| (автоматично це не робиться).
При створенні об'єкту типу TlniFile| в нього передається ім'я файлу .ini, з яким він зв'язується. Файл повинен існувати до створення об'єкту.
Для запису значень ключів існує багато методів: WriteString|, WriteInteger|, WriteFloat|, |і ін. Кожен з них записує значення відповідного типу. Оголошення всіх цих методів дуже схожі. Наприклад:
void| fastcall| WriteString| (const| AnsiString| Section|
const| AnsiString| Ident|, const| AnsiString| Value|);
void| fastcall| Writelnteger| (const| AnsiString| Section|
const| AnsiString| Ident|, int| Value|);
У всіх оголошеннях Section| - розділ файлу, Ident| - ключ цього розділу, Value| - значення ключа. Якщо відповідний розділ або ключ відсутній у файлі, він автоматично створюється.
Є аналогічні методи читання: ReadString|, Readlnteger|, ReadFloat|, ReadBool| і ін. Наприклад:
AnsiString| fastcall| ReadString| (const| AnsiString| Section|
const| AnsiString| Ident|, const| AnsiString| Default|);
int| fastcall| Readlnteger| (const| AnsiString| Section|
const| AnsiString| Ident|, int| Default|);
Методи повертають значення ключа| розділу Section|. Параметр Default| визначає значення, що повертається у випадку, якщо у файлі не вказано значення відповідного ключа.
Перевірити наявність значення ключа можна методом ValueExists|, в який передаються імена розділу і ключа. Метод DeleteKey| видаляє з файлу значення вказаного ключа у вказаному розділі. Перевірити наявність у файлі необхідного розділу можна методом SectionExists|. Метод EraseSection| видаляє з файлу вказаний розділ разом зі всіма його ключами. Є ще ряд методів, які ви можете подивитися у вбудованій довідці C++Builder|.
Подивимося на прикладі, як все це можна використовувати для установки програми, запам'ятовування її настройоки і для видалення програми.
Зробіть просте тестову програму. Перенесіть на форму три кнопки Button| і діалог FontDialog|. Перша кнопка (назвіть її BInst| і задайте напис Install|) імітуватиме установку програми. Точніше, не саму установку, оскільки копіювати файли з загрузочної дискети ми не будемо, а тільки створення файлу .ini у каталозі Windows|. Друга кнопка (назвіть її BUnlnst| і задайте напис Unlnstall|) імітуватиме видалення програми. Тут ми не видалятимемо саму програму з диска, а тільки видалимо з каталога Windows| наш файл, а третя кнопка (назвіть її BFont| і задайте напис Font|) дозволятиме змінювати ім'я шрифту, використовуваного у формі, і забезпечить запам'ятовування цього шрифту у файлі .ini, щоб надалі при запуску програми можна було читати цю настройку і задавати її формі.
TGameStatus *GameStatus = new TGameStatus;
int Width, Height, Left, Right, Top, Bottom;
float GetAngToXY( pBall b ;float hitX, hitY){
AB = sqrt(sqr(x-b->x)+sqr(y-b->y));
V2 = sqrt(b->dx*b->dx+b->dy*b->dy);
then alfaB = arccos((x-b->x)/AB); //=alfaA+pi
dx = ((dx - 2*aPrXx) + bPrXx)*mu; // = mu*(bPrXx - aPrXx)
dy = ((dy - 2*aPrXy) + bPrXy)*mu; // = mu*(bPrXy - aPrXy)
b->dx = ((b->dx - 2*bPrXx) + aPrXx)*mu; // = mu*(aPrXx - bPrXx)
b->dy = ((b->dy - 2*bPrXy) + aPrXy)*mu; // = mu*(aPrXy - bPrXy)}
open_status = waveOutOpen(&WaveOut, 0, &pcm, Form1->Handle,
{ for( j = 0; j <=Lose->Count-1; j ++)
for( i = 0; i <=Ball->Count-1; i ++)
d = sqrt(sqr(b->x-lz->x)+sqr(b->y-lz->y));
for( i = 0; i <=Ball->Count-1; i ++)
if((b->ID == Bl->ID) || (not b->exist)
d := sqrt(sqr(b.x-Bl.x)+sqr(b.y-Bl.y));
Canvas->Rectangle(0,0,Width, Height);
Canvas->Rectangle(BilliardTable->Left - LoseSize, BilliardTable->Top - LoseSize,
BilliardTable->Right + LoseSize, BilliardTable->Bottom + LoseSize);
Canvas->Rectangle(BilliardTable->Left, BilliardTable->Top, BilliardTable->Right, BilliardTable->Bottom);
Canvas->Ellipse(BilliardTable->Left + (3 * BilliardTable->Width / 4)-2,
BilliardTable->Top + (BilliardTable->Height / 2)-2,
BilliardTable->Left + (3 * BilliardTable->Width / 4)+2,
BilliardTable->Top + (BilliardTable->Height / 2)+2);
Canvas->TextOut(BilliardTable->Left+30, dh + 1,
Canvas->TextOut(BilliardTable->Left+30, BilliardTable->Bottom,
if(Player == 0 ) Canvas->Font->Style = [fsBold];
Canvas->TextOut(BilliardTable->Right-150, BilliardTable->Bottom,
"Игрок:"+IntToStr(PlayerN[0]->balls));
if(Player == 1 ) Canvas->Font->Style = [fsBold];
Canvas->TextOut(BilliardTable->Right-150, dh + 1,
"Компьютер:"+IntToStr(PlayerN[1]->balls));
for( i = 0; i <=Lose->Count-1; i ++)
for( i = 0; i <=Ball->Count-1; i ++)
TextOut(x-4,y-8, IntToStr(ballsInside)); } }
Ellipse(Trunc(x-r*sqrt(2)/2*0.5-2), Trunc(y-r*sqrt(2)/2*0.5-2),
Trunc(x-r*sqrt(2)/2*0.5+2), Trunc(y-r*sqrt(2)/2*0.5+2));
{ TextOut(Trunc(x-4), Trunc(y-8), IntToStr(ID)); }
x1 = Trunc(ToBall->x+cos(Angle)*(ToBall->R+energy));
y1 = Trunc(ToBall->y+sin(Angle)*(ToBall->R+energy));
x2 = Trunc(ToBall->x+cos(Angle)*(ToBall->R+CueLength+energy));
y2 = Trunc(ToBall->y+sin(Angle)*(ToBall->R+CueLength+energy));
x3 = Trunc(ToBall->x-cos(Angle)*1000);
y3 = Trunc(ToBall->y-sin(Angle)*1000);
for( i = 0; i <=BilliardTable->Lose->Count-1; i ++)
{ lz = BilliardTable->Lose->Items[i];
inLz = sqrt(sqr(x-lz->x)+sqr(y-lz->y)) <== lz->R;
for( j = 0; j <=BilliardTable->Ball->Count-1; j ++)
{ bb = BilliardTable->Ball->Items[j];
d = sqrt(sqr(x-bb->x)+sqr(y-bb->y));
int MaxEnergy= 20; // сила максимального удару
int PyramidHeight; //величина піраміди
float MovementLimit; // переміщення
TBilliardTable *BilliardTable= new TBilliardTable;
__fastcall TForm1::TForm1(TComponent* Owner)
{ for( i =0; i<=BilliardTable->Ball->Count-1; i ++)
{ //b=BilliardTable->Ball->Items[i];
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TBilliardTable *BilliardTable= new TBilliardTable;
if(Player == 1 ) exit;// нельзя управлять во время хода компьютера!
do{ cur = (cur - 1 + Ball->count) % Ball->count;
if(Key == 32 ) if (Cue->Visible) Cue->Hit();
// Cue->ToBall = Ball->Items[cur]; } }}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
*/ if (CompMove != 0 && Player == 1)
{ Cue->Angle = Cue->Angle + Step*CompMove;
if(abs(CompAngle-Cue->Angle) <= Step)
if(Player == 0 ) MustBeHitted = False;
MustBeHitted = False; } for(int i =0; i <=Ball->count-1; i++)
//lz = BilliardTable->Lose->Items[num];
if((b->x+b->dx > BilliardTable->Right-b->R)
|| (b->x+b->dx < BilliardTable->Left+b->R)
if((b->y+b->dy > BilliardTable->Bottom-b->R)
|| (b->y+b->dy < BilliardTable->Top+b->R)
Cue->energy = Trunc(MaxEnergy/2*cos(tick/5)+MaxEnergy/2)+1; }
for( i = 0; i <=Ball->Count - 1; i ++)
allstopped = (b->dx == 0) && (b->dy == 0) && allstopped; }
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
if(Player == 1 ) exit;// нельзя управлять во время хода компьютера!
if(Key in ["h", "H"] then ComputerMove;// help me!}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{ INI = TIniFile->Create(ExtractFilePath(ParamStr(0))+"\settings.ini");
INI->Writeint ("Phisics", "ballSize", ballSize);
INI->Writeint ("Phisics", "PocketSize", loseSize);
INI->Writeint ("Phisics", "MaxEnergy", MaxEnergy);
INI->Writeint ("Phisics", "CueLength", CueLength);
INI->Writeint ("Phisics", "PyramidHeight", PyramidHeight);
INI->WriteFloat("Phisics", "Friction", mu);
INI->WriteFloat("Phisics", "AngleStep", Step);
INI->WriteFloat("Phisics", "MovementLimit", MovementLimit);
INI->Writeint ("Phisics", "TimeInterval", Timer1->Interval);}
void __fastcall TForm1::Button1Click(TObject *Sender)
b->x = BilliardTable->Width / 4 + BilliardTable->Left;
b->y = BilliardTable->Height / 2 + BilliardTable->Top;
b->col = clLtGray;//Random(clWhite);
luza->x = BilliardTable->Left + (BilliardTable->Width / 2)*(i+1);
luza->y = BilliardTable->Top + (BilliardTable->Height / 2)*(j*2);
{ luza->x = trunc(luza->x - i*luza->R*sqrt(2)/2);
luza->y = trunc(luza->y -(j*2-1)*luza->R*sqrt(2)/2); }
for( j = 1; j <=PyramidHeight; j ++)
b->col = clLtGray; //Random(clWhite);//clLtGray;
then b->y = -((j-1) / 2)*2*b->R+(i-1)*2*b->R + H / 2
else b->y = -((j-1) / 2)*2*b->R+(i-1)*2*b->R - b->R + H / 2;
b->x = (j-1)*2*b->R + 3 * BilliardTable->Width / 4 + dw + LoseSize;
BilliardTable->Cue->ToBall = BilliardTable->Ball->Items[0];
BilliardTable->Cue->angle = 180*Pi/180;
BilliardTable->Cue->visible = False;
void __fastcall TForm1::FormCreate(TObject *Sender)
{ INI = TIniFile->Create(ExtractFilePath(ParamStr(0))+"\settings.ini");
ballSize = INI->Readint ("Phisics", "ballSize", 10);
loseSize = INI->Readint ("Phisics", "PocketSize", ballSize + 5);
MaxEnergy = INI->Readint ("Phisics", "MaxEnergy", 20);
CueLength = INI->Readint ("Phisics", "CueLength", 200);
PyramidHeight = INI->Readint ("Phisics", "PyramidHeight", 5);
mu = INI->ReadFloat("Phisics", "Friction", 0.97);
Step = INI->ReadFloat("Phisics", "AngleStep", 0.03);
MovementLimit = INI->ReadFloat("Phisics", "MovementLimit", 0.01);
Timer1->Interval = INI->Readint ("Phisics", "TimeInterval", 20);
BilliardTable = TBilliardTable->Create;
BilliardTable->Ball = TList->Create;
BilliardTable->Lose = TList->Create;
Грають двоє: людина і комп'ютер. Першим робить хід чоловік. Хід передається іншому гравцеві, якщо даний гравець не забив в лузи жодної кулі (див. Додаток А).
Сила удару залежить від відстані в даний момент кия від битка (див. Додаток Б).
вліво-управо - перемикання з однієї кулі на іншій
"H", "h" - підказка для людини (як на його місці зробив би хід чоловік)
"I", "i" - включення/виключення нумерації куль
"S", "s" - включення/виключення лінії прицілювання
Опис файлу конфігурації settings.ini:
Maxenergy=20 - максимальна сила удару
Friction=0,97 - коефіцієнт тертя (строго менше 1)
Pyramidheight=5 - кількість рівнів в піраміді з кулями
Anglestep=0,03 - крок повороту кия навколо кулі
Movementlimit=0,1 - межа вектора швидкості, після якого рух кулі вважається припиненим.
Timeinterval=20 - час між кадрами перемальовування (у мілісекундах)
Використання методів Canvas для відображення графіки в проектах C++Builder допомогло реалізувати поставлену задачу. Але цей метод від малювання графіки на формі об'єктів є досить не практичний і тому важливо кожного разу перемалювати всю сцену з її об'єктами, а коли ми маємо анімацію то перемалювання сцени має ще й відбуватись непомітно для ока користувача, хоча цього часом буває досить важко добитись, особливо коли багато анімацій відбувається одночасно для декількох обєктів, що збільшує час виводу певного зображення на екран.
В даній роботі я зміг добитись пере малювання куль, кия та всього столу буз затримки картинки, що створює ілюзію анімації для людського ока. Сама логіка гри дуже проста, коли кілі торкаються одна одної то кожній передається імпульс і прискорення з початковою швидкістю, котра зменшується з часом та відбиттям від інших об'єктів, тобто зіткненням.
Програма широко використовує фізичні закони, для моделювання гри в середовищі C++Builder.
1. С++ для начинающих Липпман 2003г 332 стр.
2. Введение в язык С++ Бьярн Страустрап, 1995 г. ; Книга по Си; уроки Visual C++ 2004г, 560 стр.
3. http://forums.delphi.com/ab_cplus/start
4. Программирование на языке СИ Ю.Ю.Громов, С.И.Татаренко 1998г 545 стр.;
5. Applied C++: Practical Techniques for Building Better Software Авторы: Philip Romanik, Amy Muntz 2003г. 470 стр.
6. C++ Unleashed Автор: Jesse Liberty 2005г. 396 p.
Область применения компьютерной графики. Работа с графикой в Delphi, обращение к свойству Canvas-компонентов. Холст для рисования Canvas - перевернутая система координат. Свойства и методы приложения. Простое приложение, иллюстрирующее работу с графикой. курсовая работа [968,7 K], добавлен 23.03.2015
Загальна характеристика теорії редагування зображень, місце у ній растрових зображень. Аналіз переваг та недоліків програм малювання і векторної графіки. Структура, розмір і розширення зображення. Сутність і призначення основних форматів графічних файлів. реферат [1,1 M], добавлен 13.10.2010
Історія розробки та розвитку комп'ютерного редактора, його основні функції. Порядок запуску Adobe Photoshop 7.0 та роботи з ним, опис його інтерфейсу та інструментів малювання. Алгоритм створення графічних зображень у програмі, формати їх збереження. курсовая работа [1,1 M], добавлен 06.04.2014
Методи поліпшення растрових зображень. Параметри виду, буфер глибини, джерело світла в бібліотеці Opengl. Створення тривимірної фігури та забезпечення її повороту за допомогою Opengl, виконання операції масштабування з використанням клавіші "+" та "-". контрольная работа [139,4 K], добавлен 12.09.2009
Сучасні методи стеганографії. Атака з вибором контейнера. Методи стегоаналізу цифрових зображень. Розробка програмних засобів виявлення наявности прихованої інформації в мультимедійних файлах. Алгоритм виявлення прихованої інформації в BMP форматах. курсовая работа [1,9 M], добавлен 10.12.2012
Порівняльна характеристика структури мов програмування Assembler та C. Вивчення поняття "об'єктного файлу" та "виконуваного модуля". Розгляд функцій переривання, введення/виведення символу та стрічки, екранного режиму та малювання крапки і прямої. курс лекций [348,8 K], добавлен 18.06.2010
Піксел як універсальний растровий графічний примітив. Схема алгоритму виводу прямої лінії. Використання операцій із плаваючою точкою. Графічна бібліотека DirectX, її сутність, основні компоненти, версії. Приклад файлу форми Delphi3 для побудови сфери. контрольная работа [34,1 K], добавлен 05.10.2009
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Система координат канви курсовая работа. Программирование, компьютеры и кибернетика.
Перспективы Развития России В 21 Веке Реферат
СТРУКТУРА И УПРАВЛЕНИЕ КАНАЛАМИ РАСПРЕДЕЛЕНИЯ
Реферат: Иностранное инвестирование в РФ
Реферат по теме Cистемы управления
Введение Дипломной Работы
Курсовая работа: Руководитель организации. Функции и роль организации труда
Контрольная работа по теме Защита прав отдельных категорий лиц и по отдельным категориям уголовных дел
Курсовая работа по теме Особенности восстановления платежеспособности должника при проведении процедуры финансового оздоровления
Практическое задание по теме Решение задач линейного программирования
Реферат Про Бога Древнего Египта Анубис
Реферат по теме Монархия как форма правления
Примерный перечень экзаменационных вопросов по предмету психология и педагогика
Реферат На Тему Роль Алхимии В Становлении Химии
Реферат: Songs Of America Essay Research Paper Songs
Реферат: Налог на доход физических лиц 2
Контрольная Работа Александр 1
Автореферат Докторской Диссертации Образец 2022
Доклад по теме Всемирный потоп
Реферат: Барабанная сушилка
Взаимопонимание Пример Из Жизни Сочинение
Западники и Славянофилы. Проблема "Россия-Запад". Евразийство. - История и исторические личности контрольная работа
Субарахноидально-вентрикулярное кровоизлияние. Отек мозга. Оболочечный синдром. Центральная тетраплегия. Гипертоническая болезнь 3 степени - Медицина история болезни
Бухгалтерский и финансовый учет целевых поступлений на примере ТСЖ "Правобережное" - Бухгалтерский учет и аудит курсовая работа


Report Page