Проект 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.