Changeset 15278 for stable/HeuristicLab.Problems.BinPacking.Views
- Timestamp:
- 07/21/17 11:29:08 (7 years ago)
- Location:
- stable
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 14708-14709,14971,14978-14979,15167,15230,15233,15240-15241,15276
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.BinPacking.Views
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/trunk/sources/HeuristicLab.Problems.BinPacking.Views merged eligible /branches/1721-RandomForestPersistence/HeuristicLab.Problems.BinPacking.Views 10321-10322 /branches/Algorithms.GradientDescent/HeuristicLab.Problems.BinPacking.Views 5516-5520 /branches/Benchmarking/sources/HeuristicLab.Problems.BinPacking.Views 6917-7005 /branches/BinPackingExtension/HeuristicLab.Problems.BinPacking.Views 14835-15229 /branches/CloningRefactoring/HeuristicLab.Problems.BinPacking.Views 4656-4721 /branches/CodeEditor/HeuristicLab.Problems.BinPacking.Views 11700-11806 /branches/DataAnalysis Refactoring/HeuristicLab.Problems.BinPacking.Views 5471-5808 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Problems.BinPacking.Views 5815-6180 /branches/DataAnalysis/HeuristicLab.Problems.BinPacking.Views 4458-4459,4462,4464 /branches/DataPreprocessing/HeuristicLab.Problems.BinPacking.Views 10085-11101 /branches/GP.Grammar.Editor/HeuristicLab.Problems.BinPacking.Views 6284-6795 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Problems.BinPacking.Views 5060 /branches/HLScript/HeuristicLab.Problems.BinPacking.Views 10331-10358 /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.BinPacking.Views 11570-12508 /branches/HeuristicLab.Problems.DataAnalysis.Trading/HeuristicLab.Problems.BinPacking.Views 6123-9799 /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.BinPacking.Views 11130-12721 /branches/HiveStatistics/sources/HeuristicLab.Problems.BinPacking.Views 12440-12877 /branches/LogResidualEvaluator/HeuristicLab.Problems.BinPacking.Views 10202-10483 /branches/NET40/sources/HeuristicLab.Problems.BinPacking.Views 5138-5162 /branches/NSGA-II Changes/HeuristicLab.Problems.BinPacking.Views 12033-12122 /branches/ParallelEngine/HeuristicLab.Problems.BinPacking.Views 5175-5192 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Problems.BinPacking.Views 7568-7810 /branches/QAPAlgorithms/HeuristicLab.Problems.BinPacking.Views 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Problems.BinPacking.Views 6828 /branches/RuntimeOptimizer/HeuristicLab.Problems.BinPacking.Views 8943-9078 /branches/ScatterSearch (trunk integration)/HeuristicLab.Problems.BinPacking.Views 7787-8333 /branches/SlaveShutdown/HeuristicLab.Problems.BinPacking.Views 8944-8956 /branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.BinPacking.Views 10204-10479 /branches/SuccessProgressAnalysis/HeuristicLab.Problems.BinPacking.Views 5370-5682 /branches/Trunk/HeuristicLab.Problems.BinPacking.Views 6829-6865 /branches/UnloadJobs/HeuristicLab.Problems.BinPacking.Views 9168-9215 /branches/VNS/HeuristicLab.Problems.BinPacking.Views 5594-5752 /branches/crossvalidation-2434/HeuristicLab.Problems.BinPacking.Views 12948-12950 /branches/histogram/HeuristicLab.Problems.BinPacking.Views 5959-6341 /branches/symbreg-factors-2650/HeuristicLab.Problems.BinPacking.Views 14232-14825 /trunk/sources/HeuristicLab.Problems.TestFunctions.MultiObjective/HeuristicLab.Problems.BinPacking.Views 14175
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml
r14162 r15278 33 33 > 34 34 <Grid> 35 <Viewport3D Name="viewport3D1" > 36 <Viewport3D.Camera> 37 <PerspectiveCamera x:Name="camMain" Position="0.5 8 8" LookDirection="0 -1 -1"> <!-- camera position for design time--> 38 </PerspectiveCamera> 39 </Viewport3D.Camera> 40 <ModelVisual3D> 41 <ModelVisual3D.Content> 42 <DirectionalLight x:Name="dirLightMain" Direction="0,-1,-1"/> 43 </ModelVisual3D.Content> 44 </ModelVisual3D> 45 <ModelVisual3D> 46 </ModelVisual3D> 47 <ModelVisual3D x:Name="MyModel"> 48 <ModelVisual3D.Content> 49 <Model3DGroup> 50 <GeometryModel3D> 51 <GeometryModel3D.Geometry> 52 <!-- two opaque cubes, one in front one in back--> 53 <MeshGeometry3D x:Name="meshMain" 54 Positions="0 0 -2.5 1 0 -2.5 0 1 -2.5 1 1 -2.5 0 0 -1.5 1 0 -1.5 0 1 -1.5 1 1 -1.5 55 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1" 56 TriangleIndices="10 11 9 10 9 8 15 9 11 15 13 9 14 13 15 14 12 13 14 10 12 10 8 12 10 15 11 10 14 15 0 9 13 8 13 12 57 2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 4 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4 "> 58 </MeshGeometry3D> 59 </GeometryModel3D.Geometry> 60 <GeometryModel3D.Material> 61 <DiffuseMaterial> 62 <DiffuseMaterial.Brush> 63 <SolidColorBrush Color="LightGreen"/> 64 </DiffuseMaterial.Brush> 65 </DiffuseMaterial> 66 </GeometryModel3D.Material> 67 </GeometryModel3D> 68 <GeometryModel3D> 69 <GeometryModel3D.Geometry> 70 <!-- two transparent cubes, one in front one in back--> 71 <!-- draw transparent cubes from back to front and always draw outer and inner triangles and draw from front to back--> 72 <MeshGeometry3D x:Name="meshInsides" 73 Positions="-1 -1 -1 2 -1 -1 -1 2 -1 2 2 -1 -1 -1 2 2 -1 2 -1 2 2 2 2 2 74 -1 -1 -3 2 -1 -3 -1 2 -3 2 2 -3 -1 -1 -1 2 -1 -1 -1 2 -1 2 2 -1" 75 TriangleIndices="9 11 10 8 9 10 11 9 15 9 13 15 15 13 14 13 12 14 12 10 14 12 8 10 11 15 10 15 14 10 13 9 8 12 13 8 76 1 3 2 0 1 2 3 1 7 1 5 7 7 5 6 5 4 6 4 2 6 4 0 2 3 7 2 7 6 2 5 1 0 4 5 0 77 "> 78 </MeshGeometry3D> 79 </GeometryModel3D.Geometry> 80 <GeometryModel3D.Material> 81 <MaterialGroup> 82 <DiffuseMaterial> 83 <DiffuseMaterial.Brush> 84 <SolidColorBrush Opacity="0.1" Color="DarkGray"/> 85 </DiffuseMaterial.Brush> 86 </DiffuseMaterial> 87 </MaterialGroup> 88 </GeometryModel3D.Material> 89 </GeometryModel3D> 90 <GeometryModel3D> 91 <GeometryModel3D.Geometry> 92 <!-- two transparent cubes, one in front one in back--> 93 <!-- draw transparent cubes from back to front and always draw outer and inner triangles and draw from front to back--> 94 <MeshGeometry3D x:Name="meshTransparent" 95 Positions="-1 -1 -1 2 -1 -1 -1 2 -1 2 2 -1 -1 -1 2 2 -1 2 -1 2 2 2 2 2 96 -1 -1 -3 2 -1 -3 -1 2 -3 2 2 -3 -1 -1 -1 2 -1 -1 -1 2 -1 2 2 -1" 97 TriangleIndices="2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 4 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4 98 10 11 9 10 9 8 15 9 11 15 13 9 14 13 15 14 12 13 14 10 12 10 8 12 10 15 11 10 14 15 0 9 13 8 13 12 99 "> 100 </MeshGeometry3D> 101 </GeometryModel3D.Geometry> 102 <GeometryModel3D.Material> 103 <MaterialGroup> 104 <DiffuseMaterial> 105 <DiffuseMaterial.Brush> 106 <SolidColorBrush Opacity="0.1" Color="DarkGray"/> 107 </DiffuseMaterial.Brush> 108 </DiffuseMaterial> 109 </MaterialGroup> 110 </GeometryModel3D.Material> 111 </GeometryModel3D> 112 113 </Model3DGroup> 114 </ModelVisual3D.Content> 115 <ModelVisual3D.Transform> 116 <Transform3DGroup> 117 <ScaleTransform3D x:Name="scale" ScaleX="1" ScaleY="1" ScaleZ="1"/> 118 <TranslateTransform3D OffsetX="-0.5" OffsetY="-0.5" OffsetZ="-0.5" /> 119 <RotateTransform3D> 120 <RotateTransform3D.Rotation> 121 <AxisAngleRotation3D x:Name="rotateX" Axis="0 1 0"/> 122 </RotateTransform3D.Rotation> 123 </RotateTransform3D> 124 <RotateTransform3D> 125 <RotateTransform3D.Rotation> 126 <AxisAngleRotation3D x:Name="rotateY" Axis="1 0 0"/> 127 </RotateTransform3D.Rotation> 128 </RotateTransform3D> 129 <TranslateTransform3D OffsetX="0.5" OffsetY="0.5" OffsetZ="0.5" /> 130 <ScaleTransform3D x:Name="scaleZoom" CenterX="0.5" CenterY="0.5" CenterZ="0.5" ScaleX="1" ScaleY="1" ScaleZ="1"/> 131 </Transform3DGroup> 132 </ModelVisual3D.Transform> 133 </ModelVisual3D> 134 </Viewport3D> 35 <Border BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"> 36 <Viewport3D Name="viewport3D1" > 37 <Viewport3D.Camera> 38 <PerspectiveCamera x:Name="camMain" Position="0.5 8 8" LookDirection="0 -1 -1"> <!-- camera position for design time--> 39 </PerspectiveCamera> 40 </Viewport3D.Camera> 41 <ModelVisual3D> 42 <ModelVisual3D.Content> 43 <DirectionalLight x:Name="dirLightMain" Direction="0,-1,-1"/> 44 </ModelVisual3D.Content> 45 </ModelVisual3D> 46 <ModelVisual3D> 47 </ModelVisual3D> 48 <ModelVisual3D x:Name="MyModel"> 49 <ModelVisual3D.Content> 50 <Model3DGroup> 51 </Model3DGroup> 52 </ModelVisual3D.Content> 53 <ModelVisual3D.Transform> 54 <Transform3DGroup> 55 <ScaleTransform3D x:Name="scale" ScaleX="1" ScaleY="1" ScaleZ="1"/> 56 <RotateTransform3D x:Name="rotateX"> 57 <RotateTransform3D.Rotation> 58 <AxisAngleRotation3D Axis="0 1 0"/> 59 </RotateTransform3D.Rotation> 60 </RotateTransform3D> 61 <RotateTransform3D x:Name="rotateY"> 62 <RotateTransform3D.Rotation> 63 <AxisAngleRotation3D Axis="1 0 0"/> 64 </RotateTransform3D.Rotation> 65 </RotateTransform3D> 66 <ScaleTransform3D x:Name="scaleZoom" ScaleX="1" ScaleY="1" ScaleZ="1"/> 67 </Transform3DGroup> 68 </ModelVisual3D.Transform> 69 </ModelVisual3D> 70 </Viewport3D> 71 </Border> 135 72 </Grid> 136 73 </UserControl> -
stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs
r14162 r15278 19 19 20 20 using System; 21 using System.Collections.Generic; 21 22 using System.Linq; 22 23 using System.Windows; 23 24 using System.Windows.Controls; 24 25 using System.Windows.Input; 26 using System.Windows.Media; 25 27 using System.Windows.Media.Media3D; 26 28 using HeuristicLab.Problems.BinPacking3D; … … 28 30 namespace HeuristicLab.Problems.BinPacking.Views { 29 31 public partial class Container3DView : UserControl { 32 private static readonly Color[] colors = new[] { 33 Color.FromRgb(0x40, 0x6A, 0xB7), 34 Color.FromRgb(0xB1, 0x6D, 0x01), 35 Color.FromRgb(0x4E, 0x8A, 0x06), 36 Color.FromRgb(0x75, 0x50, 0x7B), 37 Color.FromRgb(0x72, 0x9F, 0xCF), 38 Color.FromRgb(0xA4, 0x00, 0x00), 39 Color.FromRgb(0xAD, 0x7F, 0xA8), 40 Color.FromRgb(0x29, 0x50, 0xCF), 41 Color.FromRgb(0x90, 0xB0, 0x60), 42 Color.FromRgb(0xF5, 0x89, 0x30), 43 Color.FromRgb(0x55, 0x57, 0x53), 44 Color.FromRgb(0xEF, 0x59, 0x59), 45 Color.FromRgb(0xED, 0xD4, 0x30), 46 Color.FromRgb(0x63, 0xC2, 0x16), 47 }; 48 49 private static readonly Color hiddenColor = Color.FromArgb(0x1A, 0xAA, 0xAA, 0xAA); 50 private static readonly Color containerColor = Color.FromArgb(0x7F, 0xAA, 0xAA, 0xAA); 51 30 52 private Point startPos; 31 53 private bool mouseDown = false; … … 45 67 } 46 68 69 private Dictionary<int, DiffuseMaterial> materials; 70 47 71 public Container3DView() { 48 72 InitializeComponent(); 49 73 camMain.Position = new Point3D(0.5, 3, 3); // for design time we use a different camera position 74 materials = new Dictionary<int, DiffuseMaterial>(); 50 75 Clear(); 51 76 } … … 74 99 if (packing == null) return; // nothing to display 75 100 76 // draw all items 77 // order by Z position to reduce artifacts (because of transparent objects) 78 // TODO: improve code to reduce artifacts 79 // - from triangle definitions and lighting 80 // - from rotation and Z-ordering 81 82 foreach (var item in packing.Items.OrderBy(i => packing.Positions[i.Key].Z)) { 83 var position = packing.Positions[item.Key]; 84 85 var w = position.Rotated ? item.Value.Depth : item.Value.Width; 86 var h = item.Value.Height; 87 var d = position.Rotated ? item.Value.Width : item.Value.Depth; 88 89 // ignore the item.Material 90 91 // if nothing is selected then draw all cubes opaque 92 // otherwise draw only the selected cube opaque and all others transparent 93 if (selectedItemKey < 0 || selectedItemKey == item.Key) { 94 AddCube(meshMain, position.X, position.Y, position.Z, w, h, d); 95 } else { 96 AddCube(meshTransparent, position.X, position.Y, position.Z, w, h, d, addInsideTriangles: true); 101 var modelGroup = (Model3DGroup)MyModel.Content; 102 var hiddenMaterial = new DiffuseMaterial(new SolidColorBrush(hiddenColor)); 103 104 if (selectedItemKey >= 0) { 105 var selectedItem = packing.Items.Single(x => selectedItemKey == x.Key); 106 var selectedPos = packing.Positions[selectedItem.Key]; 107 108 var colorIdx = selectedItem.Value.Material; 109 while (colorIdx < 0) colorIdx += colors.Length; 110 colorIdx = colorIdx % colors.Length; 111 var color = colors[colorIdx]; 112 var material = new DiffuseMaterial { Brush = new SolidColorBrush(color) }; 113 materials[selectedItem.Value.Material] = material; 114 115 var selectedModel = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = material }; 116 AddSolidCube((MeshGeometry3D)selectedModel.Geometry, selectedPos.X, selectedPos.Y, selectedPos.Z, 117 selectedPos.Rotated ? selectedItem.Value.Depth : selectedItem.Value.Width, 118 selectedItem.Value.Height, 119 selectedPos.Rotated ? selectedItem.Value.Width : selectedItem.Value.Depth); 120 modelGroup.Children.Add(selectedModel); 121 122 foreach (var item in packing.Items.Where(x => selectedItemKey != x.Key)) { 123 var position = packing.Positions[item.Key]; 124 125 var w = position.Rotated ? item.Value.Depth : item.Value.Width; 126 var h = item.Value.Height; 127 var d = position.Rotated ? item.Value.Width : item.Value.Depth; 128 129 var model = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = hiddenMaterial }; 130 AddWireframeCube((MeshGeometry3D)model.Geometry, position.X, position.Y, position.Z, w, h, d, 1); 131 modelGroup.Children.Add(model); 132 } 133 } else { 134 foreach (var item in packing.Items) { 135 var position = packing.Positions[item.Key]; 136 137 var w = position.Rotated ? item.Value.Depth : item.Value.Width; 138 var h = item.Value.Height; 139 var d = position.Rotated ? item.Value.Width : item.Value.Depth; 140 141 var model = new GeometryModel3D { Geometry = new MeshGeometry3D() }; 142 DiffuseMaterial material; 143 if (!materials.TryGetValue(item.Value.Material, out material)) { 144 var colorIdx = item.Value.Material; 145 while (colorIdx < 0) colorIdx += colors.Length; 146 colorIdx = colorIdx % colors.Length; 147 var color = colors[colorIdx]; 148 material = new DiffuseMaterial { Brush = new SolidColorBrush(color) }; 149 materials[item.Value.Material] = material; 150 } 151 var selectedModel = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = material }; 152 AddSolidCube((MeshGeometry3D)selectedModel.Geometry, position.X, position.Y, position.Z, w, h, d); 153 modelGroup.Children.Add(selectedModel); 97 154 } 98 155 } 99 156 100 157 var container = packing.BinShape; 101 // draw a transparent container 102 AddCube(meshTransparent, container.Origin.X, container.Origin.Y, container.Origin.Z, container.Width, container.Height, container.Depth, addInsideTriangles: true); 103 104 // TODO: support cuboids with different side lengths 105 // apply scaling so that the container fits into the unit cube (necessary for the transformations) 106 scale.ScaleX = 1.0 / (container.Width); 107 scale.ScaleY = 1.0 / (container.Height); 108 scale.ScaleZ = 1.0 / (container.Depth); 158 var containerModel = new GeometryModel3D(new MeshGeometry3D(), new DiffuseMaterial(new SolidColorBrush(containerColor))); 159 modelGroup.Children.Add(containerModel); 160 AddWireframeCube((MeshGeometry3D)containerModel.Geometry, container.Origin.X - .5, container.Origin.Y - .5, container.Origin.Z - .5, container.Width + 1, container.Height + 1, container.Depth + 1); 161 162 var ratio = Math.Max(container.Width, Math.Max(container.Height, container.Depth)); 163 scale.ScaleX = 1.0 / ratio; 164 scale.ScaleY = 1.0 / ratio; 165 scale.ScaleZ = 1.0 / ratio; 166 167 scaleZoom.CenterX = rotateX.CenterX = rotateY.CenterX = container.Width / (2.0 * ratio); 168 scaleZoom.CenterY = rotateX.CenterY = rotateY.CenterY = container.Height / (2.0 * ratio); 169 scaleZoom.CenterZ = rotateX.CenterZ = rotateY.CenterZ = container.Depth / (2.0 * ratio); 170 171 camMain.Position = new Point3D( 172 scaleZoom.CenterX, 173 3, 174 3); 175 camMain.LookDirection = new Vector3D( 176 0, 177 scaleZoom.CenterY - camMain.Position.Y, 178 scaleZoom.CenterZ - camMain.Position.Z); 109 179 } 110 180 111 181 112 182 private void Clear() { 113 meshInsides.Positions.Clear(); 114 meshInsides.TriangleIndices.Clear(); 115 116 meshMain.Positions.Clear(); 117 meshMain.TriangleIndices.Clear(); 118 119 meshTransparent.Positions.Clear(); 120 meshTransparent.TriangleIndices.Clear(); 183 ((Model3DGroup)MyModel.Content).Children.Clear(); 184 materials.Clear(); 121 185 122 186 mouseDown = false; … … 128 192 if (!mouseDown) return; 129 193 var pos = e.GetPosition((IInputElement)this); 130 rotateX.Angle = startAngleX + (pos.X - startPos.X) / 4; 131 rotateY.Angle = startAngleY + (pos.Y - startPos.Y) / 4; 194 195 ((AxisAngleRotation3D)rotateX.Rotation).Angle = startAngleX + (pos.X - startPos.X) / 4; 196 ((AxisAngleRotation3D)rotateY.Rotation).Angle = startAngleY + (pos.Y - startPos.Y) / 4; 132 197 } 133 198 134 199 private void Container3DView_MouseDown(object sender, MouseButtonEventArgs e) { 135 startAngleX = rotateX.Angle;136 startAngleY = rotateY.Angle;200 startAngleX = ((AxisAngleRotation3D)rotateX.Rotation).Angle; 201 startAngleY = ((AxisAngleRotation3D)rotateY.Rotation).Angle; 137 202 this.startPos = e.GetPosition((IInputElement)this); 138 203 this.mouseDown = true; … … 155 220 } 156 221 222 private void Container3DView_OnMouseEnter(object sender, MouseEventArgs e) { 223 Focus(); // for mouse wheel events 224 } 157 225 158 226 #region helper for cubes 159 160 private void AddCube(MeshGeometry3D mesh, int x, int y, int z, int width, int height, int depth, bool addInsideTriangles = false) { 161 AddOutsideTriangles(mesh, AddPoints(mesh, x, y, z, width, height, depth)); 162 if (addInsideTriangles) AddInsideTriangles(meshInsides, AddPoints(meshInsides, x, y, z, width, height, depth)); 163 } 164 165 private void AddOutsideTriangles(MeshGeometry3D mesh, int[] pointIdx) { 166 // point indices counter-clockwise 167 // back side 168 mesh.TriangleIndices.Add(pointIdx[0]); 169 mesh.TriangleIndices.Add(pointIdx[2]); 170 mesh.TriangleIndices.Add(pointIdx[1]); 171 172 mesh.TriangleIndices.Add(pointIdx[0]); 173 mesh.TriangleIndices.Add(pointIdx[3]); 174 mesh.TriangleIndices.Add(pointIdx[2]); 175 176 // bottom side 177 mesh.TriangleIndices.Add(pointIdx[5]); 178 mesh.TriangleIndices.Add(pointIdx[4]); 179 mesh.TriangleIndices.Add(pointIdx[0]); 180 181 mesh.TriangleIndices.Add(pointIdx[5]); 182 mesh.TriangleIndices.Add(pointIdx[0]); 183 mesh.TriangleIndices.Add(pointIdx[1]); 184 185 // right side 186 mesh.TriangleIndices.Add(pointIdx[2]); 187 mesh.TriangleIndices.Add(pointIdx[6]); 188 mesh.TriangleIndices.Add(pointIdx[5]); 189 190 mesh.TriangleIndices.Add(pointIdx[1]); 191 mesh.TriangleIndices.Add(pointIdx[2]); 192 mesh.TriangleIndices.Add(pointIdx[5]); 193 194 // left side 195 mesh.TriangleIndices.Add(pointIdx[7]); 196 mesh.TriangleIndices.Add(pointIdx[3]); 197 mesh.TriangleIndices.Add(pointIdx[4]); 198 199 mesh.TriangleIndices.Add(pointIdx[4]); 200 mesh.TriangleIndices.Add(pointIdx[3]); 201 mesh.TriangleIndices.Add(pointIdx[0]); 202 203 // top side 204 mesh.TriangleIndices.Add(pointIdx[3]); 205 mesh.TriangleIndices.Add(pointIdx[7]); 206 mesh.TriangleIndices.Add(pointIdx[6]); 207 208 mesh.TriangleIndices.Add(pointIdx[3]); 209 mesh.TriangleIndices.Add(pointIdx[6]); 210 mesh.TriangleIndices.Add(pointIdx[2]); 211 212 // front side 213 mesh.TriangleIndices.Add(pointIdx[6]); 214 mesh.TriangleIndices.Add(pointIdx[7]); 215 mesh.TriangleIndices.Add(pointIdx[4]); 216 217 mesh.TriangleIndices.Add(pointIdx[6]); 218 mesh.TriangleIndices.Add(pointIdx[4]); 219 mesh.TriangleIndices.Add(pointIdx[5]); 220 } 221 222 private void AddInsideTriangles(MeshGeometry3D mesh, int[] pointIdx) { 223 // for each cube we also draw the triangles facing inside because they are visible when a cube is transparent 224 // point indices clockwise 225 226 // back side 227 mesh.TriangleIndices.Add(pointIdx[1]); 228 mesh.TriangleIndices.Add(pointIdx[2]); 229 mesh.TriangleIndices.Add(pointIdx[0]); 230 231 mesh.TriangleIndices.Add(pointIdx[2]); 232 mesh.TriangleIndices.Add(pointIdx[3]); 233 mesh.TriangleIndices.Add(pointIdx[0]); 234 235 // bottom side 236 mesh.TriangleIndices.Add(pointIdx[0]); 237 mesh.TriangleIndices.Add(pointIdx[4]); 238 mesh.TriangleIndices.Add(pointIdx[5]); 239 240 mesh.TriangleIndices.Add(pointIdx[1]); 241 mesh.TriangleIndices.Add(pointIdx[0]); 242 mesh.TriangleIndices.Add(pointIdx[5]); 243 244 // right side 245 mesh.TriangleIndices.Add(pointIdx[5]); 246 mesh.TriangleIndices.Add(pointIdx[6]); 247 mesh.TriangleIndices.Add(pointIdx[2]); 248 249 mesh.TriangleIndices.Add(pointIdx[5]); 250 mesh.TriangleIndices.Add(pointIdx[2]); 251 mesh.TriangleIndices.Add(pointIdx[1]); 252 253 // left side 254 mesh.TriangleIndices.Add(pointIdx[4]); 255 mesh.TriangleIndices.Add(pointIdx[3]); 256 mesh.TriangleIndices.Add(pointIdx[7]); 257 258 mesh.TriangleIndices.Add(pointIdx[0]); 259 mesh.TriangleIndices.Add(pointIdx[3]); 260 mesh.TriangleIndices.Add(pointIdx[4]); 261 262 // top side 263 mesh.TriangleIndices.Add(pointIdx[6]); 264 mesh.TriangleIndices.Add(pointIdx[7]); 265 mesh.TriangleIndices.Add(pointIdx[3]); 266 267 mesh.TriangleIndices.Add(pointIdx[2]); 268 mesh.TriangleIndices.Add(pointIdx[6]); 269 mesh.TriangleIndices.Add(pointIdx[3]); 270 271 // front side 272 mesh.TriangleIndices.Add(pointIdx[4]); 273 mesh.TriangleIndices.Add(pointIdx[7]); 274 mesh.TriangleIndices.Add(pointIdx[6]); 275 276 mesh.TriangleIndices.Add(pointIdx[5]); 277 mesh.TriangleIndices.Add(pointIdx[4]); 278 mesh.TriangleIndices.Add(pointIdx[6]); 279 } 280 281 private int[] AddPoints(MeshGeometry3D mesh, int x, int y, int z, int w, int h, int d) { 227 /// <summary> 228 /// Creates a solid cube by adding the respective points and triangles. 229 /// </summary> 230 /// <param name="mesh">The mesh to which points and triangles are added.</param> 231 /// <param name="x">The leftmost point</param> 232 /// <param name="y">The frontmost point</param> 233 /// <param name="z">The lowest point</param> 234 /// <param name="width">The extension to the right</param> 235 /// <param name="height">The extension to the back</param> 236 /// <param name="depth">The extension to the top</param> 237 private void AddSolidCube(MeshGeometry3D mesh, int x, int y, int z, int width, int height, int depth) { 282 238 // ground 283 239 mesh.Positions.Add(new Point3D(x, y, z)); 284 mesh.Positions.Add(new Point3D(x + w , y, z));285 mesh.Positions.Add(new Point3D(x + w , y + h, z));286 mesh.Positions.Add(new Point3D(x, y + h , z));240 mesh.Positions.Add(new Point3D(x + width, y, z)); 241 mesh.Positions.Add(new Point3D(x + width, y + height, z)); 242 mesh.Positions.Add(new Point3D(x, y + height, z)); 287 243 // top 288 mesh.Positions.Add(new Point3D(x, y, z + d)); 289 mesh.Positions.Add(new Point3D(x + w, y, z + d)); 290 mesh.Positions.Add(new Point3D(x + w, y + h, z + d)); 291 mesh.Positions.Add(new Point3D(x, y + h, z + d)); 292 293 return Enumerable.Range(mesh.Positions.Count - 8, 8).ToArray(); 244 mesh.Positions.Add(new Point3D(x, y, z + depth)); 245 mesh.Positions.Add(new Point3D(x + width, y, z + depth)); 246 mesh.Positions.Add(new Point3D(x + width, y + height, z + depth)); 247 mesh.Positions.Add(new Point3D(x, y + height, z + depth)); 248 249 // front 250 AddPlane(mesh, 0, 1, 5, 4); 251 // right side 252 AddPlane(mesh, 1, 2, 6, 5); 253 // back 254 AddPlane(mesh, 3, 7, 6, 2); 255 // left side 256 AddPlane(mesh, 0, 4, 7, 3); 257 // top 258 AddPlane(mesh, 4, 5, 6, 7); 259 // bottom 260 AddPlane(mesh, 0, 3, 2, 1); 261 } 262 263 /// <summary> 264 /// Creates a wireframe cube by adding the respective points and triangles. 265 /// </summary> 266 /// <param name="mesh">The mesh to which points and triangles are added.</param> 267 /// <param name="x">The leftmost point</param> 268 /// <param name="y">The frontmost point</param> 269 /// <param name="z">The lowest point</param> 270 /// <param name="width">The extension to the right</param> 271 /// <param name="height">The extension to the back</param> 272 /// <param name="depth">The extension to the top</param> 273 /// <param name="thickness">The thickness of the frame</param> 274 private void AddWireframeCube(MeshGeometry3D mesh, double x, double y, double z, double width, double height, double depth, double thickness = double.NaN) { 275 // default thickness of the wireframe is 5% of smallest dimension 276 if (double.IsNaN(thickness)) 277 thickness = Math.Min(width, Math.Min(height, depth)) * 0.05; 278 279 // The cube contains of 8 corner, each corner has 4 points: 280 // 1. The corner point 281 // 2. A point on the edge to the right of the corner 282 // 3. A point on the edge atop or below the corner 283 // 4. A point on the edge to the left of the corner 284 285 // Point 0, Front Left Bottom 286 mesh.Positions.Add(new Point3D(x, y, z)); 287 mesh.Positions.Add(new Point3D(x + thickness, y, z)); 288 mesh.Positions.Add(new Point3D(x, y, z + thickness)); 289 mesh.Positions.Add(new Point3D(x, y + thickness, z)); 290 291 // Point 1, Front Right Bottom 292 mesh.Positions.Add(new Point3D(x + width, y, z)); 293 mesh.Positions.Add(new Point3D(x + width, y + thickness, z)); 294 mesh.Positions.Add(new Point3D(x + width, y, z + thickness)); 295 mesh.Positions.Add(new Point3D(x + width - thickness, y, z)); 296 297 // Point 2, Back Right Bottom 298 mesh.Positions.Add(new Point3D(x + width, y + height, z)); 299 mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z)); 300 mesh.Positions.Add(new Point3D(x + width, y + height, z + thickness)); 301 mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z)); 302 303 // Point 3, Back Left Bottom 304 mesh.Positions.Add(new Point3D(x, y + height, z)); 305 mesh.Positions.Add(new Point3D(x, y + height - thickness, z)); 306 mesh.Positions.Add(new Point3D(x, y + height, z + thickness)); 307 mesh.Positions.Add(new Point3D(x + thickness, y + height, z)); 308 309 // Point 4, Front Left Top 310 mesh.Positions.Add(new Point3D(x, y, z + depth)); 311 mesh.Positions.Add(new Point3D(x + thickness, y, z + depth)); 312 mesh.Positions.Add(new Point3D(x, y, z + depth - thickness)); 313 mesh.Positions.Add(new Point3D(x, y + thickness, z + depth)); 314 315 // Point 5, Front Right Top 316 mesh.Positions.Add(new Point3D(x + width, y, z + depth)); 317 mesh.Positions.Add(new Point3D(x + width, y + thickness, z + depth)); 318 mesh.Positions.Add(new Point3D(x + width, y, z + depth - thickness)); 319 mesh.Positions.Add(new Point3D(x + width - thickness, y, z + depth)); 320 321 // Point 6, Back Right Top 322 mesh.Positions.Add(new Point3D(x + width, y + height, z + depth)); 323 mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z + depth)); 324 mesh.Positions.Add(new Point3D(x + width, y + height, z + depth - thickness)); 325 mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z + depth)); 326 327 // Point 7, Back Left Top 328 mesh.Positions.Add(new Point3D(x, y + height, z + depth)); 329 mesh.Positions.Add(new Point3D(x, y + height - thickness, z + depth)); 330 mesh.Positions.Add(new Point3D(x, y + height, z + depth - thickness)); 331 mesh.Positions.Add(new Point3D(x + thickness, y + height, z + depth)); 332 333 // Point 0, non-edge 334 mesh.Positions.Add(new Point3D(x + thickness, y, z + thickness)); 335 mesh.Positions.Add(new Point3D(x, y + thickness, z + thickness)); 336 mesh.Positions.Add(new Point3D(x + thickness, y + thickness, z)); 337 338 // Point 1, non-edge 339 mesh.Positions.Add(new Point3D(x + width, y + thickness, z + thickness)); 340 mesh.Positions.Add(new Point3D(x + width - thickness, y, z + thickness)); 341 mesh.Positions.Add(new Point3D(x + width - thickness, y + thickness, z)); 342 343 // Point 2, non-edge 344 mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z + thickness)); 345 mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z + thickness)); 346 mesh.Positions.Add(new Point3D(x + width - thickness, y + height - thickness, z)); 347 348 // Point 3, non-edge 349 mesh.Positions.Add(new Point3D(x, y + height - thickness, z + thickness)); 350 mesh.Positions.Add(new Point3D(x + thickness, y + height, z + thickness)); 351 mesh.Positions.Add(new Point3D(x + thickness, y + height - thickness, z)); 352 353 // Point 4, non-edge 354 mesh.Positions.Add(new Point3D(x + thickness, y, z + depth - thickness)); 355 mesh.Positions.Add(new Point3D(x, y + thickness, z + depth - thickness)); 356 mesh.Positions.Add(new Point3D(x + thickness, y + thickness, z + depth)); 357 358 // Point 5, non-edge 359 mesh.Positions.Add(new Point3D(x + width, y + thickness, z + depth - thickness)); 360 mesh.Positions.Add(new Point3D(x + width - thickness, y, z + depth - thickness)); 361 mesh.Positions.Add(new Point3D(x + width - thickness, y + thickness, z + depth)); 362 363 // Point 6, non-edge 364 mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z + depth - thickness)); 365 mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z + depth - thickness)); 366 mesh.Positions.Add(new Point3D(x + width - thickness, y + height - thickness, z + depth)); 367 368 // Point 7, non-edge 369 mesh.Positions.Add(new Point3D(x, y + height - thickness, z + depth - thickness)); 370 mesh.Positions.Add(new Point3D(x + thickness, y + height, z + depth - thickness)); 371 mesh.Positions.Add(new Point3D(x + thickness, y + height - thickness, z + depth)); 372 373 // Draw the 24 corner plates 374 AddPlane(mesh, 0, 1, 32, 2); 375 AddPlane(mesh, 0, 2, 33, 3); 376 AddPlane(mesh, 0, 3, 34, 1); 377 378 AddPlane(mesh, 4, 6, 36, 7); 379 AddPlane(mesh, 4, 5, 35, 6); 380 AddPlane(mesh, 4, 7, 37, 5); 381 382 AddPlane(mesh, 8, 10, 39, 11); 383 AddPlane(mesh, 8, 9, 38, 10); 384 AddPlane(mesh, 8, 11, 40, 9); 385 386 AddPlane(mesh, 12, 13, 41, 14); 387 AddPlane(mesh, 12, 14, 42, 15); 388 AddPlane(mesh, 12, 15, 43, 13); 389 390 AddPlane(mesh, 16, 18, 44, 17); 391 AddPlane(mesh, 16, 19, 45, 18); 392 AddPlane(mesh, 16, 17, 46, 19); 393 394 AddPlane(mesh, 20, 23, 48, 22); 395 AddPlane(mesh, 20, 22, 47, 21); 396 AddPlane(mesh, 20, 21, 49, 23); 397 398 AddPlane(mesh, 24, 27, 51, 26); 399 AddPlane(mesh, 24, 26, 50, 25); 400 AddPlane(mesh, 24, 25, 52, 27); 401 402 AddPlane(mesh, 28, 31, 54, 30); 403 AddPlane(mesh, 28, 30, 53, 29); 404 AddPlane(mesh, 28, 29, 55, 31); 405 406 // Draw the connecting plates 407 // on the bottom 408 AddPlane(mesh, 1, 7, 36, 32); 409 AddPlane(mesh, 1, 34, 37, 7); 410 411 AddPlane(mesh, 5, 11, 39, 35); 412 AddPlane(mesh, 5, 37, 40, 11); 413 414 AddPlane(mesh, 9, 15, 42, 38); 415 AddPlane(mesh, 9, 40, 43, 15); 416 417 AddPlane(mesh, 13, 3, 33, 41); 418 AddPlane(mesh, 13, 43, 34, 3); 419 420 // between bottom and top 421 AddPlane(mesh, 2, 32, 44, 18); 422 AddPlane(mesh, 2, 18, 45, 33); 423 424 AddPlane(mesh, 6, 22, 48, 36); 425 AddPlane(mesh, 6, 35, 47, 22); 426 427 AddPlane(mesh, 10, 26, 51, 39); 428 AddPlane(mesh, 10, 38, 50, 26); 429 430 AddPlane(mesh, 14, 30, 54, 42); 431 AddPlane(mesh, 14, 41, 53, 30); 432 433 // on the top 434 AddPlane(mesh, 17, 44, 48, 23); 435 AddPlane(mesh, 17, 23, 49, 46); 436 437 AddPlane(mesh, 21, 47, 51, 27); 438 AddPlane(mesh, 21, 27, 52, 49); 439 440 AddPlane(mesh, 25, 50, 54, 31); 441 AddPlane(mesh, 25, 31, 55, 52); 442 443 AddPlane(mesh, 29, 19, 46, 55); 444 AddPlane(mesh, 29, 53, 45, 19); 445 } 446 447 /// <summary> 448 /// Adds a plane by two triangles. The indices of the points have to be given 449 /// in counter-clockwise sequence. 450 /// </summary> 451 /// <param name="mesh">The mesh to add the triangles to</param> 452 /// <param name="a">The index of the first point</param> 453 /// <param name="b">The index of the second point</param> 454 /// <param name="c">The index of the third point</param> 455 /// <param name="d">The index of the fourth point</param> 456 private void AddPlane(MeshGeometry3D mesh, int a, int b, int c, int d) { 457 // two triangles form a plane 458 mesh.TriangleIndices.Add(a); 459 mesh.TriangleIndices.Add(b); 460 mesh.TriangleIndices.Add(d); 461 mesh.TriangleIndices.Add(c); 462 mesh.TriangleIndices.Add(d); 463 mesh.TriangleIndices.Add(b); 294 464 } 295 465 #endregion 296 466 297 private void Container3DView_OnMouseEnter(object sender, MouseEventArgs e) {298 Focus(); // for mouse wheel events299 }300 467 } 301 468 } -
stable/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj
r14180 r15278 75 75 <Reference Include="System" /> 76 76 <Reference Include="System.Core" /> 77 <Reference Include="System.Data" /> 77 78 <Reference Include="System.Drawing" /> 78 79 <Reference Include="System.Windows.Forms" /> 79 80 <Reference Include="System.Xaml" /> 81 <Reference Include="System.Xml" /> 80 82 <Reference Include="UIAutomationProvider" /> 81 83 <Reference Include="WindowsBase" />
Note: See TracChangeset
for help on using the changeset viewer.