/
petr_myagkikh
/
GL_sys
Обзор
Документация
Войти
/
petr_myagkikh
/
GL_sys
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab2/fcStars.cpp
339 строк
14 KB
Петр Мягких
lab2
12 дек 2025, 19:01
12 дек 2025, 19:01
49a8f7a
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #include <vcl.h> #include <cstdlib> #include <ctime> #include <typeinfo> #pragma hdrstop #include "fcStars.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GLS.BaseClasses" #pragma link "GLS.Cadencer" #pragma link "GLS.Coordinates" #pragma link "GLS.Objects" #pragma link "GLS.Scene" #pragma link "GLS.SceneViewer" #pragma link "GLS.SimpleNavigation" #pragma #pragma link "GLS.BaseClasses" #pragma link "GLS.Coordinates" #pragma resource "*.dfm" TFormStarCatalog* FormStarCatalog; // Координаты мыши при нажатии (нужны для вращения камеры) int mx, my; // Время начала и конца обработки (для измерения времени загрузки CSV) unsigned int start, end; // Списки строк: // S1 – весь файл CSV построчно, // T1 – текущая строка, разобранная по запятым TStringList* S1 = new TStringList; TStringList* T1 = new TStringList; // Индексы столбцов в CSV-файле (x, y, z, spect) unsigned char FX, FY, FZ, FSpect; // Текущие координаты звезды float X, Y, Z; // Число успешно загруженных/обработанных звёзд int count; // Время выполнения загрузки / построения double ex_time; //--------------------------------------------------------------------------- __fastcall TFormStarCatalog::TFormStarCatalog(TComponent* Owner) : TForm(Owner) {} //--------------------------------------------------------------------------- // Запоминаем положение мыши при нажатии (начальная точка для вращения сцены) void __fastcall TFormStarCatalog::GLSceneViewer1MouseDown(TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { mx = X; my = Y; } //--------------------------------------------------------------------------- // Инициализация формы void __fastcall TFormStarCatalog::FormCreate(TObject* Sender) { // Рабочий каталог – место, где лежит exe SetCurrentDir(ExtractFilePath(ParamStr(0))); // Папка по умолчанию для CSV – подкаталог DATA OpenTextFileDialog1->InitialDir = GetCurrentDir() + "\\DATA"; // Фильтр диалога – только *.csv OpenTextFileDialog1->Filter = "CSV files (*.csv)"; // Для корректного чтения чисел с точкой FormatSettings.DecimalSeparator = '.'; } //--------------------------------------------------------------------------- // Вращение камеры вокруг сцены при зажатой левой кнопке мыши void __fastcall TFormStarCatalog::GLSceneViewer1MouseMove(TObject* Sender, TShiftState Shift, int X, int Y) { if (Shift.Contains(ssLeft)) { // Вращаем камеру на разницу координат GLCamera1->MoveAroundTarget(my - Y, mx - X); mx = X; my = Y; } } //--------------------------------------------------------------------------- // Периодический таймер: обновление статуса и сброс счётчика производительности void __fastcall TFormStarCatalog::Timer1Timer(TObject* Sender) { // В первой панели показываем количество звёзд FormStarCatalog->StatusBar1->Panels->Items[0]->Text = Format("Количество звезд: %d", ARRAYOFCONST((count))); // Во второй панели – время построения // FormStarCatalog->StatusBar1->Panels->Items[1]->Text = // Format("Время: %.2f c", ARRAYOFCONST((ex_time))); // Сброс монитора производительности рендера GLSceneViewer1->ResetPerformanceMonitor(); } //--------------------------------------------------------------------------- // Каденсер: при прогрессе просто перерисовываем сцену void __fastcall TFormStarCatalog::GLCadencer1Progress(TObject* Sender, const double deltaTime, const double newTime) { GLSceneViewer1->Invalidate(); } //--------------------------------------------------------------------------- // Пункт меню "Выход" void __fastcall TFormStarCatalog::Exit1Click(TObject* Sender) { FormStarCatalog->Close(); } //--------------------------------------------------------------------------- // Кнопка очистки сцены: удаляем все наборы точек и создаём заново пустые void __fastcall TFormStarCatalog::btnClearClick(TObject* Sender) { // Удаляем существующие группы точек по спектральным типам GLTypeO->Free(); GLTypeB->Free(); GLTypeA->Free(); GLTypeF->Free(); GLTypeG->Free(); GLTypeK->Free(); GLTypeM->Free(); // Создаём новые пустые объекты TGLPoints для каждого спектрального класса GLTypeO = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeB = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeA = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeF = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeG = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeK = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeM = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); // Обновляем отображение GLSceneViewer1->Invalidate(); } //--------------------------------------------------------------------------- // Пункт меню "Открыть CSV" void __fastcall TFormStarCatalog::OpenCSV1Click(TObject* Sender) { // Выбираем файл CSV if (OpenTextFileDialog1->Execute()) { // Загружаем весь файл в список строк S1->LoadFromFile(OpenTextFileDialog1->FileName); // Первая строка – заголовок (имена полей) T1->CommaText = S1->Strings[0]; // Определяем индексы столбцов x, y, z и spect по заголовку for (int i = 0; i < T1->Count; i++) { if (T1[0][i] == "x") FX = i; else if (T1[0][i] == "y") FY = i; else if (T1[0][i] == "z") FZ = i; else if (T1[0][i] == "spect") FSpect = i; } // Засекаем время начала обработки start = clock(); count = 0; // сбрасываем счётчик звёзд // Обрабатываем все строки, кроме заголовка (начинаем с 1) for (int i = 1; i < S1->Count; i++) { // Берём i-ую строку и разбираем на поля по запятым T1->CommaText = S1->Strings[i]; // Пытаемся прочитать координаты и тип звезды try { // Читаем X-координату и масштабируем (умножение на 0.2 – уменьшение облака) X = StrToFloat(T1[0][FX]) * 0.2; // Читаем Y-координату Y = StrToFloat(T1[0][FY]) * 0.2; // Читаем Z-координату Z = StrToFloat(T1[0][FZ]) * 0.2; // Полный спектральный тип, например "G2V" String FullType = T1[0][FSpect]; // Если спектральный тип пустой – по умолчанию считаем классом A if (FullType == "") FullType = "A"; // Берём только первую букву – основной спектральный класс String Type = FullType.SubString(0, 1); // Для каждого спектрального класса добавляем точку в свой TGLPoints // с соответствующим цветом и размером if (Type == "O") { // Голубые звезды класса O GLTypeO->Colors->AddPoint(0, 0, 255); // (R, G, B) GLTypeO->Positions->Add(X, Y, Z); GLTypeO->Size = 2; } else if (Type == "B") { // Голубовато-белые звезды класса B GLTypeB->Colors->AddPoint(0, 255, 255); GLTypeB->Positions->Add(X, Y, Z); GLTypeB->Size = 2; } else if (Type == "A") { // Белые звезды класса A GLTypeA->Colors->AddPoint(255, 255, 255); GLTypeA->Positions->Add(X, Y, Z); GLTypeA->Size = 2; } else if (Type == "F") { // Желтовато-белые звезды класса F GLTypeF->Colors->AddPoint(0, 255, 0); GLTypeF->Positions->Add(X, Y, Z); GLTypeF->Size = 2; } else if (Type == "G") { // Жёлтые звезды класса G (как Солнце) GLTypeG->Colors->AddPoint(255, 255, 0); GLTypeG->Positions->Add(X, Y, Z); GLTypeG->Size = 2; } else if (Type == "K") { // Оранжевые звезды класса K GLTypeK->Colors->AddPoint(255, 0, 255); GLTypeK->Positions->Add(X, Y, Z); GLTypeK->Size = 2; } else { // Остальные – отправляем в класс M (красные звезды) GLTypeM->Colors->AddPoint(254, 0, 0); GLTypeM->Positions->Add(X, Y, Z); GLTypeM->Size = 3; } // Увеличиваем счётчик успешно добавленных звёзд count = count + 1; } catch (...) { // При любой ошибке в строке просто пропускаем её } } // Засекаем время окончания end = clock(); // Считаем затраченное время в секундах ex_time = (end - start) / (double)CLOCKS_PER_SEC; // Освобождаем списки delete S1; delete T1; } } //--------------------------------------------------------------------------- // Ещё одна кнопка очистки сцены (по сути дублирует btnClearClick) void __fastcall TFormStarCatalog::Button1Click(TObject* Sender) { // Удаляем старые объекты GLTypeO->Free(); GLTypeB->Free(); GLTypeA->Free(); GLTypeF->Free(); GLTypeG->Free(); GLTypeK->Free(); GLTypeM->Free(); // Создаём новые объекты точек GLTypeO = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeB = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeA = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeF = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeG = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeK = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); GLTypeM = (TGLPoints*)(GLDummyCube1->AddNewChild(__classid(TGLPoints))); // Обновляем экран GLSceneViewer1->Invalidate(); } //--------------------------------------------------------------------------- // чекбоксы – включение/выключение отображения звёзд каждого спектрального класса void __fastcall TFormStarCatalog::chbOClick(TObject *Sender) { // Показать/скрыть звезды типа "O" GLTypeO->Visible = chbO->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbBClick(TObject *Sender) { // Показать/скрыть звезды типа "B" GLTypeB->Visible = chbB->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbAClick(TObject *Sender) { // Показать/скрыть звезды типа "A" GLTypeA->Visible = chbA->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbFClick(TObject *Sender) { // Показать/скрыть звезды типа "F" GLTypeF->Visible = chbF->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbGClick(TObject *Sender) { // Показать/скрыть звезды типа "G" GLTypeG->Visible = chbG->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbKClick(TObject *Sender) { // Показать/скрыть звезды типа "K" GLTypeK->Visible = chbK->Checked; } //--------------------------------------------------------------------------- void __fastcall TFormStarCatalog::chbMClick(TObject *Sender) { // Показать/скрыть звезды типа "M" GLTypeM->Visible = chbM->Checked; } //---------------------------------------------------------------------------