Exemple #1
0
        public static (PolyhedralSurface polyhedral, List <string> colors) MakeBuilding(Polygon footprint, double fromZ, double height, BuildingStyle buildingStyle)
        {
            var colors     = new List <string>();
            var polyhedral = new PolyhedralSurface();

            polyhedral.Dimension = Dimension.Xyz;

            polyhedral.Geometries.Add(GetPolygonZ(footprint, fromZ));
            polyhedral.Geometries.Add(GetPolygonZ(footprint, fromZ + height));
            if (buildingStyle.Storeys == null)
            {
                var walls = MakeWalls(footprint, fromZ, height - fromZ);
                polyhedral.Geometries.AddRange(walls);
            }
            else
            {
                {
                    foreach (var storey in buildingStyle.Storeys)
                    {
                        var walls = MakeWalls(footprint, fromZ + storey.From, storey.To - storey.From);
                        polyhedral.Geometries.AddRange(walls);
                    }
                }
            }

            var stream = new MemoryStream();

            polyhedral.Serialize <WkbSerializer>(stream);
            var wkb             = stream.ToArray();
            var triangulatedWkb = Triangulator.Triangulate(wkb);
            var polyhedralNew   = (PolyhedralSurface)Geometry.Deserialize <WkbSerializer>(triangulatedWkb);

            foreach (var polygon in polyhedralNew.Geometries)
            {
                var normal = polygon.GetNormal();

                if (Math.Abs(normal.X) > Math.Abs(normal.Y) && Math.Abs(normal.X) > Math.Abs(normal.Z) ||
                    (Math.Abs(normal.Y) > Math.Abs(normal.Z)))
                {
                    //  (yz) projection
                    if (buildingStyle.WallsColor == null)
                    {
                        // use storeys
                        var storeyColor = GetStoreyColor(polygon, buildingStyle.Storeys);
                        colors.Add(storeyColor);
                    }
                    else
                    {
                        colors.Add(buildingStyle.WallsColor);
                    }
                }
                else
                {
                    // (xy) projextion
                    if (polygon.ExteriorRing.Points[0].Z == fromZ)
                    {
                        // floor
                        colors.Add(buildingStyle.FloorColor);
                    }
                    else
                    {
                        // roof
                        colors.Add(buildingStyle.RoofColor);
                    }
                }
            }
            return(polyhedralNew, colors);
        }