Changeset 15520 for branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/3D/ExtremePointCreation/ExtremePointCreator.cs
- Timestamp:
- 12/13/17 09:47:49 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/3D/ExtremePointCreation/ExtremePointCreator.cs
r15488 r15520 1 1 using HeuristicLab.Common; 2 2 using HeuristicLab.Problems.BinPacking3D.Geometry; 3 using HeuristicLab.Problems.BinPacking3D.ResidualSpaceCalculation; 3 4 using System; 4 5 using System.Collections.Generic; … … 11 12 12 13 13 public abstract void UpdateExtremePoints(BinPacking3D binPacking, PackingItem item, PackingPosition position); 14 15 public abstract void UpdateResidualSpace(BinPacking3D binPacking, PackingItem item, PackingPosition position); 14 public void UpdateBinPacking(BinPacking3D binPacking, PackingItem item, PackingPosition position) { 15 UpdateExtremePoints(binPacking, item, position); 16 UpdateResidualSpace(binPacking, item, position); 17 } 18 19 protected abstract void UpdateExtremePoints(BinPacking3D binPacking, PackingItem item, PackingPosition position); 20 21 /// <summary> 22 /// Updates the residual space for a given bin packing 23 /// </summary> 24 /// <param name="binPacking"></param> 25 /// <param name="item"></param> 26 /// <param name="position"></param> 27 protected abstract void UpdateResidualSpace(BinPacking3D binPacking, PackingItem item, PackingPosition position); 16 28 protected abstract bool AddExtremePoint(BinPacking3D binPacking, PackingPosition position); 17 29 … … 23 35 /// <param name="newItem"></param> 24 36 /// <param name="position"></param> 25 protected virtual void GenerateNewExtremePointsFor NewItem(BinPacking3D binPacking, PackingItem newItem, PackingPosition position) {37 protected virtual void GenerateNewExtremePointsForItem(BinPacking3D binPacking, PackingItem newItem, PackingPosition position) { 26 38 int newWidth = position.Rotated ? newItem.Depth : newItem.Width; 27 39 int newDepth = position.Rotated ? newItem.Width : newItem.Depth; … … 35 47 var below = ProjectDown(binPacking, sourcePoint); 36 48 var residualSpace = CalculateResidualSpace(binPacking, below); 37 if ( IsNonZero(residualSpace)49 if (!residualSpace.IsZero() 38 50 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, below, residualSpace)) { 39 51 // add only if the projected point's residual space is not a sub-space … … 45 57 var back = ProjectBackward(binPacking, sourcePoint); 46 58 residualSpace = CalculateResidualSpace(binPacking, back); 47 if ( IsNonZero(residualSpace)59 if (!residualSpace.IsZero() 48 60 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, back, residualSpace)) { 49 61 // add only if the projected point's residual space is not a sub-space … … 60 72 var left = ProjectLeft(binPacking, sourcePoint); 61 73 var residualSpace = CalculateResidualSpace(binPacking, left); 62 if ( IsNonZero(residualSpace)74 if (!residualSpace.IsZero() 63 75 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, left, residualSpace)) { 64 76 // add only if the projected point's residual space is not a sub-space … … 70 82 var back = ProjectBackward(binPacking, sourcePoint); 71 83 residualSpace = CalculateResidualSpace(binPacking, back); 72 if ( IsNonZero(residualSpace)84 if (!residualSpace.IsZero() 73 85 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, back, residualSpace)) { 74 86 // add only if the projected point's residual space is not a sub-space … … 85 97 var below = ProjectDown(binPacking, sourcePoint); 86 98 var residualSpace = CalculateResidualSpace(binPacking, below); 87 if ( IsNonZero(residualSpace)99 if (!residualSpace.IsZero() 88 100 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, below, residualSpace)) { 89 101 // add only if the projected point's residual space is not a sub-space … … 95 107 var left = ProjectLeft(binPacking, sourcePoint); 96 108 residualSpace = CalculateResidualSpace(binPacking, left); 97 if ( IsNonZero(residualSpace)109 if (!residualSpace.IsZero() 98 110 && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, left, residualSpace)) { 99 111 // add only if the projected point's residual space is not a sub-space … … 171 183 #region Residual space 172 184 173 174 175 protected virtual bool IsNonZero(Tuple<int, int, int> space) {176 return space.Item1 > 0 && space.Item2 > 0 && space.Item3 > 0;177 }178 185 179 186 /// <summary> … … 184 191 /// <param name="residualSpace"></param> 185 192 /// <returns></returns> 186 protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(BinPacking3D binPacking, Vector3D pos, Tuple<int, int, int>residualSpace) {187 var eps = binPacking.ExtremePoints.Where(x => !pos.Equals(x) && pos.IsInside(x, binPacking.ResidualSpace [x]));188 return eps.Any(x => IsWithinResidualSpaceOfAnotherExtremePoint(pos, residualSpace, x, binPacking.ResidualSpace [x]));189 } 190 191 /// <summary> 192 /// 193 protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(BinPacking3D binPacking, Vector3D pos, ResidualSpace residualSpace) { 194 var eps = binPacking.ExtremePoints.Where(x => !pos.Equals(x) && pos.IsInside(x, binPacking.ResidualSpaces[x])); 195 return eps.Any(x => IsWithinResidualSpaceOfAnotherExtremePoint(pos, residualSpace, x, binPacking.ResidualSpaces[x])); 196 } 197 198 /// <summary> 199 /// Returns true, if the given poisition and the related residual space is within the residual space of the given extreme point 193 200 /// </summary> 194 201 /// <param name="pos"></param> … … 197 204 /// <param name="rsEp"></param> 198 205 /// <returns></returns> 199 protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(Vector3D pos, Tuple<int, int, int> rsPos, PackingPosition ep, Tuple<int, int, int>rsEp) {200 return rsEp. Item1 >= pos.X - ep.X + rsPos.Item1201 && rsEp. Item2 >= pos.Y - ep.Y + rsPos.Item2202 && rsEp. Item3 >= pos.Z - ep.Z + rsPos.Item3;206 protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(Vector3D pos, ResidualSpace rsPos, PackingPosition ep, ResidualSpace rsEp) { 207 return rsEp.Width >= pos.X - ep.X + rsPos.Width 208 && rsEp.Height >= pos.Y - ep.Y + rsPos.Height 209 && rsEp.Depth >= pos.Z - ep.Z + rsPos.Depth; 203 210 } 204 211 … … 210 217 /// <param name="pos"></param> 211 218 /// <returns>A Tuple(width, Height, Depth)</width></returns> 212 protected Tuple<int, int, int> CalculateResidualSpace(BinPacking3D binPacking, Vector3D pos) { 219 protected virtual ResidualSpace CalculateResidualSpace(BinPacking3D binPacking, Vector3D pos) { 220 //return ResidualSpaceCalculator.Create().CalculateResidualSpace(binPacking, pos).First(); 221 return new ResidualSpace(CalculateResidualSpaceOld(binPacking, pos)); 222 } 223 224 protected virtual Tuple<int, int, int> CalculateResidualSpaceOld(BinPacking3D binPacking, Vector3D pos) { 225 213 226 if (pos == null) { 214 227 return Tuple.Create(0, 0, 0);
Note: See TracChangeset
for help on using the changeset viewer.