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); }
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); }
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); }