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