/// <summary> /// Initializes a new instance of the <see cref="Heightfield"/> class. /// </summary> /// <param name="b">The world-space bounds.</param> /// <param name="cellSize">The world-space size of each cell in the XZ plane.</param> /// <param name="cellHeight">The world-space height of each cell.</param> public Heightfield(BBox3 b, float cellSize, float cellHeight) { if (!BBox3.IsValid(ref bounds)) { throw new ArgumentException("The bounds are considered invalid. See BBox3.IsValid for details."); } if (cellSize <= 0) { throw new ArgumentOutOfRangeException("cellSize", "Cell size must be greater than 0."); } if (cellHeight <= 0) { throw new ArgumentOutOfRangeException("cellHeight", "Cell height must be greater than 0."); } this.cellSize = cellSize; this.cellHeight = cellHeight; this.bounds = b; //make sure the bbox contains all the possible voxels. width = (int)Math.Ceiling((b.Max.X - b.Min.X) / cellSize); height = (int)Math.Ceiling((b.Max.Y - b.Min.Y) / cellHeight); length = (int)Math.Ceiling((b.Max.Z - b.Min.Z) / cellSize); bounds.Max.X = bounds.Min.X + width * cellSize; bounds.Max.Y = bounds.Min.Y + height * cellHeight; bounds.Max.Z = bounds.Min.Z + length * cellSize; cells = new Cell[width * length]; for (int i = 0; i < cells.Length; i++) { cells[i] = new Cell(height); } }
public void BBoxesForElements() { Name = nameof(BBoxesForElements); var elements = new List <Element>(); // mass with weird transform elements.Add(new Mass(Polygon.Star(5, 3, 5), 1, null, new Transform(new Vector3(4, 3, 2), new Vector3(1, 1, 1)))); // element instances var contentJson = @" { ""discriminator"": ""Elements.ContentElement"", ""gltfLocation"": ""https://hypar-content-catalogs.s3-us-west-2.amazonaws.com/2290ea5e-98aa-429d-8fab-1f260458bf57/Steelcase+-+Convene+-+Conference+Table+Top+-+Boat+Shape+-+Flat+Profile+-+72D+x+216W.glb"", ""Bounding Box"": { ""discriminator"": ""Elements.Geometry.BBox3"", ""Min"": { ""X"": -2.7432066856384281, ""Y"": -0.91380708560943613, ""Z"": 0.68884799709320077 }, ""Max"": { ""X"": 2.7432066856384281, ""Y"": 0.91380701293945321, ""Z"": 0.73660002422332771 } }, ""Gltf Scale to Meters"": 1.0, ""SourceDirection"": { ""X"": 0.0, ""Y"": 1.0, ""Z"": 0.0 }, ""Transform"": { ""Matrix"": { ""Components"": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ] } }, ""Material"": { ""discriminator"": ""Elements.Material"", ""Color"": { ""Red"": 1.0, ""Green"": 1.0, ""Blue"": 1.0, ""Alpha"": 1.0 }, ""SpecularFactor"": 0.0, ""GlossinessFactor"": 0.0, ""Unlit"": false, ""DoubleSided"": false, ""Id"": ""9babb829-9b96-4e73-97f4-9658d4d6c31c"", ""Name"": ""default"" }, ""Representation"": null, ""IsElementDefinition"": true, ""Id"": ""8032b381-13c9-4870-803d-c4127c201b47"", ""Name"": ""Steelcase - Convene - Conference Table Top - Boat Shape - Flat Profile - 72D x 216W"", ""Elevation from Level"": 6.4392935428259079E-14, ""Host"": ""Level : Level 1"", ""Offset from Host"": 6.4392935428259079E-14, ""Moves With Nearby Elements"": 0, ""Opaque"": 1 }"; var contentElement = JsonConvert.DeserializeObject <ContentElement>(contentJson); elements.Add(contentElement.CreateInstance(new Transform(-6, 0, 0), null)); elements.Add(contentElement.CreateInstance(new Transform(new Vector3(-8, 0, 0), 45), null)); // mesh var meshElem = ConstructExampleMesh(); elements.Add(meshElem); // model curves var polygon = new Circle(4).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(8, 8, 8), new Vector3(1, 0, 2))); elements.Add(new ModelCurve(polygon)); // model points var random = new System.Random(); var points = Enumerable.Range(0, 20).Select((i) => new Vector3(random.Next(15, 20), random.Next(15, 20), random.Next(15, 20))).ToList(); var modelPoints = new ModelPoints(points, BuiltInMaterials.XAxis); elements.Add(modelPoints); // profile var profile = new Profile(new Circle(7).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(8, 8, 8), new Vector3(1, 0, 2)))); var xzProfile = new Profile(new Circle(7).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(-8, 8, 8), new Vector3(0, 1, 0)))); elements.Add(profile); elements.Add(xzProfile); Model.AddElements(profile.ToModelCurves()); Model.AddElements(xzProfile.ToModelCurves()); // non-geometric element var invalidBBox = new BBox3(new Material("Red", Colors.Red)); Assert.False(invalidBBox.IsValid()); Model.AddElements(elements); foreach (var element in elements) { var bbox = new BBox3(element); Model.AddElements(bbox.ToModelCurves()); } }