예제 #1
0
		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);
		}
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
		/// <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 ();
		}
예제 #4
0
 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);
         }
     }
 }
예제 #5
0
 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);
         }
     }
 }
예제 #6
0
        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;
        }