public int Compare(PartialHull hull, Event edge) { var d = 0; if (hull.A.x < edge.A.x) { d = Sign(Robust.Orientation(hull.A, hull.B, edge.A)); } else { d = Sign(Robust.Orientation(edge.B, edge.A, hull.A)); } if (d != 0) { return(d); } if (edge.B.x < hull.B.x) { d = Sign(Robust.Orientation(hull.A, hull.B, edge.B)); } else { d = Sign(Robust.Orientation(edge.B, edge.A, hull.B)); } if (d != 0) { return(d); } return(hull.Index - edge.Index); }
//This is used to compare events for the sweep line procedure // Points are: // 1. sorted lexicographically // 2. sorted by type (point < end < start) // 3. segments sorted by winding order // 4. sorted by index public int CompareTo(Event b) { var d = 0; d = Sign(A.x - b.A.x); if (d != 0) { return(d); } d = Sign(A.y - b.A.y); if (d != 0) { return(d); } d = Type - b.Type; if (d != 0) { return(d); } if (Type != EventType.Point) { d = Sign(Robust.Orientation(A, B, b.B)); if (d != 0) { return(d); } } return(Index - b.Index); }
private void AddPoint(List <int> cells, WorkBuffer <PartialHull> hulls, List <Vector3> points, Vector2 p, int idx) { var lo = BinarySearch.LT(hulls.Data, p, TestPoint.Default, 0, hulls.UsedSize - 1); var hi = BinarySearch.GT(hulls.Data, p, TestPoint.Default, 0, hulls.UsedSize - 1); for (var i = lo; i < hi; ++i) { var hull = hulls.Data[i]; //Insert p into lower hull { var lowerIds = hull.LowerIds; var m = lowerIds.UsedSize; var lowerIdsData = lowerIds.Data; while (m > 1 && Robust.Orientation(points[lowerIdsData[m - 2]], points[lowerIdsData[m - 1]], p) > 0f) { cells.Add(lowerIdsData[m - 1]); cells.Add(lowerIdsData[m - 2]); cells.Add(idx); m -= 1; } if (m < lowerIds.UsedSize) { lowerIds.RemoveLast(lowerIds.UsedSize - m); } lowerIds.Push(ref idx); } //Insert p into upper hull { var upperIds = hull.UpperIds; var m = upperIds.UsedSize; var upperIdsData = upperIds.Data; while (m > 1 && Robust.Orientation(points[upperIdsData[m - 2]], points[upperIdsData[m - 1]], p) < 0f) { cells.Add(upperIdsData[m - 2]); cells.Add(upperIdsData[m - 1]); cells.Add(idx); m -= 1; } if (m < upperIds.UsedSize) { upperIds.RemoveLast(upperIds.UsedSize - m); } upperIds.Push(ref idx); } } if (Verbose) { Debug.Log("Add"); DumpHulls(hulls); hulls.Dump(); } }
public void Orientation() { Assert.IsTrue(Robust.Orientation( new Vector2(0.1f, 0.1f), new Vector2(0.1f, 0.1f), new Vector2(0.3f, 0.7f) ) == 0f); Assert.IsTrue(Robust.Orientation( new Vector2(0f, 0f), new Vector2(-1e-32f, 0f), new Vector2(0f, 1f) ) > 0f); Assert.IsTrue(Robust.Orientation( new Vector2(0f, 0f), new Vector2(1e-32f, 1e-32f), new Vector2(1f, 1f) ) == 0f); Assert.IsTrue(Robust.Orientation( new Vector2(0f, 0f), new Vector2(1e-32f, 0f), new Vector2(0f, 1f) ) < 0f); var x = 1e-32f; for (var i = 0; i < 32; ++i) { Assert.IsTrue(Robust.Orientation( new Vector2(-x, 0f), new Vector2(0f, 1f), new Vector2(x, 0f) ) > 0f); Assert.IsTrue(Robust.Orientation( new Vector2(-x, 0f), new Vector2(0f, 0f), new Vector2(x, 0f) ) == 0f); Assert.IsTrue(Robust.Orientation( new Vector2(-x, 0f), new Vector2(0f, -1f), new Vector2(x, 0f) ) < 0f, "x=" + x); Assert.IsTrue(Robust.Orientation( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(x, x) ) < 0f, "x=" + x); x *= 10f; } }
public int Compare(PartialHull hull, Vector2 p) { return(Sign(Robust.Orientation(hull.A, hull.B, p))); }