Проект 1

Графіка у Builder. Клас ТCanvas

 

 

Хід виконання роботи

Проект 1

Створіть на диску Е: у своєму каталозі новий проект та збережіть його: модулю Unit1.cpp надайте ім’я Ris.cpp, а файлу проекту Project1.bpr –ім’я Malunok. bpr.

Помістіть на форму компонент Panel (укладка Standard) та розташуйте на ньому компонент Edit (укладка Standard), компонент Button (укладка Standard), шість компонентів SpeedButton (укладка Additional) та чотири позначки Label (укладка Standard).

Розташування компонентів показано на рис. 1:

Рис. 1.

Встановіть властивості компонентів згідно таблиці:

 

Компонент Name Властивість Значення
Form1 MainForm Caption 3D Rotation
    Height
    Width
    KeyPreview true
Panel1 Panel1 Caption  
    Align alLeft
    Width
Button1 Button1 Caption DRAW
SpeedButton1 SBxccw Caption <
SpeedButton2 SBxcw Caption >
SpeedButton3 SByccw Caption <
SpeedButton4 SBycw Caption >
SpeedButton5 SBzcсw Caption <
SpeedButton6 SBzcw Caption >
Label1 Label1 Caption Size:
Label2 Label2 Caption X:
Label3 Label3 Caption Y:
Label4 Label4 Caption Z:
Edit1 edSize Text

Збережіть проект. Форма матиме вигляд як на рис. 2:

Рис. 2.

 

У заголовному файлі Ris.h пропишіть константи, змінні та функції, які будуть використані у вашій програмі: //---------------------------------------------------------

const float cw = 1 * 3.1415926535 / 180;

const float ccw = -cw;

struct tpointr { float x, y, z; };

class TMainForm : public TForm

{

__published: // IDE-managed Components

private: // User declarations

void __fastcall myline(float x1, float y1, float z1, float x2, float y2, float z2);

void __fastcall Draw_Cube(void);

void __fastcall Rotate(float rad,AnsiString coord);

tpointr box[9];

public: // User declarations

__fastcall TMainForm(TComponent* Owner);

};

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

У файл Ris.cpp додайте директиву #include <math.h> та опис оголошених функцій: //----------------------------------------------------------

void __fastcall TMainForm::myline(float x1, float y1, float z1, float x2, float y2, float z2)

{

Canvas->MoveTo(floor(x1) + ClientWidth / 2 + Panel1->Width / 2, floor(y1) + ClientHeight / 2);

Canvas->LineTo(floor(x2) + ClientWidth / 2 + Panel1->Width / 2, floor(y2) + ClientHeight / 2);

}

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

void __fastcall TMainForm::Draw_Cube(void)

{

int i, j=3;

for (i=0; i<4; i++)

{

myline(box[j].x, box[j].y, box[j].z, box[i].x, box[i].y, box[i].z);

myline(box[j+4].x, box[j+4].y, box[j+4].z, box[i+4].x, box[i+4].y, box[i+4].z);

myline(box[i].x, box[i].y, box[i].z, box[i+4].x, box[i+4].y, box[i+4].z);

j=i;

}

myline(box[0].x, box[0].y, box[0].z, box[5].x, box[5].y, box[5].z);

myline(box[1].x, box[1].y, box[1].z, box[4].x, box[4].y, box[4].z);

}

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

void __fastcall TMainForm::Rotate(float rad,AnsiString coord)

{

Canvas->Pen->Color=clBtnFace;

Draw_Cube();

for (int i=0; i<9; i++)

{

if (coord == "x")

{

box[i].y = box[i].y * cos(rad) + box[i].z * sin(rad);

box[i].z = -box[i].y * sin(rad) + box[i].z * cos(rad);

}

if (coord == "y")

{

box[i].x = box[i].x * cos(rad) + box[i].z * sin(rad);

box[i].z = -box[i].x * sin(rad) + box[i].z * cos(rad);

}

if (coord == "z")

{

box[i].x = box[i].x * cos(rad) + box[i].y * sin(rad);

box[i].y = -box[i].x * sin(rad) + box[i].y * cos(rad);

}

}

Canvas->Pen->Color=clRed;

Draw_Cube();

}

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

Активуйте кнопку Button1 та створіть для неї оброблювач події OnClick: //--------------------------------------------------------

void __fastcall TMainForm::Button1Click(TObject *Sender)

{

int size;

size = StrToInt(edSize->Text);

Canvas->Pen->Color=clBtnFace;

Draw_Cube();

box[0].x = -size; box[0].y = -size; box[0].z = -size;

box[1].x = size; box[1].y = -size; box[1].z = -size;

box[2].x = size; box[2].y = size; box[2].z = -size;

box[3].x = -size; box[3].y = size; box[3].z = -size;

box[4].x = -size; box[4].y = -size; box[4].z = size;

box[5].x = size; box[5].y = -size; box[5].z = size;

box[6].x = size; box[6].y = size; box[6].z = size;

box[7].x = -size; box[7].y = size; box[7].z = size;

Canvas->Pen->Color=clRed;

Draw_Cube();

}

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

Активуйте кнопку SBxccw та створіть для неї оброблювач події OnClick: //---------------------------------------------------------

void __fastcall TMainForm::SBxccwClick(TObject *Sender)

{

Rotate(ccw, "x");

}

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

Активуйте кнопку SBxcw та створіть для неї оброблювач події OnClick: //--------------------------------------------------------

void __fastcall TMainForm::SBxcwClick(TObject *Sender)

{

Rotate(cw, "x");

}

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

Активуйте кнопку SByccw та створіть для неї оброблювач події OnClick: //--------------------------------------------------------

void __fastcall TMainForm::SByccwClick(TObject *Sender)

{

Rotate(ccw, "y");

}

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

Активуйте кнопку SBycw та створіть для неї оброблювач події OnClick: //--------------------------------------------------------

void __fastcall TMainForm::SBycwClick(TObject *Sender)

{

Rotate(cw, "y");

}

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

Активуйте кнопку SBzccw та створіть для неї оброблювач події OnClick: //--------------------------------------------------------

void __fastcall TMainForm::SBzccwClick(TObject *Sender)

{

Rotate(ccw, "z");

}

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

Активуйте кнопку SBzcw та створіть для неї оброблювач події OnClick: //---------------------------------------------------------

void __fastcall TMainForm::SBzcwClick(TObject *Sender)

{

Rotate(cw, "z");

}

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

Активуйте форму MainForm та створіть для неї оброблювач події OnKeyDown: //-----------------------------------------------------

void __fastcall TMainForm::FormKeyDown (TObject *Sender, WORD &Key, TShiftState Shift)

{

switch (Key){

case VK_NUMPAD1:

Rotate(ccw, "z");

SBzccw->GroupIndex=666;

SBzccw->Down=true; break;

case VK_NUMPAD2:

Rotate(cw, "z");

SBzcw->GroupIndex=666;

SBzcw->Down=true; break;

case VK_NUMPAD4:

Rotate(ccw, "y");

SByccw->GroupIndex=666;

SByccw->Down=true; break;

case VK_NUMPAD5:

Rotate(cw, "y");

SBycw->GroupIndex=666;

SBycw->Down=true; break;

case VK_NUMPAD7:

Rotate(ccw, "x");

SBxccw->GroupIndex=666;

SBxccw->Down=true; break;

case VK_NUMPAD8:

Rotate(cw, "x");

SBxcw->GroupIndex=666;

SBxcw->Down=true; break;

}

}

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

Активуйте форму MainForm та створіть для неї оброблювач події OnKeyUp: //--------------------------------------------------

void __fastcall TMainForm::FormKeyUp (TObject *Sender, WORD &Key, TShiftState Shift)

{

SBxccw->GroupIndex=0;

SBxcw->GroupIndex=0;

SByccw->GroupIndex=0;

SBycw->GroupIndex=0;

SBzccw->GroupIndex=0;

SBzcw->GroupIndex=0;

SBxccw->Down=false;

SBxcw->Down=false;

SByccw->Down=false;

SBycw->Down=false;

SBzccw->Down=false;

SBzcw->Down=false;

}

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

Збережіть проект.

Запустіть програму на виконання. Вікно Вашого проекту матиме вигляд як на рис. 3:

Рис. 3.