public List <BoundaryMove> CalcQuickHull(List <BoundaryMove> boundaries)
        {
            if (boundaries.Count < 3)
            {
                return(boundaries);
            }

            int minPoint = -1, maxPoint = -1;
            int minX = Int32.MaxValue;
            int maxX = Int32.MinValue;

            List <BoundaryMove> convexHull = new List <BoundaryMove>();

            for (int i = 0; i < boundaries.Count; i++)
            {
                if (boundaries[i].X < minX)
                {
                    minX     = boundaries[i].X;
                    minPoint = i;
                }

                if (boundaries[i].X > maxX)
                {
                    maxX     = boundaries[i].X;
                    maxPoint = i;
                }
            }

            BoundaryMove A = boundaries[minPoint];
            BoundaryMove B = boundaries[maxPoint];

            convexHull.Add(A);
            convexHull.Add(B);

            boundaries.Remove(A);
            boundaries.Remove(B);

            List <BoundaryMove> leftSet  = new List <BoundaryMove>();
            List <BoundaryMove> rightSet = new List <BoundaryMove>();

            for (int i = 0; i < boundaries.Count; i++)
            {
                BoundaryMove p = boundaries[i];
                if (pointLocation(A, B, p) == -1)
                {
                    leftSet.Add(p);
                }
                else
                {
                    rightSet.Add(p);
                }
            }

            hullSet(A, B, rightSet, convexHull);
            hullSet(B, A, leftSet, convexHull);

            return(convexHull);
        }
        public int distance(BoundaryMove A, BoundaryMove B, BoundaryMove C)
        {
            int ABx = B.X - A.X;
            int ABy = B.Y - A.Y;
            int num = ABx * (A.Y - C.Y) - ABy * (A.X - C.X);

            if (num < 0)
            {
                num = -num;
            }
            return(num);
        }
        //return if this veritical & horizontal component are equal to "obj"
        public override bool Equals(System.Object obj)
        {
            // If parameter is null return false.
            if (obj == null)
            {
                return(false);
            }

            BoundaryMove rhs = (BoundaryMove)obj;

            // Return true if the fields match:
            return((pixel.X == rhs.X) && (pixel.Y == rhs.Y));
        }
        public BoundaryMove Move(int val, AdvColor[,] pixels)
        {
            //figure out the direction to move - left or right never back or forward - forward is handled in calling function

            BoundaryMove pt2 = MoveRight();

            if (IsValueOnRight(pt2, val, pixels) && pixels[pt2.X, pt2.Y].G != val)
            {
                return(pt2);
            }

            pt2 = MoveLeft();
            return(pt2);
        }
Example #5
0
        public List <BoundaryMove> WalkShape(int start_i, int start_j, int shape_val)
        {
            //found the first pixel running face first into it scanning by line.  Backup one pixel and set the direction to north so the pixel is on our right
            BoundaryMove pt = new BoundaryMove(start_i, --start_j, Direction.eNorth);

            List <BoundaryMove> points = new List <BoundaryMove>();

            points.Add(pt);

            BoundaryMove pt2 = pt.MoveForward();

            while (true)
            {
                if (Equals(pt2, pt))
                {
                    break;
                }

                points.Add(pt2);

                while (IsValueOnRight(pt2, shape_val))
                {
                    BoundaryMove pt3 = pt2.MoveForward();
                    if (pixels[pt3.X, pt3.Y].G == shape_val)
                    {
                        break;
                    }

                    pt2 = pt3;
                    points.Add(pt2);

                    if (Equals(pt2, pt))
                    {
                        break;
                    }
                }

                if (Equals(pt2, pt))
                {
                    break;
                }

                pt2 = pt2.Move(shape_val, pixels);
            }

            return(points);
        }
Example #6
0
        public void OutlineHull(List <BoundaryMove> hull, AdvColor[,] new_pixels)
        {
            BresenhamLine line = new BresenhamLine(pixels.GetLength(1), pixels.GetLength(0));

            for (int i = 0; i < hull.Count; i++)
            {
                BoundaryMove p1 = hull[i];
                BoundaryMove p2;
                if (i == hull.Count - 1)
                {
                    p2 = hull[0];
                }
                else
                {
                    p2 = hull[i + 1];
                }

                line.DrawBresenhamLine(new_pixels, p1.X, p1.Y, p2.X, p2.Y, Color.White);
            }
        }
        public void hullSet(BoundaryMove A, BoundaryMove B, List <BoundaryMove> set, List <BoundaryMove> hull)
        {
            if (set.Count == 0)
            {
                return;
            }

            int insertPosition = hull.IndexOf(B);

            if (set.Count == 1)
            {
                BoundaryMove p = set[0];
                set.Remove(p);
                hull.Insert(insertPosition, p);
                return;
            }

            int dist          = Int32.MinValue;
            int furthestPoint = -1;

            for (int i = 0; i < set.Count; i++)
            {
                BoundaryMove p     = set[i];
                int          dist2 = distance(A, B, p);
                if (dist2 > dist)
                {
                    dist          = dist2;
                    furthestPoint = i;
                }
            }

            BoundaryMove P = set[furthestPoint];

            set.RemoveAt(furthestPoint);
            hull.Insert(insertPosition, P);

            // Determine who's to the left of AP
            List <BoundaryMove> leftSetAP = new List <BoundaryMove>();

            for (int i = 0; i < set.Count; i++)
            {
                BoundaryMove M = set[i];
                if (pointLocation(A, P, M) == 1)
                {
                    leftSetAP.Add(M);
                }
            }

            // Determine who's to the left of PB
            List <BoundaryMove> leftSetPB = new List <BoundaryMove>();

            for (int i = 0; i < set.Count; i++)
            {
                BoundaryMove M = set[i];
                if (pointLocation(P, B, M) == 1)
                {
                    leftSetPB.Add(M);
                }
            }

            hullSet(A, P, leftSetAP, hull);
            hullSet(P, B, leftSetPB, hull);
        }
        public int pointLocation(BoundaryMove A, BoundaryMove B, BoundaryMove P)
        {
            int cp1 = (B.X - A.X) * (P.Y - A.Y) - (B.Y - A.Y) * (P.X - A.X);

            return((cp1 > 0) ? 1 : -1);
        }
        private bool IsValueOnRight(BoundaryMove pt, int val, AdvColor[,] pixels)
        {
            BoundaryMove pt2 = pt.MoveRight();

            return(pt2.X >= 0 && pt2.Y >= 0 && pixels[pt2.X, pt2.Y].G == val);
        }