/// <summary> /// Наложение совпадающих ячеек (в углах) /// </summary> /// <returns>True - ячейки наложились (для cell1 уточнено значение инсоляции). False - ячейки расположены сонаправлено друг за другом. /// Exception - ячейки неправильно расположены</returns> private bool OverlayCells(InsCell cell1, InsCell cell2) { if (cell1.Overlay(cell2)) { return(true); } else { // Если сегменты не сонаправленны друг за другом - то ошибка расположения модулей if (!cell1.Direction.IsParallelTo(cell2.Direction, InsCell.Tolerance) && cell1.PtCenter.IsEqualTo(cell2.PtCenter)) { throw new Exception($"Ошибка расположения ячеек - '{cell1}' и '{cell2}'"); } } return(false); }
/// <summary> /// Только для угловых ячеек - наложение модулей от разных сегментов /// </summary> /// <param name="cell"></param> public bool Overlay(InsCell cell) { // Модули должны быть перпендикулярно направлены if (!Direction.IsPerpendicularTo(cell.Direction, Tolerance)) { return(false); } // Точки центров модулей должны совпадать if (!PtCenter.IsEqualTo(cell.PtCenter, Tolerance)) { return(false); } // Значение инсоляции - лучшее из двух if (InsValue < cell.InsValue) { InsValue = cell.InsValue; } return(true); }
/// <summary> /// Определение ячеек инсоляции /// </summary> private List <InsCell> GetCells() { var resCells = new List <InsCell>(); // Перебор сегментов - определение ячеек модулей инсоляции для каждого сегмента var points = house.ContourSegmentsCalcPoints; foreach (var segPoints in points) { var segCells = new List <InsCell>(); var startPt = segPoints.First().Point; var vecModule = (segPoints.Last().Point - startPt).GetNormal() * InsCell.ModuleSize; var vecHalfModule = vecModule * 0.5; var vecInsidePlHalfModule = GetVectorHalfModuleInsideContour(vecHalfModule, segPoints.Skip(1).First().Point); var calcPtsInModule = new List <FrontCalcPoint>(); calcPtsInModule.Add(segPoints.First()); FrontCalcPoint lastPt = null; bool isFirstCell = true; // Перебор расчетных точек сегмента - определение ячеек модулей инсоляции for (int i = 1; i < segPoints.Count; i++) { var calcPt = segPoints[i]; lastPt = calcPt; #if DEBUG var lenSeg = (segPoints.Last().Point - startPt).Length; #endif var vec = calcPt.Point - startPt; if (vec.Length > InsCell.ModuleSize)// 0.1 - запас { if (vec.Length - InsCell.ModuleSize < 0.1) { calcPtsInModule.Add(calcPt); } var cellPt = GetCenterModulePoint(startPt, vecHalfModule, vecInsidePlHalfModule); var cell = new InsCell(cellPt, calcPtsInModule, vecModule); // Если это первый угловой модуль - то объединение с последним модулем предыдущего сегмента if (isFirstCell && resCells.Any()) { isFirstCell = false; var lastModuleInLastSeg = resCells.Last(); try { if (OverlayCells(lastModuleInLastSeg, cell)) { startPt = startPt + vecModule; calcPtsInModule = new List <FrontCalcPoint>(); calcPtsInModule.Add(lastPt); lastPt = null; continue; } } catch (Exception ex) { Inspector.AddError(ex.Message, System.Drawing.SystemIcons.Error); startPt = startPt + vecModule; calcPtsInModule = new List <FrontCalcPoint>(); calcPtsInModule.Add(lastPt); lastPt = null; continue; } } segCells.Add(cell); startPt = startPt + vecModule; calcPtsInModule = new List <FrontCalcPoint>(); calcPtsInModule.Add(lastPt); lastPt = null; } else { calcPtsInModule.Add(calcPt); } } // Проверка последней точки - если остаток больше половины модуля - то добавляем целый модуль if (lastPt != null && (lastPt.Point - startPt).Length > (InsCell.ModuleSize * 0.5)) { var cellPt = GetCenterModulePoint(startPt, vecHalfModule, vecInsidePlHalfModule); var cell = new InsCell(cellPt, calcPtsInModule, vecModule); segCells.Add(cell); } resCells.AddRange(segCells); } // Первая угловая ячекйа - наложение с последней ячейкой try { var lastCell = resCells.Last(); if (OverlayCells(resCells.First(), lastCell)) { resCells.Remove(lastCell); } } catch (Exception ex) { Inspector.AddError(ex.Message, System.Drawing.SystemIcons.Error); } #if TEST // Подпись ячеек foreach (var item in resCells) { item.TestDraw(); } #endif return(resCells); }