Add TileShape and Simplex convex-shape core
Ports geometry/planar/TileShape.java (the border-line-based containment, area, and centre-of-gravity logic) and Simplex.java (a convex region as the intersection of directed half-planes). Corners are exact intersections of consecutive border lines; point containment uses exact side_of. The remove_redundant_lines normalization — dropping lines that do not contribute and detecting emptiness — is ported line-for-line. Supporting additions: Line.compare_to/__lt__ (angular sort order), Line.fast_equals, Line.side_of_intersection, Line.translate (perpendicular offset), IntDirection.determinant, and IntBox.to_simplex. offset is approximate (rounded translated lines, as upstream); enlarge clips to the enlarged bounding box pending the IntOctagon port. Since there is no JVM oracle, tests assert invariants: corners lie exactly on their border lines (exact side_of == 0), IntBox -> Simplex preserves the region over a sampled grid, intersection is contained in both operands and a point is in the result iff in both, and get_instance normalization drops redundant lines and detects empty half-plane pairs.
This commit is contained in:
@@ -109,6 +109,10 @@ class IntDirection(Direction):
|
||||
nx, ny = table[n]
|
||||
return IntDirection(nx, ny)
|
||||
|
||||
def determinant(self, other: IntDirection) -> int:
|
||||
"""Exact determinant of the two direction vectors."""
|
||||
return self.x * other.y - self.y * other.x
|
||||
|
||||
def compare_to(self, other: Direction) -> int:
|
||||
"""Angular comparison with the positive x-axis (exact).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user