public WarpPerspective(IEnumerable<PointD> destPoints, Rectangle srcRect) { if (destPoints == null || destPoints.Count() != 4) throw new ArgumentException("destPoints"); if (srcRect == null) throw new ArgumentNullException("srcRect"); _pntSrc[0].X = _pntSrc[2].X = srcRect.GetLeft(); _pntSrc[1].X = _pntSrc[3].X = srcRect.GetRight(); _pntSrc[0].Y = _pntSrc[1].Y = srcRect.GetTop(); _pntSrc[2].Y = _pntSrc[3].Y = srcRect.GetBottom(); PreCalc(destPoints.ToArray(), _pntSrc); }
protected unsafe override void AddSurfaceRectangleToHistogram(ImageSurface surface, Rectangle rect) { long[] histogramB = histogram[0]; long[] histogramG = histogram[1]; long[] histogramR = histogram[2]; for (int y = (int)rect.Y; y < rect.GetBottom (); ++y) { ColorBgra* ptr = surface.GetPointAddressUnchecked((int)rect.X, y); for (int x = (int)rect.X; x < rect.GetRight (); ++x) { ++histogramB[ptr->B]; ++histogramG[ptr->G]; ++histogramR[ptr->R]; ++ptr; } } }
/// <summary> /// Create a rectangular Selection from a Rectangle. /// </summary> /// <param name="r">The Rectangle.</param> public void CreateRectangleSelection(Rectangle r) { SelectionPolygons.Clear(); SelectionPolygons.Add (CreateRectanglePolygon (r)); Origin = new PointD (r.X, r.Y); End = new PointD (r.GetRight (), r.GetBottom ()); MarkDirty (); }
public void Set(Rectangle rect, bool newValue) { for (int y = (int)rect.Y; y < rect.GetBottom (); ++y) { for (int x = (int)rect.X; x < rect.GetRight (); ++x) { Set(x, y, newValue); } } }
public void Invert(Rectangle rect) { for (int y = (int)rect.Y; y < rect.GetBottom (); ++y) { for (int x = (int)rect.X; x < rect.GetRight (); ++x) { Invert(x, y); } } }
public static unsafe Point[][] PolygonSetFromStencil(IBitVector2D stencil, Rectangle bounds, int translateX, int translateY) { List<Point[]> polygons = new List<Point[]>(); if (!stencil.IsEmpty) { Point start = bounds.Location (); List<Point> pts = new List<Point>(); int count = 0; // find all islands while (true) { bool startFound = false; while (true) { if (stencil[start]) { startFound = true; break; } ++start.X; if (start.X >= bounds.GetRight ()) { ++start.Y; start.X = (int)bounds.X; if (start.Y >= bounds.GetBottom ()) { break; } } } if (!startFound) { break; } pts.Clear(); Point last = new Point(start.X, start.Y + 1); Point curr = new Point(start.X, start.Y); Point next = curr; Point left = new Point (); Point right = new Point (); // trace island outline while (true) { left.X = ((curr.X - last.X) + (curr.Y - last.Y) + 2) / 2 + curr.X - 1; left.Y = ((curr.Y - last.Y) - (curr.X - last.X) + 2) / 2 + curr.Y - 1; right.X = ((curr.X - last.X) - (curr.Y - last.Y) + 2) / 2 + curr.X - 1; right.Y = ((curr.Y - last.Y) + (curr.X - last.X) + 2) / 2 + curr.Y - 1; if (bounds.ContainsPoint(left.X, left.Y) && stencil[left]) { // go left next.X += curr.Y - last.Y; next.Y -= curr.X - last.X; } else if (bounds.ContainsPoint(right.X, right.Y) && stencil[right]) { // go straight next.X += curr.X - last.X; next.Y += curr.Y - last.Y; } else { // turn right next.X -= curr.Y - last.Y; next.Y += curr.X - last.X; } if (Math.Sign(next.X - curr.X) != Math.Sign(curr.X - last.X) || Math.Sign(next.Y - curr.Y) != Math.Sign(curr.Y - last.Y)) { pts.Add(curr); ++count; } last = curr; curr = next; if (next.X == start.X && next.Y == start.Y) { break; } } Point[] points = pts.ToArray(); Scanline[] scans = points.GetScans (); foreach (Scanline scan in scans) { stencil.Invert(scan); } points.TranslatePointsInPlace (translateX, translateY); polygons.Add(points); } } Point[][] returnVal = polygons.ToArray(); return returnVal; }