with Ada.Containers.Vectors; with WL.Numerics.Generic_Trigonometry; generic type Real is digits <>; package WL.Numerics.Generic_Geometry is package Trigonometry is new WL.Numerics.Generic_Trigonometry (Real); subtype Unit_Real is Real range 0.0 .. 1.0; subtype Signed_Unit_Real is Real range -1.0 .. 1.0; subtype Non_Negative_Real is Real range 0.0 .. Real'Last; type Point_Type is record X, Y : Real; end record; function Distance (P1, P2 : Point_Type) return Non_Negative_Real; function Image (Point : Point_Type) return String; package Point_Vectors is new Ada.Containers.Vectors (Positive, Point_Type); function Convex_Hull (Container : Point_Vectors.Vector) return Point_Vectors.Vector; type Line_Segment is record A, B : Point_Type; end record; function Image (Line : Line_Segment) return String; function Length (Line : Line_Segment) return Non_Negative_Real; function Intersects (Line_1, Line_2 : Line_Segment) return Boolean; function Parallel (Line_1, Line_2 : Line_Segment) return Boolean; function Point_On_Segment (Point : Point_Type; Segment : Line_Segment) return Boolean; function Closest_Point_On_Segment (Point : Point_Type; Segment : Line_Segment) return Point_Type; function Point_Angle (From, To : Point_Type) return Trigonometry.Angle; function Angle_Between (Angle_1, Angle_2 : Trigonometry.Angle) return Trigonometry.Angle; function Angle_Between (Line_1, Line_2 : Line_Segment) return Trigonometry.Angle; function Intersection (Line_1, Line_2 : Line_Segment) return Point_Type with Pre => Intersects (Line_1, Line_2); function Rotate (Point : Point_Type; About : Point_Type; Angle : Trigonometry.Angle) return Point_Type; function Rotate (Segment : Line_Segment; About : Point_Type; Angle : Trigonometry.Angle) return Line_Segment is (Rotate (Segment.A, About, Angle), Rotate (Segment.B, About, Angle)); end WL.Numerics.Generic_Geometry;