Exemplo n.º 1
0
        public bool FitsInto(SegmentedRegion destRegion, SegmentOffset destOffset, int acceptableCollisions)
        {
            int collisions = 0;

            // 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))
                {
                    ProcessingWindow segment = (ProcessingWindow)destRegion.segments[adjusted][0];
                    if (segment.filled)
                    {
                        if (++collisions >= acceptableCollisions)
                        {
                            return(false);
                        }
                    }
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        public void AddSegment(ProcessingWindow segment, SegmentOffset offset)
        {
            if (segment == null)
            {
                return;
            }

            if (!this.segments.ContainsKey(offset))
            {
                this.segments.Add(offset, new List <ProcessingWindow>());
            }

            this.segments[offset].Add(segment);

            this.MaxXOffset = System.Math.Max(this.MaxXOffset, offset.xOffset);
            this.MaxYOffset = System.Math.Max(this.MaxYOffset, offset.yOffset);
        }
        public Bitmap GenerateBitmap()
        {
            Bitmap bmp = new Bitmap(this.Width, this.Height);

            foreach (SegmentOffset offset in this.segments.Keys)
            {
                ProcessingWindow segment = (ProcessingWindow)this.segments[offset];
                int maxY  = segment.y + segment.Height;
                int maxX  = segment.x + segment.Width;
                int destX = offset.xOffset * this.segWidth;
                int destY = offset.yOffset * this.segHeight;
                for (int y = segment.y; y < maxY; y++, destY++)
                {
                    destX = offset.xOffset * this.segWidth;

                    for (int x = segment.x; x < maxX; x++, destX++)
                    {
                        bmp.SetPixel(destX, destY, segment.sourceImage.GetColor(x, y));
                    }
                }
            }

            return(bmp);
        }
Exemplo n.º 4
0
        public SegmentedRegion AboveAverageSegments()
        {
            Hashtable scores      = new Hashtable();
            int       accumulator = 0;

            foreach (SegmentOffset offset in this.segments.Keys)
            {
                ProcessingWindow segment = (ProcessingWindow)this.segments[offset][0];

                int maxY         = segment.y + segment.Height;
                int maxX         = segment.x + segment.Width;
                int segmentScore = 0;
                for (int y = segment.y; y < maxY; y++)
                {
                    for (int x = segment.x; x < maxX; x++)
                    {
                        //if (segment.sourceImage.data[y][x].R == 0)
                        if (segment.sourceImage.GetColor(x, y).R == 0)
                        {
                            segmentScore++;
                        }
                    }
                }

                accumulator += segmentScore;

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

                OffsetSegmentPair pair = new OffsetSegmentPair();
                pair.offset  = offset;
                pair.segment = segment;
                list.Add(pair);
            }

            // Determine the average across all segments
            double average = accumulator / this.segments.Keys.Count;

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

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

            return(result);
        }