/// <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(); }