/
GeekNerd
/
ServerModelingProject
Обзор
Документация
Войти
/
GeekNerd
/
ServerModelingProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/OptimizationLogic/View/MetricsPanel.cs
99 строк
4 KB
Gorney-Alex
Init
30 май 2026, 19:05
30 май 2026, 19:05
3cdcc49
Код
Авторство
О чём код?
using System.Collections.Generic; using DataClasses; using DataClasses.Algorithm; using OptimizationLogic.Core; using TMPro; using UnityEngine; namespace OptimizationLogic.View { public sealed class MetricsPanel : MonoBehaviour { [Header("Text Fields")] [SerializeField] private TMP_Text placedText; [SerializeField] private TMP_Text unplacedText; [SerializeField] private TMP_Text totalPowerText; [SerializeField] private TMP_Text maxTempText; [SerializeField] private TMP_Text riText; [SerializeField] private TMP_Text utilizationText; [SerializeField] private TMP_Text fitnessText; public void Clear() { Set(placedText, string.Empty); Set(unplacedText, string.Empty); Set(totalPowerText, string.Empty); Set(maxTempText, string.Empty); Set(riText, string.Empty); Set(utilizationText, string.Empty); Set(fitnessText, string.Empty); } public void UpdateMetrics( RoomConfig room, IReadOnlyList<PlacementZone> zones, Chromosome best, IReadOnlyList<RackData> catalog, float maxTemperature) { if (best?.Genes == null || catalog == null) return; int total = best.Genes.Count; int placed = 0; float totalPower = 0f; float footprintArea = 0f; for (int i = 0; i < best.Genes.Count; i++) { RackGene g = best.Genes[i]; if (!g.IsPlaced) continue; if (g.ModelIndex < 0 || g.ModelIndex >= catalog.Count) continue; RackData m = catalog[g.ModelIndex]; if (m == null) continue; placed++; totalPower += Mathf.Max(0f, m.PowerConsumption); float w = Mathf.Max(0f, m.Width); float l = Mathf.Max(0f, m.Length); bool swap = Mathf.Abs(Mathf.Repeat(g.Rotation, 180f) - 90f) < 0.01f; if (swap) (w, l) = (l, w); footprintArea += w * l; } int unplaced = total - placed; float ri = new TopologyValidator().ComputeRecirculationIndex(best.Genes, zones); float roomArea = room != null ? Mathf.Max(1e-6f, PolygonArea(room.PolygonVertices)) : 1f; float utilization = Mathf.Clamp01(footprintArea / roomArea) * 100f; Set(placedText, $"Placed: {placed} / {total}"); Set(unplacedText, $"Unplaced: {unplaced}"); Set(totalPowerText, $"Total Power: {totalPower:0.##} kW"); Set(maxTempText, $"Max Temp: {maxTemperature:0.##} °C"); Set(riText, $"RI: {ri:0.###}"); Set(utilizationText, $"Utilization: {utilization:0.#}%"); Set(fitnessText, $"Fitness: {best.Fitness:0.###}"); } private static void Set(TMP_Text t, string value) { if (t == null) return; t.text = value; } private static float PolygonArea(IReadOnlyList<Vector2> poly) { if (poly == null || poly.Count < 3) return 0f; double sum = 0.0; for (int i = 0; i < poly.Count; i++) { Vector2 a = poly[i]; Vector2 b = poly[(i + 1) % poly.Count]; sum += (double)a.x * b.y - (double)b.x * a.y; } return Mathf.Abs((float)(sum * 0.5)); } } }