public VoxelGrid(RhCommon_Scene ModelSurfaces, List <IOn3dPoint> Pts, int VG_Domain) { VoxelCT = VG_Domain; VoxelInventory = new List <int> [VoxelCT, VoxelCT, VoxelCT]; Voxel = new List <On3dPoint> [VoxelCT, VoxelCT, VoxelCT]; IRhinoObject[] Surfaces = new IRhinoObject[ModelSurfaces.Count()]; OnBoundingBox TightOBox = new OnBoundingBox(); On3dPoint BoxMin = new On3dPoint(); On3dPoint BoxMax = new On3dPoint(); ArrayOn3dPoint Points = new ArrayOn3dPoint(); for (int i = 0; i < Pts.Count; i++) { Points.Append(Pts[i]); } RhUtil.RhinoGetTightBoundingBox(Surfaces, ref TightOBox, false, null); TightOBox.Set(Points, true); OverallBBox = new OnBoundingBox(new On3dPoint(TightOBox.Min().x - 1, TightOBox.Min().y - 1, TightOBox.Min().z - 1), new On3dPoint(TightOBox.Max().x + 1, TightOBox.Max().y + 1, TightOBox.Max().z + 1)); this.X_Incr = (OverallBBox.Max().x - OverallBBox.Min().x) / VoxelCT; this.Y_Incr = (OverallBBox.Max().y - OverallBBox.Min().y) / VoxelCT; this.Z_Incr = (OverallBBox.Max().z - OverallBBox.Min().z) / VoxelCT; //For((int XBox = 0; XBox < VoxelCT; XBox++) Parallel.For(0, VoxelCT, XBox => { RhUtil.RhinoApp().SetStatusBarMessagePane(string.Format("Voxelizing: {0}%", Math.Round((double)XBox / VoxelCT - 1, 2) * 100)); for (int YBox = 0; YBox < VoxelCT; YBox++) { for (int ZBox = 0; ZBox < VoxelCT; ZBox++) { BoxMin = new On3dPoint((OverallBBox.Min().x + this.X_Incr * XBox) - X_Incr / 10, (OverallBBox.Min().y + this.Y_Incr * YBox) - Y_Incr / 10, (OverallBBox.Min().z + this.Z_Incr * ZBox) - Z_Incr / 10); BoxMax = new On3dPoint((OverallBBox.Min().x + this.X_Incr * (XBox + 1)) + X_Incr / 10, (OverallBBox.Min().y + this.Y_Incr * (YBox + 1)) + Y_Incr / 10, (OverallBBox.Min().z + this.Z_Incr * (ZBox + 1)) + X_Incr / 10); this.Voxel[XBox, YBox, ZBox] = new List <On3dPoint>(); this.Voxel[XBox, YBox, ZBox].Add(BoxMin); this.Voxel[XBox, YBox, ZBox].Add(BoxMax); this.VoxelInventory[XBox, YBox, ZBox] = new List <int>(); for (int Index = 0; Index < ModelSurfaces.Count(); Index++) { OnBoundingBox TestBox = new OnBoundingBox(); TestBox = new OnBoundingBox(this.Voxel[XBox, YBox, ZBox][0], this.Voxel[XBox, YBox, ZBox][1]); if (BoxIntersection(ModelSurfaces, TestBox, Index)) { this.VoxelInventory[XBox, YBox, ZBox].Add(Index); } } } } }); }
public VoxelGrid(RhCommon_Scene ModelSurfaces, List<IOn3dPoint> Pts, int VG_Domain) { VoxelCT = VG_Domain; VoxelInventory = new List<int>[VoxelCT, VoxelCT, VoxelCT]; Voxel = new List<On3dPoint>[VoxelCT, VoxelCT, VoxelCT]; IRhinoObject[] Surfaces = new IRhinoObject[ModelSurfaces.Count()]; OnBoundingBox TightOBox = new OnBoundingBox(); On3dPoint BoxMin = new On3dPoint(); On3dPoint BoxMax = new On3dPoint(); ArrayOn3dPoint Points = new ArrayOn3dPoint(); for (int i = 0; i < Pts.Count; i++) { Points.Append(Pts[i]); } RhUtil.RhinoGetTightBoundingBox(Surfaces, ref TightOBox, false, null); TightOBox.Set(Points, true); OverallBBox = new OnBoundingBox(new On3dPoint(TightOBox.Min().x - 1, TightOBox.Min().y - 1, TightOBox.Min().z - 1), new On3dPoint(TightOBox.Max().x + 1, TightOBox.Max().y + 1, TightOBox.Max().z + 1)); this.X_Incr = (OverallBBox.Max().x - OverallBBox.Min().x) / VoxelCT; this.Y_Incr = (OverallBBox.Max().y - OverallBBox.Min().y) / VoxelCT; this.Z_Incr = (OverallBBox.Max().z - OverallBBox.Min().z) / VoxelCT; //For((int XBox = 0; XBox < VoxelCT; XBox++) Parallel.For(0, VoxelCT, XBox => { RhUtil.RhinoApp().SetStatusBarMessagePane(string.Format("Voxelizing: {0}%", Math.Round((double)XBox / VoxelCT-1, 2) * 100)); for (int YBox = 0; YBox < VoxelCT; YBox++) { for (int ZBox = 0; ZBox < VoxelCT; ZBox++) { BoxMin = new On3dPoint((OverallBBox.Min().x + this.X_Incr * XBox) - X_Incr / 10, (OverallBBox.Min().y + this.Y_Incr * YBox) - Y_Incr / 10, (OverallBBox.Min().z + this.Z_Incr * ZBox) - Z_Incr / 10); BoxMax = new On3dPoint((OverallBBox.Min().x + this.X_Incr * (XBox + 1)) + X_Incr / 10, (OverallBBox.Min().y + this.Y_Incr * (YBox + 1)) + Y_Incr / 10, (OverallBBox.Min().z + this.Z_Incr * (ZBox + 1)) + X_Incr / 10); this.Voxel[XBox, YBox, ZBox] = new List<On3dPoint>(); this.Voxel[XBox, YBox, ZBox].Add(BoxMin); this.Voxel[XBox, YBox, ZBox].Add(BoxMax); this.VoxelInventory[XBox, YBox, ZBox] = new List<int>(); for (int Index = 0; Index < ModelSurfaces.Count(); Index++) { OnBoundingBox TestBox = new OnBoundingBox(); TestBox = new OnBoundingBox(this.Voxel[XBox, YBox, ZBox][0], this.Voxel[XBox, YBox, ZBox][1]); if (BoxIntersection(ModelSurfaces, TestBox, Index)) { this.VoxelInventory[XBox, YBox, ZBox].Add(Index); } } } } }); }
/// <summary> /// Intesects all NURBS Surfaces with Voxels. /// </summary> /// <param name="Model">the scene.</param> /// <param name="Box">the voxel</param> /// <param name="Index">the index of the surface to test.</param> /// <returns></returns> private bool BoxIntersection(RhCommon_Scene Model, OnBoundingBox Box, int Index) { On3dPoint Center = Box.Center(); double Radius = Center.DistanceTo(Box.Min()); double s = 0; double t = 0; On3dPoint point = new On3dPoint(); if (RhUtil.RhinoBrepClosestPoint(Model.Brep(Index), Center, new OnCOMPONENT_INDEX(), ref s, ref t, point, Radius)) //if (Center.DistanceTo(point) < Radius) { return(true); } return(false); }
/// <summary> /// Intesects all NURBS Surfaces with Voxels. /// </summary> /// <param name="Model">the scene.</param> /// <param name="Box">the voxel</param> /// <param name="Index">the index of the surface to test.</param> /// <returns></returns> private bool BoxIntersection(RhCommon_Scene Model, OnBoundingBox Box, int Index) { On3dPoint Center = Box.Center(); double Radius = Center.DistanceTo(Box.Min()); double s = 0; double t = 0; On3dPoint point = new On3dPoint(); if (RhUtil.RhinoBrepClosestPoint(Model.Brep(Index), Center, new OnCOMPONENT_INDEX(), ref s, ref t, point, Radius)) //if (Center.DistanceTo(point) < Radius) { return true; } return false; }