/
Alexandr_mamonov
/
lab
Обзор
Документация
Войти
/
Alexandr_mamonov
/
lab
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab1_BaseObjects/fcBaseObjects.cpp
204 строки
7 KB
Александр Мамонов
Add visualization lab projects
11 май 2026, 20:15
11 май 2026, 20:15
e92b10e
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #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; //--------------------------------------------------------------------------- __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] = {clRed, clGreen, clBlue, clPurple, clTeal}; for(int i = 0; i < 5; i++) { CreateMaterialsForPolyhedron( Polyhedrons[i].Polyhedron, Polyhedrons[i].Prefix, Polyhedrons[i].FaceCount, Polyhedrons[i].MaterialLib ); Polyhedrons[i].ColorPanel->Color = startColors[i]; Polyhedrons[i].ColorShape->Brush->Color = startColors[i]; UpdatePolyhedronColors( Polyhedrons[i].Polyhedron, Polyhedrons[i].Prefix, Polyhedrons[i].FaceCount, startColors[i], Polyhedrons[i].MaterialLib ); } } //--------------------------------------------------------------------------- void __fastcall TFormBaseObjects::CreateMaterialsForPolyhedron( TGLBaseSceneObject* Poly, String Prefix, int FaceCount, TGLMaterialLibrary* MaterialLib) { for(int i = 0; i < FaceCount; i++) { String matName = Prefix + "Face" + IntToStr(i); // ���������, ���������� �� ��� �������� � ����� ������ TGLLibMaterial* mat = NULL; for(int j = 0; j < MaterialLib->Materials->Count; j++) { if(MaterialLib->Materials->Items[j]->Name == matName) { mat = MaterialLib->Materials->Items[j]; break; } } if(!mat) { mat = MaterialLib->Materials->Add(); mat->Name = matName; } TColor randomColor = (TColor)RGB( random(200) + 55, random(200) + 55, random(200) + 55 ); mat->Material->FrontProperties->Diffuse->AsWinColor = randomColor; // ������������� �������� ��� ������������� if(TGLPolygon* poly = dynamic_cast<TGLPolygon*>(Poly)) { poly->Material = mat->Material; } } } //--------------------------------------------------------------------------- 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]; String matName = mat->Name; // ���� ��� ��������� ���������� � �������� ����� ������������� if(matName.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) { ShowMessage("Button not recognized"); return; } if(ColorDialog1->Execute()) { TColor newColor = ColorDialog1->Color; // ��������� ���� ������ � ������ Polyhedrons[polyIndex].ColorPanel->Color = newColor; Polyhedrons[polyIndex].ColorShape->Brush->Color = newColor; // �������� �������� �� ���������� String matName = Polyhedrons[polyIndex].Prefix + "Face0"; TGLLibMaterial* mat = NULL; for(int j = 0; j < GLMaterialLibrary1->Materials->Count; j++) { if(GLMaterialLibrary1->Materials->Items[j]->Name == matName) { mat = GLMaterialLibrary1->Materials->Items[j]; break; } } if(mat) { // ������ ���� ��������� mat->Material->FrontProperties->Diffuse->AsWinColor = newColor; // ��������� �������� � ������� if(polyIndex == 0) GLTetrahedron1->Material = mat->Material; else if(polyIndex == 1) GLCube1->Material = mat->Material; else if(polyIndex == 2) GLOctahedron1->Material = mat->Material; else if(polyIndex == 3) GLDodecahedron1->Material = mat->Material; else if(polyIndex == 4) GLIcosahedron1->Material = mat->Material; } else { ShowMessage("Material not found: " + matName); } GLSceneViewer1->Refresh(); } }