Ejemplo n.º 1
0
 /// <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);
 }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }