Changeset 14978


Ignore:
Timestamp:
05/12/17 23:37:08 (4 years ago)
Author:
abeham
Message:

#2739: Improved Bin Packing 3D View

  • Fixing an overlap of triangles in the corner points in the wireframe code
  • Removing unnecessary translate transforms and using centerXYZ of scaling and rotation
  • Correctly calculated the center of the bin after scaling
  • When an item is selected, instead of using solid cubes with semi-transparent surfaces, a wireframe model is displayed
    • The selected cube has to be drawn first, otherwise the other wireframe cubes are not transparent to it
Location:
trunk/sources/HeuristicLab.Problems.BinPacking.Views/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml

    r14971 r14978  
    5555                        <Transform3DGroup>
    5656                            <ScaleTransform3D x:Name="scale" ScaleX="1" ScaleY="1" ScaleZ="1"/>
    57                             <TranslateTransform3D OffsetX="-0.5" OffsetY="-0.5" OffsetZ="-0.5" />
    58                             <RotateTransform3D>
     57                            <RotateTransform3D x:Name="rotateX">
    5958                                <RotateTransform3D.Rotation>
    60                                     <AxisAngleRotation3D x:Name="rotateX" Axis="0 1 0"/>
     59                                    <AxisAngleRotation3D Axis="0 1 0"/>
    6160                                </RotateTransform3D.Rotation>
    6261                            </RotateTransform3D>
    63                             <RotateTransform3D>
     62                            <RotateTransform3D x:Name="rotateY">
    6463                                <RotateTransform3D.Rotation>
    65                                     <AxisAngleRotation3D x:Name="rotateY" Axis="1 0 0"/>
     64                                    <AxisAngleRotation3D Axis="1 0 0"/>
    6665                                </RotateTransform3D.Rotation>
    6766                            </RotateTransform3D>
    68                             <TranslateTransform3D OffsetX="0.5" OffsetY="0.5" OffsetZ="0.5" />
    69                             <ScaleTransform3D x:Name="scaleZoom" CenterX="0.5" CenterY="0.5" CenterZ="0.5" ScaleX="1" ScaleY="1" ScaleZ="1"/>
     67                            <ScaleTransform3D x:Name="scaleZoom" ScaleX="1" ScaleY="1" ScaleZ="1"/>
    7068                        </Transform3DGroup>
    7169                    </ModelVisual3D.Transform>
  • trunk/sources/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs

    r14709 r14978  
    103103      var hiddenMaterial = new DiffuseMaterial(new SolidColorBrush(hiddenColor));
    104104
    105       foreach (var item in packing.Items) {
    106         var position = packing.Positions[item.Key];
    107 
    108         var w = position.Rotated ? item.Value.Depth : item.Value.Width;
    109         var h = item.Value.Height;
    110         var d = position.Rotated ? item.Value.Width : item.Value.Depth;
    111 
    112         var model = new GeometryModel3D { Geometry = new MeshGeometry3D() };
     105      if (selectedItemKey >= 0) {
     106        var selectedItem = packing.Items.Single(x => selectedItemKey == x.Key);
     107        var selectedPos = packing.Positions[selectedItem.Key];
    113108        DiffuseMaterial material;
    114         if (selectedItemKey >= 0 && selectedItemKey != item.Key)
    115           material = hiddenMaterial;
    116         else {
     109        if (!materials.TryGetValue(selectedItem.Value.Material, out material)) {
     110          var colorIdx = selectedItem.Value.Material;
     111          while (colorIdx < 0) colorIdx += colors.Length;
     112          colorIdx = colorIdx % colors.Length;
     113          var color = colors[colorIdx];
     114          material = new DiffuseMaterial { Brush = new SolidColorBrush(color) };
     115          materials[selectedItem.Value.Material] = material;
     116        }
     117        var selectedModel = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = material };
     118        AddSolidCube((MeshGeometry3D)selectedModel.Geometry, selectedPos.X, selectedPos.Y, selectedPos.Z,
     119          selectedPos.Rotated ? selectedItem.Value.Depth : selectedItem.Value.Width,
     120          selectedItem.Value.Height,
     121          selectedPos.Rotated ? selectedItem.Value.Width : selectedItem.Value.Depth);
     122        modelGroup.Children.Add(selectedModel);
     123
     124        foreach (var item in packing.Items.Where(x => selectedItemKey != x.Key)) {
     125          var position = packing.Positions[item.Key];
     126
     127          var w = position.Rotated ? item.Value.Depth : item.Value.Width;
     128          var h = item.Value.Height;
     129          var d = position.Rotated ? item.Value.Width : item.Value.Depth;
     130
     131          var model = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = hiddenMaterial };
     132          AddWireframeCube((MeshGeometry3D)model.Geometry, position.X, position.Y, position.Z, w, h, d, 1);
     133          modelGroup.Children.Add(model);
     134        }
     135      } else {
     136        foreach (var item in packing.Items) {
     137          var position = packing.Positions[item.Key];
     138
     139          var w = position.Rotated ? item.Value.Depth : item.Value.Width;
     140          var h = item.Value.Height;
     141          var d = position.Rotated ? item.Value.Width : item.Value.Depth;
     142
     143          var model = new GeometryModel3D { Geometry = new MeshGeometry3D() };
     144          DiffuseMaterial material;
    117145          if (!materials.TryGetValue(item.Value.Material, out material)) {
    118146            var colorIdx = item.Value.Material;
     
    123151            materials[item.Value.Material] = material;
    124152          }
     153          var selectedModel = new GeometryModel3D { Geometry = new MeshGeometry3D(), Material = material };
     154          AddSolidCube((MeshGeometry3D)selectedModel.Geometry, position.X, position.Y, position.Z, w, h, d);
     155          modelGroup.Children.Add(selectedModel);
    125156        }
    126         model.Material = material;
    127         modelGroup.Children.Add(model);
    128 
    129         AddSolidCube((MeshGeometry3D)model.Geometry, position.X, position.Y, position.Z, w, h, d);
    130157      }
    131158
     
    140167      scale.ScaleZ = 1.0 / ratio;
    141168
    142       scale.CenterX = .5;
    143       scale.CenterY = .5;
    144       scale.CenterZ = 0;
     169      scaleZoom.CenterX = rotateX.CenterX = rotateY.CenterX = container.Width / (2.0 * ratio);
     170      scaleZoom.CenterY = rotateX.CenterY = rotateY.CenterY = container.Height / (2.0 * ratio);
     171      scaleZoom.CenterZ = rotateX.CenterZ = rotateY.CenterZ = container.Depth / (2.0 * ratio);
    145172    }
    146173
     
    159186      var pos = e.GetPosition((IInputElement)this);
    160187     
    161       rotateX.Angle = startAngleX + (pos.X - startPos.X) / 4;
    162       rotateY.Angle = startAngleY + (pos.Y - startPos.Y) / 4;
     188      ((AxisAngleRotation3D)rotateX.Rotation).Angle = startAngleX + (pos.X - startPos.X) / 4;
     189      ((AxisAngleRotation3D)rotateY.Rotation).Angle = startAngleY + (pos.Y - startPos.Y) / 4;
    163190    }
    164191
    165192    private void Container3DView_MouseDown(object sender, MouseButtonEventArgs e) {
    166       startAngleX = rotateX.Angle;
    167       startAngleY = rotateY.Angle;
     193      startAngleX = ((AxisAngleRotation3D)rotateX.Rotation).Angle;
     194      startAngleY = ((AxisAngleRotation3D)rotateY.Rotation).Angle;
    168195      this.startPos = e.GetPosition((IInputElement)this);
    169196      this.mouseDown = true;
     
    302329      mesh.Positions.Add(new Point3D(x + thickness, y + height, z + depth));
    303330
    304       AddPlane(mesh, 0, 4, 6, 2);
    305       AddPlane(mesh, 0, 3, 5, 4);
    306 
    307       AddPlane(mesh, 4, 8, 10, 6);
    308       AddPlane(mesh, 4, 7, 9, 8);
    309 
    310       AddPlane(mesh, 8, 12, 14, 10);
    311       AddPlane(mesh, 8, 11, 13, 12);
    312 
    313       AddPlane(mesh, 0, 2, 14, 12);
    314       AddPlane(mesh, 0, 12, 15, 1);
    315 
    316       AddPlane(mesh, 0, 1, 17, 16);
    317       AddPlane(mesh, 0, 16, 19, 3);
    318 
    319       AddPlane(mesh, 4, 20, 23, 7);
    320       AddPlane(mesh, 4, 5, 21, 20);
    321 
    322       AddPlane(mesh, 8, 24, 27, 11);
    323       AddPlane(mesh, 8, 9, 25, 24);
    324 
    325       AddPlane(mesh, 12, 28, 31, 15);
    326       AddPlane(mesh, 12, 13, 29, 28);
    327 
    328       AddPlane(mesh, 16, 18, 22, 20);
    329       AddPlane(mesh, 16, 20, 21, 19);
    330 
    331       AddPlane(mesh, 20, 22, 26, 24);
    332       AddPlane(mesh, 20, 24, 25, 23);
    333 
    334       AddPlane(mesh, 24, 28, 29, 27);
    335       AddPlane(mesh, 24, 26, 30, 28);
    336 
    337       AddPlane(mesh, 28, 30, 18, 16);
    338       AddPlane(mesh, 28, 16, 17, 31);
     331      // Point 0, non-edge
     332      mesh.Positions.Add(new Point3D(x + thickness, y, z + thickness));
     333      mesh.Positions.Add(new Point3D(x, y + thickness, z + thickness));
     334      mesh.Positions.Add(new Point3D(x + thickness, y + thickness, z));
     335
     336      // Point 1, non-edge
     337      mesh.Positions.Add(new Point3D(x + width, y + thickness, z + thickness));
     338      mesh.Positions.Add(new Point3D(x + width - thickness, y, z + thickness));
     339      mesh.Positions.Add(new Point3D(x + width - thickness, y + thickness, z));
     340
     341      // Point 2, non-edge
     342      mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z + thickness));
     343      mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z + thickness));
     344      mesh.Positions.Add(new Point3D(x + width - thickness, y + height - thickness, z));
     345
     346      // Point 3, non-edge
     347      mesh.Positions.Add(new Point3D(x, y + height - thickness, z + thickness));
     348      mesh.Positions.Add(new Point3D(x + thickness, y + height, z + thickness));
     349      mesh.Positions.Add(new Point3D(x + thickness, y + height - thickness, z));
     350
     351      // Point 4, non-edge
     352      mesh.Positions.Add(new Point3D(x + thickness, y, z + depth - thickness));
     353      mesh.Positions.Add(new Point3D(x, y + thickness, z + depth - thickness));
     354      mesh.Positions.Add(new Point3D(x + thickness, y + thickness, z + depth));
     355
     356      // Point 5, non-edge
     357      mesh.Positions.Add(new Point3D(x + width, y + thickness, z + depth - thickness));
     358      mesh.Positions.Add(new Point3D(x + width - thickness, y, z + depth - thickness));
     359      mesh.Positions.Add(new Point3D(x + width - thickness, y + thickness, z + depth));
     360
     361      // Point 6, non-edge
     362      mesh.Positions.Add(new Point3D(x + width - thickness, y + height, z + depth - thickness));
     363      mesh.Positions.Add(new Point3D(x + width, y + height - thickness, z + depth - thickness));
     364      mesh.Positions.Add(new Point3D(x + width - thickness, y + height - thickness, z + depth));
     365
     366      // Point 7, non-edge
     367      mesh.Positions.Add(new Point3D(x, y + height - thickness, z + depth - thickness));
     368      mesh.Positions.Add(new Point3D(x + thickness, y + height, z + depth - thickness));
     369      mesh.Positions.Add(new Point3D(x + thickness, y + height - thickness, z + depth));
     370
     371      // Draw the 24 corner plates
     372      AddPlane(mesh, 0, 1, 32, 2);
     373      AddPlane(mesh, 0, 2, 33, 3);
     374      AddPlane(mesh, 0, 3, 34, 1);
     375
     376      AddPlane(mesh, 4, 6, 36, 7);
     377      AddPlane(mesh, 4, 5, 35, 6);
     378      AddPlane(mesh, 4, 7, 37, 5);
     379
     380      AddPlane(mesh, 8, 10, 39, 11);
     381      AddPlane(mesh, 8, 9, 38, 10);
     382      AddPlane(mesh, 8, 11, 40, 9);
     383
     384      AddPlane(mesh, 12, 13, 41, 14);
     385      AddPlane(mesh, 12, 14, 42, 15);
     386      AddPlane(mesh, 12, 15, 43, 13);
     387
     388      AddPlane(mesh, 16, 18, 44, 17);
     389      AddPlane(mesh, 16, 19, 45, 18);
     390      AddPlane(mesh, 16, 17, 46, 19);
     391
     392      AddPlane(mesh, 20, 23, 48, 22);
     393      AddPlane(mesh, 20, 22, 47, 21);
     394      AddPlane(mesh, 20, 21, 49, 23);
     395
     396      AddPlane(mesh, 24, 27, 51, 26);
     397      AddPlane(mesh, 24, 26, 50, 25);
     398      AddPlane(mesh, 24, 25, 52, 27);
     399
     400      AddPlane(mesh, 28, 31, 54, 30);
     401      AddPlane(mesh, 28, 30, 53, 29);
     402      AddPlane(mesh, 28, 29, 55, 31);
     403
     404      // Draw the connecting plates
     405      // on the bottom
     406      AddPlane(mesh, 1, 7, 36, 32);
     407      AddPlane(mesh, 1, 34, 37, 7);
     408
     409      AddPlane(mesh, 5, 11, 39, 35);
     410      AddPlane(mesh, 5, 37, 40, 11);
     411
     412      AddPlane(mesh, 9, 15, 42, 38);
     413      AddPlane(mesh, 9, 40, 43, 15);
     414
     415      AddPlane(mesh, 13, 3, 33, 41);
     416      AddPlane(mesh, 13, 43, 34, 3);
     417
     418      // between bottom and top
     419      AddPlane(mesh, 2, 32, 44, 18);
     420      AddPlane(mesh, 2, 18, 45, 33);
     421
     422      AddPlane(mesh, 6, 22, 48, 36);
     423      AddPlane(mesh, 6, 35, 47, 22);
     424
     425      AddPlane(mesh, 10, 26, 51, 39);
     426      AddPlane(mesh, 10, 38, 50, 26);
     427
     428      AddPlane(mesh, 14, 30, 54, 42);
     429      AddPlane(mesh, 14, 41, 53, 30);
     430
     431      // on the top
     432      AddPlane(mesh, 17, 44, 48, 23);
     433      AddPlane(mesh, 17, 23, 49, 46);
     434
     435      AddPlane(mesh, 21, 47, 51, 27);
     436      AddPlane(mesh, 21, 27, 52, 49);
     437
     438      AddPlane(mesh, 25, 50, 54, 31);
     439      AddPlane(mesh, 25, 31, 55, 52);
     440
     441      AddPlane(mesh, 29, 19, 46, 55);
     442      AddPlane(mesh, 29, 53, 45, 19);
    339443    }
    340444
Note: See TracChangeset for help on using the changeset viewer.