/
daria_bel
/
VRLabs
Обзор
Документация
Войти
/
daria_bel
/
VRLabs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Lab1_BaseObjects/fcBaseObjects.cpp
272 строки
10 KB
Daria Bel
Лабораторные работы для daria_bel
14 май 2026, 09:22
14 май 2026, 09:22
e507b0f
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #include <vcl.h> #include <stdlib.h> #pragma hdrstop #include "fcBaseObjects.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GLS.BaseClasses" #pragma link "GLS.Coordinates" #pragma link "GLS.GeomObjects" #pragma link "GLS.Material" #pragma link "GLS.Objects" #pragma link "GLS.Scene" #pragma link "GLS.SceneViewer" #pragma link "GLS.SimpleNavigation" #pragma resource "*.dfm" TFormBaseObjects *FormBaseObjects; int displayMode = 0; //--------------------------------------------------------------------------- __fastcall TFormBaseObjects::TFormBaseObjects(TComponent* Owner) : TForm(Owner) { SetupScene(); } //--------------------------------------------------------------------------- void __fastcall TFormBaseObjects::SetupScene() { // ������� ���������� ���������� GLMaterialLibrary1->Materials->Clear(); // ���������� ��������� ������ Polyhedrons[0].Polyhedron = GLTetrahedron1; Polyhedrons[0].ColorPanel = PanelTetra; Polyhedrons[0].ColorShape = ShapeTetra; Polyhedrons[0].ColorButton = ButtonTetra; Polyhedrons[0].Prefix = "Tetra_"; Polyhedrons[0].FaceCount = 4; Polyhedrons[0].MaterialLib = GLMaterialLibrary1; Polyhedrons[1].Polyhedron = GLCube1; Polyhedrons[1].ColorPanel = PanelCube; Polyhedrons[1].ColorShape = ShapeCube; Polyhedrons[1].ColorButton = ButtonCube; Polyhedrons[1].Prefix = "Cube_"; Polyhedrons[1].FaceCount = 6; Polyhedrons[1].MaterialLib = GLMaterialLibrary1; Polyhedrons[2].Polyhedron = GLOctahedron1; Polyhedrons[2].ColorPanel = PanelOcta; Polyhedrons[2].ColorShape = ShapeOcta; Polyhedrons[2].ColorButton = ButtonOcta; Polyhedrons[2].Prefix = "Octa_"; Polyhedrons[2].FaceCount = 8; Polyhedrons[2].MaterialLib = GLMaterialLibrary1; Polyhedrons[3].Polyhedron = GLDodecahedron1; Polyhedrons[3].ColorPanel = PanelDodeca; Polyhedrons[3].ColorShape = ShapeDodeca; Polyhedrons[3].ColorButton = ButtonDodeca; Polyhedrons[3].Prefix = "Dodeca_"; Polyhedrons[3].FaceCount = 12; Polyhedrons[3].MaterialLib = GLMaterialLibrary1; Polyhedrons[4].Polyhedron = GLIcosahedron1; Polyhedrons[4].ColorPanel = PanelIcosa; Polyhedrons[4].ColorShape = ShapeIcosa; Polyhedrons[4].ColorButton = ButtonIcosa; Polyhedrons[4].Prefix = "Icosa_"; Polyhedrons[4].FaceCount = 20; Polyhedrons[4].MaterialLib = GLMaterialLibrary1; // ===== ����� ��� ����� (�� �� �����, �� ������������ ��� ������ �����) ===== TColor startColors[5] = { clFuchsia, // �������� - ������� (� �������� ��� � ���������) clRed, // ��� - ������� (� �������� ��� � ���������) clYellow, // ������� - ������ (� �������� ��� � ����������) clLime, // ��������� - ��������� (� �������� ��� � ����) clBlue // �������� - ����� (� �������� ��� � ��������) }; String figureNames[5] = {"��������", "��������", "�������", "���������", "��������"}; // ===== ������������ ����� (���������������) ===== GLTetrahedron1->Position->X = -3.0; GLTetrahedron1->Position->Y = 2.0; GLTetrahedron1->Position->Z = 0; GLCube1->Position->X = 3.0; GLCube1->Position->Y = 2.0; GLCube1->Position->Z = 0; GLOctahedron1->Position->X = -3.0; GLOctahedron1->Position->Y = -2.0; GLOctahedron1->Position->Z = 0; GLDodecahedron1->Position->X = 3.0; GLDodecahedron1->Position->Y = -2.0; GLDodecahedron1->Position->Z = 0; GLIcosahedron1->Position->X = 0; GLIcosahedron1->Position->Y = 0; GLIcosahedron1->Position->Z = 2.5; // ������� GLTetrahedron1->Scale->X = 1.0; GLTetrahedron1->Scale->Y = 1.0; GLTetrahedron1->Scale->Z = 1.0; GLCube1->Scale->X = 0.8; GLCube1->Scale->Y = 0.8; GLCube1->Scale->Z = 0.8; GLOctahedron1->Scale->X = 0.9; GLOctahedron1->Scale->Y = 0.9; GLOctahedron1->Scale->Z = 0.9; GLDodecahedron1->Scale->X = 0.7; GLDodecahedron1->Scale->Y = 0.7; GLDodecahedron1->Scale->Z = 0.7; GLIcosahedron1->Scale->X = 0.8; GLIcosahedron1->Scale->Y = 0.8; GLIcosahedron1->Scale->Z = 0.8; // ===== �������� ���������� ===== TGLMaterial* materials[5]; for(int i = 0; i < 5; i++) { String matName = Polyhedrons[i].Prefix + "Material"; TGLLibMaterial* mat = GLMaterialLibrary1->Materials->Add(); mat->Name = matName; mat->Material->FrontProperties->Diffuse->AsWinColor = startColors[i]; mat->Material->FrontProperties->Specular->SetColor(0.8, 0.8, 0.8, 1); mat->Material->FrontProperties->Shininess = 30; materials[i] = mat->Material; // ��������� ��������� if(Polyhedrons[i].ColorPanel) Polyhedrons[i].ColorPanel->Color = startColors[i]; if(Polyhedrons[i].ColorShape) Polyhedrons[i].ColorShape->Brush->Color = startColors[i]; if(Polyhedrons[i].ColorButton) Polyhedrons[i].ColorButton->Caption = "�������� ���� " + figureNames[i]; if(i == 0 && GroupBoxTetra) GroupBoxTetra->Caption = figureNames[i]; if(i == 1 && GroupBoxCube) GroupBoxCube->Caption = figureNames[i]; if(i == 2 && GroupBoxOcta) GroupBoxOcta->Caption = figureNames[i]; if(i == 3 && GroupBoxDodeca) GroupBoxDodeca->Caption = figureNames[i]; if(i == 4 && GroupBoxIcosa) GroupBoxIcosa->Caption = figureNames[i]; } // ��������� ��������� GLTetrahedron1->Material = materials[0]; GLCube1->Material = materials[1]; GLOctahedron1->Material = materials[2]; GLDodecahedron1->Material = materials[3]; GLIcosahedron1->Material = materials[4]; // ��������� ������ GLCamera1->Position->X = 6; GLCamera1->Position->Y = 5; GLCamera1->Position->Z = 10; GLCamera1->TargetObject = GLIcosahedron1; // ��������� ����� GLLightSource1->ConstAttenuation = 1.0; GLLightSource1->Position->X = 5; GLLightSource1->Position->Y = 5; GLLightSource1->Position->Z = 12; // ����� ����������� GLTetrahedron1->Material->PolygonMode = pmFill; GLCube1->Material->PolygonMode = pmFill; GLOctahedron1->Material->PolygonMode = pmFill; GLDodecahedron1->Material->PolygonMode = pmFill; GLIcosahedron1->Material->PolygonMode = pmFill; Caption = "���������� ������������� ������� - ������������ ������ �1"; Color = clSkyBlue; GLSceneViewer1->Refresh(); } //--------------------------------------------------------------------------- void __fastcall TFormBaseObjects::UpdatePolyhedronColors( TGLBaseSceneObject* Poly, String Prefix, int FaceCount, TColor Color, TGLMaterialLibrary* MaterialLib) { for(int j = 0; j < MaterialLib->Materials->Count; j++) { TGLLibMaterial* mat = MaterialLib->Materials->Items[j]; if(mat->Name.Pos(Prefix) == 1) { mat->Material->FrontProperties->Diffuse->AsWinColor = Color; } } GLSceneViewer1->Refresh(); } //--------------------------------------------------------------------------- void __fastcall TFormBaseObjects::ButtonColorClick(TObject *Sender) { TButton* clickedButton = dynamic_cast<TButton*>(Sender); if(!clickedButton) return; int polyIndex = -1; if(clickedButton == ButtonTetra) polyIndex = 0; else if(clickedButton == ButtonCube) polyIndex = 1; else if(clickedButton == ButtonOcta) polyIndex = 2; else if(clickedButton == ButtonDodeca) polyIndex = 3; else if(clickedButton == ButtonIcosa) polyIndex = 4; if(polyIndex == -1) return; if(ColorDialog1->Execute()) { TColor newColor = ColorDialog1->Color; if(Polyhedrons[polyIndex].ColorPanel) Polyhedrons[polyIndex].ColorPanel->Color = newColor; if(Polyhedrons[polyIndex].ColorShape) Polyhedrons[polyIndex].ColorShape->Brush->Color = newColor; UpdatePolyhedronColors(Polyhedrons[polyIndex].Polyhedron, Polyhedrons[polyIndex].Prefix, Polyhedrons[polyIndex].FaceCount, newColor, Polyhedrons[polyIndex].MaterialLib); } } //--------------------------------------------------------------------------- void __fastcall TFormBaseObjects::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key == VK_SPACE) { displayMode = (displayMode + 1) % 3; if(displayMode == 0) { GLTetrahedron1->Material->PolygonMode = pmFill; GLCube1->Material->PolygonMode = pmFill; GLOctahedron1->Material->PolygonMode = pmFill; GLDodecahedron1->Material->PolygonMode = pmFill; GLIcosahedron1->Material->PolygonMode = pmFill; Caption = "�����: ������� (������ - �����, R - �����)"; } else if(displayMode == 1) { GLTetrahedron1->Material->PolygonMode = pmLines; GLCube1->Material->PolygonMode = pmLines; GLOctahedron1->Material->PolygonMode = pmLines; GLDodecahedron1->Material->PolygonMode = pmLines; GLIcosahedron1->Material->PolygonMode = pmLines; Caption = "�����: ������ (������ - �����, R - �����)"; } else { GLTetrahedron1->Material->PolygonMode = pmPoints; GLCube1->Material->PolygonMode = pmPoints; GLOctahedron1->Material->PolygonMode = pmPoints; GLDodecahedron1->Material->PolygonMode = pmPoints; GLIcosahedron1->Material->PolygonMode = pmPoints; Caption = "�����: ����� (������ - �����, R - �����)"; } GLSceneViewer1->Refresh(); } // ������� R - ����� ������ � ����������� (�� �� �����, ��������������) if(Key == 'R') { TColor defaultColors[5] = {clFuchsia, clRed, clYellow, clLime, clBlue}; for(int i = 0; i < 5; i++) { if(Polyhedrons[i].ColorPanel) Polyhedrons[i].ColorPanel->Color = defaultColors[i]; if(Polyhedrons[i].ColorShape) Polyhedrons[i].ColorShape->Brush->Color = defaultColors[i]; UpdatePolyhedronColors(Polyhedrons[i].Polyhedron, Polyhedrons[i].Prefix, Polyhedrons[i].FaceCount, defaultColors[i], Polyhedrons[i].MaterialLib); } ShowMessage("����� �������� �� �����������!"); } } //---------------------------------------------------------------------------