public SegmentedStrokes AboveAverageSegments()
        {
            bool performAverage = false;

            if (!performAverage)
            {
                return(this);
            }

            Hashtable scores      = new Hashtable();
            int       accumulator = 0;

            foreach (SegmentOffset offset in this.segments.Keys)
            {
                StrokeCollection strokeCol = (StrokeCollection)this.segments[offset];
                int segmentScore           = strokeCol.strokes.Count;

                accumulator += segmentScore;

                ArrayList list = null;
                if (scores.ContainsKey(segmentScore))
                {
                    list = (ArrayList)scores[segmentScore];
                }
                else
                {
                    list = new ArrayList();
                    scores[segmentScore] = list;
                }

                OffsetStrokesPair pair = new OffsetStrokesPair();
                pair.offset           = offset;
                pair.strokeCollection = strokeCol;
                list.Add(pair);
            }

            // Determine the average across all segments
            double average = 0.0;

            if (this.segments.Keys.Count > 0)
            {
                average = accumulator / this.segments.Keys.Count;
            }

            SegmentedStrokes result = new SegmentedStrokes(this.segWidth, this.segHeight, this.Width, this.Height);

            foreach (int score in scores.Keys)
            {
                if (score > (average / 2.0))
                {
                    ArrayList list = (ArrayList)scores[score];
                    foreach (OffsetStrokesPair pair in list)
                    {
                        result.AddSegment(pair.strokeCollection, pair.offset);
                    }
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        public Bitmap Compose()
        {
            Bitmap strokeBitmap = new Bitmap(Properties.Resources.brush1);

            int counter = 1;
            //int totalTasks = resizedImages.Count * 3 + 1;
            //StatusReporter.Instance.SetTotalTasks(totalTasks);
            int taskCounter = 1;

            DateTime start = DateTime.Now;

            SegmentedStrokes finalRegion = new SegmentedStrokes(10, 10, this.paintingBitmap.Width, this.paintingBitmap.Height);

            ArrayList strokes = null;

            foreach (Bitmap image in resizedImages)
            {
                MomentsBasedPainter painter = new MomentsBasedPainter(15, strokeBitmap);
                strokes = painter.GenerateStrokes(image);

                SegmentedStrokes segStrokes  = new SegmentedStrokes(10, 10, image.Width, image.Height, strokes);
                SegmentedStrokes interesting = segStrokes.AboveAverageSegments();

                //Bitmap results = interesting.GenerateBitmap();
                //ImageTools.GenWorkingImage(results);
                //image.Save("downloaded-" + counter + ".jpg");
                //results.Save("average-" + counter + ".jpg");
                counter++;

                finalRegion.AttemptIncorporation(interesting);
            }

            ArrayList finalStrokes = finalRegion.UnifyStrokes();

            finalStrokes.Sort();
            Console.WriteLine("Final total strokes: " + finalStrokes.Count);

            IPainter p     = new MomentsBasedPainter(15, strokeBitmap);
            Bitmap   final = p.Render(finalStrokes, this.paintingBitmap);

            //ImageTools.GenWorkingImage(final);

            TimeSpan duration = DateTime.Now - start;

            final.Save("composition.jpg");

            Console.WriteLine("Composition completed in " + duration.TotalMilliseconds + "ms");

            return(final);
        }
        public void Incorporate(SegmentedStrokes toBeIncorporated, SegmentOffset absoluteOffset)
        {
            int randX = this.rand.Next(1, this.Width / 6);
            int randY = this.rand.Next(1, this.Height / 6);

            Point strokeOffset = new Point(randX + (absoluteOffset.xOffset * this.segWidth), randY + (absoluteOffset.yOffset * this.segHeight));

            foreach (SegmentOffset relativeOffset in toBeIncorporated.segments.Keys)
            {
                SegmentOffset    windowOffset = new SegmentOffset(absoluteOffset.xOffset + relativeOffset.xOffset, absoluteOffset.yOffset + relativeOffset.yOffset);
                StrokeCollection segment      = (StrokeCollection)toBeIncorporated.segments[relativeOffset];
                segment.filled       = true;
                segment.strokeOffset = strokeOffset;

                AddSegment(segment, windowOffset);
            }
        }
        public bool AttemptIncorporation(SegmentedStrokes toBeIncorporated)
        {
            for (int y = 0; y < this.MaxYOffset; y++)
            {
                for (int x = 0; x < this.MaxXOffset; x++)
                {
                    SegmentOffset offset = new SegmentOffset(x, y);

                    if (toBeIncorporated.FitsInto(this, offset))
                    {
                        this.Incorporate(toBeIncorporated, offset);

                        //System.Console.WriteLine("Region fits at location: " + offset.xOffset * toBeIncorporated.segWidth + ", " + offset.yOffset * toBeIncorporated.segHeight);

                        return(true);
                    }
                }
            }

            return(false);
        }
        public bool FitsInto(SegmentedStrokes destRegion, SegmentOffset destOffset)
        {
            // For every segment within this "source" region, check to see if
            // each can be placed in its relative location in the destRegion.
            foreach (SegmentOffset offset in this.segments.Keys)
            {
                SegmentOffset adjusted = new SegmentOffset(destOffset.xOffset + offset.xOffset, destOffset.yOffset + offset.yOffset);
                if (destRegion.segments.ContainsKey(adjusted))
                {
                    StrokeCollection segment = (StrokeCollection)destRegion.segments[adjusted];
                    if (segment.filled)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }