private static void TestShapeTermsImpl(string testName, ShapeModel shapeModel, IEnumerable<VertexConstraints> vertexConstraints, IEnumerable<EdgeConstraints> edgeConstraints, Size imageSize)
        {
            ShapeConstraints constraintSet = ShapeConstraints.CreateFromConstraints(shapeModel.Structure, vertexConstraints, edgeConstraints);

            // Get CPU results
            Image2D<ObjectBackgroundTerm> shapeTermsCpu = new Image2D<ObjectBackgroundTerm>(imageSize.Width, imageSize.Height);
            CpuShapeTermsLowerBoundCalculator calculatorCpu = new CpuShapeTermsLowerBoundCalculator();
            calculatorCpu.CalculateShapeTerms(shapeModel, constraintSet, shapeTermsCpu);
            Image2D.SaveToFile(shapeTermsCpu, -1000, 1000, String.Format("./{0}_cpu.png", testName));

            // Get GPU results
            Image2D<ObjectBackgroundTerm> shapeTermsGpu = new Image2D<ObjectBackgroundTerm>(imageSize.Width, imageSize.Height);
            GpuShapeTermsLowerBoundCalculator calculatorGpu = new GpuShapeTermsLowerBoundCalculator();
            calculatorGpu.CalculateShapeTerms(shapeModel, constraintSet, shapeTermsGpu);
            Image2D.SaveToFile(shapeTermsGpu, -1000, 1000, String.Format("./{0}_gpu.png", testName));

            // Compare with CPU results
            for (int x = 0; x < imageSize.Width; ++x)
                for (int y = 0; y < imageSize.Height; ++y)
                {
                    Assert.AreEqual(shapeTermsCpu[x, y].ObjectTerm, shapeTermsGpu[x, y].ObjectTerm, 1e-2f);
                    Assert.AreEqual(shapeTermsCpu[x, y].BackgroundTerm, shapeTermsGpu[x, y].BackgroundTerm, 1e-2f);
                }
        }
 private Image CreateStatusImage(Shape shape)
 {
     return(this.DrawConstraintsOnTopOfImage(
                this.segmentedImage, 2, ShapeConstraints.CreateFromShape(shape), false, false, false, true));
 }
 private Image CreateStatusImage(
     ShapeConstraints shapeConstraints, bool drawVertexConstraints, bool drawMinEdgeWidth, bool drawMaxEdgeWidth, bool drawAverageEdgeWidth)
 {
     return(this.DrawConstraintsOnTopOfImage(
                this.segmentedImage, 2, shapeConstraints, drawVertexConstraints, drawMinEdgeWidth, drawMaxEdgeWidth, drawAverageEdgeWidth));
 }
        private Image DrawConstraintsOnTopOfImage(
            Image backgroundImage, float drawSizeRatio, ShapeConstraints shapeConstraints, bool drawVertexConstraints, bool drawMinEdgeWidth, bool drawMaxEdgeWidth, bool drawAverageEdgeWidth)
        {
            const float pointRadius = 4;
            const float lineWidth   = 2;

            Bitmap statusImage = new Bitmap((int)(backgroundImage.Width * drawSizeRatio), (int)(backgroundImage.Height * drawSizeRatio));

            using (Graphics graphics = Graphics.FromImage(statusImage))
            {
                graphics.DrawImage(backgroundImage, 0, 0, statusImage.Width, statusImage.Height);

                if (drawVertexConstraints)
                {
                    foreach (VertexConstraints vertexConstraint in shapeConstraints.VertexConstraints)
                    {
                        graphics.DrawRectangle(
                            new Pen(Color.Orange, lineWidth),
                            (float)vertexConstraint.MinCoord.X * drawSizeRatio,
                            (float)vertexConstraint.MinCoord.Y * drawSizeRatio,
                            (float)(vertexConstraint.MaxCoord.X - vertexConstraint.MinCoord.X) * drawSizeRatio,
                            (float)(vertexConstraint.MaxCoord.Y - vertexConstraint.MinCoord.Y) * drawSizeRatio);
                    }
                }

                foreach (VertexConstraints vertexConstraint in shapeConstraints.VertexConstraints)
                {
                    graphics.FillEllipse(
                        Brushes.Black,
                        (float)vertexConstraint.MiddleCoord.X * drawSizeRatio - pointRadius,
                        (float)vertexConstraint.MiddleCoord.Y * drawSizeRatio - pointRadius,
                        2 * pointRadius,
                        2 * pointRadius);
                }

                for (int i = 0; i < shapeConstraints.ShapeStructure.Edges.Count; ++i)
                {
                    ShapeEdge edge   = shapeConstraints.ShapeStructure.Edges[i];
                    Vector    point1 = shapeConstraints.VertexConstraints[edge.Index1].MiddleCoord * drawSizeRatio;
                    Vector    point2 = shapeConstraints.VertexConstraints[edge.Index2].MiddleCoord * drawSizeRatio;
                    graphics.DrawLine(new Pen(Color.Black, lineWidth), MathHelper.VecToPointF(point1), MathHelper.VecToPointF(point2));

                    if (drawMinEdgeWidth || drawMaxEdgeWidth || drawAverageEdgeWidth)
                    {
                        EdgeConstraints edgeConstraint = shapeConstraints.EdgeConstraints[i];
                        Vector          diff           = point2 - point1;
                        Vector          edgeNormal     = (new Vector(diff.Y, -diff.X)).GetNormalized();

                        if (drawMaxEdgeWidth)
                        {
                            DrawOrientedRectange(graphics, point1, point2, edgeNormal, (float)edgeConstraint.MaxWidth * drawSizeRatio, new Pen(Color.Cyan, lineWidth));
                        }
                        if (drawMinEdgeWidth)
                        {
                            DrawOrientedRectange(graphics, point1, point2, edgeNormal, (float)edgeConstraint.MinWidth * drawSizeRatio, new Pen(Color.Red, lineWidth));
                        }
                        if (drawAverageEdgeWidth)
                        {
                            DrawOrientedRectange(graphics, point1, point2, edgeNormal, (float)(edgeConstraint.MinWidth + edgeConstraint.MaxWidth) * drawSizeRatio * 0.5f, new Pen(Color.Blue, lineWidth));
                        }
                    }
                }
            }

            return(statusImage);
        }
 private void OnBranchAndBoundCompleted(object sender, BranchAndBoundCompletedEventArgs e)
 {
     this.bestConstraints = e.ResultConstraints;
 }
示例#6
0
        static void Main(string[] args)
        {
            if (args.Count() < 3)
            {
                Console.WriteLine("Arguments: <diagram_type> <number of images> <generated images path> ");
                Environment.Exit(1);
            }


            String diagram   = args[0].ToLower();
            int    numDiag   = Int32.Parse(args[1]);
            String directory = args[2];


            //specify diagram type here
            DiagramType diagramType;

            switch (diagram)
            {
            case "flowchart":
                diagramType = DiagramType.FlowChart;
                break;

            case "sequencediagram":
                diagramType = DiagramType.SequenceDiagram;
                break;

            case "statediagram":
                diagramType = DiagramType.StateDiagram;
                break;

            default:
                diagramType = DiagramType.FlowChart;
                break;
            }


            ImageLayout.ImageConstraints constraints = new ImageLayout.ImageConstraints();
            switch (diagramType)
            {
            case DiagramType.FlowChart:
                constraints.Width         = 299; constraints.Height = 299;
                constraints.AllowedShapes = new List <ShapeType>()
                {
                    ShapeType.Circle, ShapeType.Ellipse, ShapeType.Rectangle, ShapeType.Rhombus, ShapeType.Parallelogram
                };
                constraints.MandatoryShapes = new List <ShapeType>()
                {
                    ShapeType.Ellipse
                };
                constraints.SingleOccurrenceShapes = new List <ShapeType>()
                {
                    ShapeType.Ellipse
                };
                constraints.MaxShapes = 8; constraints.MinShapes = 3;

                constraints.ShapeConstraints.Add(ShapeType.Ellipse,
                                                 new ShapeConstraints()
                {
                    HasFixedLocation = true,
                    MinInDegree      = 0,
                    MaxInDegree      = 0,
                    MinOutDegree     = 1,
                    MaxOutDegree     = 1
                });

                var stopConstraints = new ShapeConstraints()
                {
                    PlacementConstraint = (row, col) => row > 0,
                    HasFixedLocation    = false,
                    MinInDegree         = 1,
                    MaxInDegree         = Int32.MaxValue,
                    MaxOutDegree        = 0,
                    MinOutDegree        = 0
                };

                constraints.ShapeConstraints.Add(ShapeType.Circle, stopConstraints);

                var processConstraints = new ShapeConstraints(stopConstraints);
                processConstraints.MaxInDegree  = 1;
                processConstraints.MinInDegree  = 1;
                processConstraints.MaxOutDegree = 1;
                processConstraints.MinOutDegree = 1;

                var conditionConstraints = new ShapeConstraints(stopConstraints);
                conditionConstraints.MaxInDegree  = 1;
                conditionConstraints.MaxOutDegree = 4;
                conditionConstraints.MinInDegree  = 1;
                conditionConstraints.MinOutDegree = 2;

                constraints.ShapeConstraints.Add(ShapeType.Rectangle, processConstraints);
                constraints.ShapeConstraints.Add(ShapeType.Parallelogram, processConstraints);
                constraints.ShapeConstraints.Add(ShapeType.Rhombus, conditionConstraints);
                break;

            case DiagramType.StateDiagram:
                constraints.Width         = 299; constraints.Height = 299;
                constraints.AllowedShapes = new List <ShapeType>()
                {
                    ShapeType.Circle, ShapeType.Ellipse, ShapeType.Rectangle
                };
                constraints.MaxShapes      = 4; constraints.MinShapes = 3;
                constraints.SameTypeShapes = true;

                var stateConstraints = new ShapeConstraints();
                stateConstraints.MaxInDegree  = 4;
                stateConstraints.MaxOutDegree = 4;
                stateConstraints.MinInDegree  = 1;
                stateConstraints.MinOutDegree = 1;

                constraints.ShapeConstraints.Add(ShapeType.Rectangle, stateConstraints);
                constraints.ShapeConstraints.Add(ShapeType.Circle, stateConstraints);
                constraints.ShapeConstraints.Add(ShapeType.Ellipse, stateConstraints);

                break;

            case DiagramType.SequenceDiagram:
                constraints.Width         = 299; constraints.Height = 299;
                constraints.AllowedShapes = new List <ShapeType>()
                {
                    ShapeType.Rectangle
                };
                constraints.MaxShapes      = 6; constraints.MinShapes = 3;
                constraints.SameTypeShapes = true;

                var objectConstraints = new ShapeConstraints();
                objectConstraints.MaxInDegree  = 4;
                objectConstraints.MaxOutDegree = 4;
                objectConstraints.MinInDegree  = 1;
                objectConstraints.MinOutDegree = 1;

                constraints.ShapeConstraints.Add(ShapeType.Rectangle, objectConstraints);
                break;
            }

            LogicalImageGenerator generator = new LogicalImageGenerator(constraints);
            int i = 1;

            if (diagramType == DiagramType.FlowChart || diagramType == DiagramType.StateDiagram)
            {
                foreach (var image in generator.GenerateImage(100))
                {
                    if (i > numDiag)
                    {
                        break;
                    }
                    Console.WriteLine($"Figure: {i}");
                    //printImage(image, constraints);
                    build_image(directory, image, constraints, i);
                    i++;
                }
            }
            else if (diagramType == DiagramType.SequenceDiagram)
            {
                foreach (var image in generator.GenerateImage(100))
                {
                    if (i > numDiag)
                    {
                        break;
                    }
                    Console.WriteLine($"Figure: {i}");
                    //printImage(image, constraints);
                    build_image_sd(directory, image, constraints, i);
                    i++;
                }
            }
        }