Example #1
0
        /// <summary>
        /// Генерация многоугольника, отображаемого внутри здания
        /// </summary>
        private void GenLocalPolygon()
        {
            LocalPolygon = new Polygon();
            _MainPolygon = new Polygon();
            foreach (var p in MainPolygon.Points)
            {
                LocalPolygon.Points.Add(new Point(p.X, p.Y));
            }
            LocalPolygon.delete = false;
            double distance = -1;

            p1 = -1;
            p2 = -1;
            //ищем самую длинную грань по формуле AB = √(xb - xa)2 + (yb - ya)2
            for (int i = 0; i < MainPolygon.Points.Count; i++)
            {
                if (i != MainPolygon.Points.Count - 1)
                {
                    double _distance = CalcAB(MainPolygon.Points[i], MainPolygon.Points[i + 1]);
                    if (_distance > distance)
                    {
                        distance = _distance;
                        p1       = i;
                        p2       = i + 1;
                    }
                }
                else
                {
                    double _distance = CalcAB(MainPolygon.Points[i], MainPolygon.Points[0]);
                    if (_distance > distance)
                    {
                        distance = _distance;
                        p1       = i;
                        p2       = 0;
                    }
                }
            }
            alfa = CalcAlfa(MainPolygon.Points[p1], MainPolygon.Points[p2]);
            for (int i = 0; i < LocalPolygon.Points.Count; i++)
            {
                if (i != p1)
                {
                    LocalPolygon.Points[i] = RotatePoint(-alfa, LocalPolygon.Points[p1], LocalPolygon.Points[i]);
                    _MainPolygon.Points.Add(LocalPolygon.Points[i]);
                }
                else
                {
                    _MainPolygon.Points.Add(LocalPolygon.Points[i]);
                }
            }
            MP = _MainPolygon.Points[p1];
            _MainPolygon.CalcMaxMin(out int maxx, out int minx, out int maxy, out int miny);
            CalcRederingArea(maxx, minx, maxy, miny);
            for (int i = 0; i < LocalPolygon.Points.Count; i++)
            {
                int x = LocalPolygon.Points[i].X - Ox;
                int y = LocalPolygon.Points[i].Y - Oy;
                x = (int)(x * koef);
                y = (int)(y * koef);
                LocalPolygon.Points[i] = new Point(x, y);
            }
            LocalPolygon.DL = LocalDL;
            MainPolygon.CalcCenterPointWOZ();
            TempPolygon = (Polygon)MainPolygon.Clone();
        }