sig
  type point2d = float * float
  type point3d = float * float * float
  type vector2d = float * float
  type vector3d = float * float * float
  type angle = float
  module Angle :
    sig
      type t = AGeom.angle
      val pi : float
      val of_degrees : float -> AGeom.Angle.t
      val to_degrees : AGeom.Angle.t -> float
      val add : AGeom.Angle.t -> AGeom.Angle.t -> AGeom.Angle.t
      val sub : AGeom.Angle.t -> AGeom.Angle.t -> AGeom.Angle.t
      val mul : AGeom.Angle.t -> float -> AGeom.Angle.t
      val div : AGeom.Angle.t -> float -> AGeom.Angle.t
      val rand : ?max:AGeom.Angle.t -> unit -> AGeom.Angle.t
      val srand :
        Random.State.t -> ?max:AGeom.Angle.t -> unit -> AGeom.Angle.t
      val mean : AGeom.Angle.t list -> AGeom.Angle.t
      module Infix :
        sig
          val ( + ) : AGeom.Angle.t -> AGeom.Angle.t -> AGeom.Angle.t
          val ( - ) : AGeom.Angle.t -> AGeom.Angle.t -> AGeom.Angle.t
          val ( * ) : AGeom.Angle.t -> float -> AGeom.Angle.t
          val ( / ) : AGeom.Angle.t -> float -> AGeom.Angle.t
          val ( ?. ) : ?max:AGeom.Angle.t -> unit -> AGeom.Angle.t
        end
    end
  module Point2d :
    sig
      type t = AGeom.point2d
      val of_point3d : AGeom.point3d -> AGeom.Point2d.t
      val distance : AGeom.Point2d.t -> AGeom.Point2d.t -> float
      val midpoint : AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Point2d.t
      val dot : AGeom.Point2d.t -> AGeom.Point2d.t -> float
      val rand : AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Point2d.t
      val srand :
        Random.State.t ->
        AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Point2d.t
      val to_string : AGeom.Point2d.t -> string
      val of_string : string -> AGeom.Point2d.t
      module Infix :
        sig
          val ( -|- ) : AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Point2d.t
          val ( <=> ) : AGeom.Point2d.t -> AGeom.Point2d.t -> float
          val ( ?. ) : AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Point2d.t
        end
    end
  module Point3d :
    sig
      type t = AGeom.point3d
      val of_point2d : ?z:float -> AGeom.point2d -> AGeom.Point3d.t
      val distance : AGeom.Point3d.t -> AGeom.Point3d.t -> float
      val midpoint : AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Point3d.t
      val rand : AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Point3d.t
      val srand :
        Random.State.t ->
        AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Point3d.t
      val to_string : AGeom.Point3d.t -> string
      val of_string : string -> AGeom.Point3d.t
      module Infix :
        sig
          val ( -|- ) : AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Point3d.t
          val ( <=> ) : AGeom.Point3d.t -> AGeom.Point3d.t -> float
          val ( ?. ) : AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Point3d.t
        end
    end
  module Vector2d :
    sig
      type t = AGeom.vector2d
      val of_points : AGeom.Point2d.t -> AGeom.Point2d.t -> AGeom.Vector2d.t
      val add : AGeom.Vector2d.t -> AGeom.Vector2d.t -> AGeom.Vector2d.t
      val sub : AGeom.Vector2d.t -> AGeom.Vector2d.t -> AGeom.Vector2d.t
      val mul : AGeom.Vector2d.t -> float -> AGeom.Vector2d.t
      val div : AGeom.Vector2d.t -> float -> AGeom.Vector2d.t
      val dot : AGeom.Vector2d.t -> AGeom.Vector2d.t -> float
      val length : AGeom.Vector2d.t -> float
      val normalise : AGeom.Vector2d.t -> AGeom.Vector2d.t
      val angle : AGeom.Vector2d.t -> AGeom.Angle.t
      val cross : AGeom.Vector2d.t -> AGeom.Vector2d.t -> float
      val rot90 : AGeom.Vector2d.t -> AGeom.Vector2d.t
      val rot90neg : AGeom.Vector2d.t -> AGeom.Vector2d.t
      val get_line_intersection :
        seg1:AGeom.Vector2d.t * AGeom.Vector2d.t ->
        seg2:AGeom.Vector2d.t * AGeom.Vector2d.t -> AGeom.Vector2d.t option
      val rand : float * float -> AGeom.Vector2d.t
      val srand : Random.State.t -> float * float -> AGeom.Vector2d.t
      val to_string : AGeom.Vector2d.t -> string
      val of_string : string -> AGeom.Vector2d.t
      module Infix :
        sig
          val ( + ) :
            AGeom.Vector2d.t -> AGeom.Vector2d.t -> AGeom.Vector2d.t
          val ( - ) :
            AGeom.Vector2d.t -> AGeom.Vector2d.t -> AGeom.Vector2d.t
          val ( * ) : AGeom.Vector2d.t -> float -> AGeom.Vector2d.t
          val ( / ) : AGeom.Vector2d.t -> float -> AGeom.Vector2d.t
          val ( !. ) : AGeom.Vector2d.t -> AGeom.Vector2d.t -> float
          val ( ~. ) : AGeom.Vector2d.t -> AGeom.Vector2d.t
          val ( ?. ) : float * float -> AGeom.Vector2d.t
        end
    end
  module Vector3d :
    sig
      type t = AGeom.vector3d
      val of_points : AGeom.Point3d.t -> AGeom.Point3d.t -> AGeom.Vector3d.t
      val add : AGeom.Vector3d.t -> AGeom.Vector3d.t -> AGeom.Vector3d.t
      val sub : AGeom.Vector3d.t -> AGeom.Vector3d.t -> AGeom.Vector3d.t
      val mul : AGeom.Vector3d.t -> float -> AGeom.Vector3d.t
      val div : AGeom.Vector3d.t -> float -> AGeom.Vector3d.t
      val dot : AGeom.Vector3d.t -> AGeom.Vector3d.t -> float
      val length : AGeom.Vector3d.t -> float
      val normalise : AGeom.Vector3d.t -> AGeom.Vector3d.t
      val cross : AGeom.Vector3d.t -> AGeom.Vector3d.t -> AGeom.Vector3d.t
      val rand : float * float * float -> AGeom.Vector3d.t
      val srand : Random.State.t -> float * float * float -> AGeom.Vector3d.t
      val to_string : AGeom.Vector3d.t -> string
      val of_string : string -> AGeom.Vector3d.t
      module Infix :
        sig
          val ( + ) :
            AGeom.Vector3d.t -> AGeom.Vector3d.t -> AGeom.Vector3d.t
          val ( - ) :
            AGeom.Vector3d.t -> AGeom.Vector3d.t -> AGeom.Vector3d.t
          val ( * ) : AGeom.Vector3d.t -> float -> AGeom.Vector3d.t
          val ( / ) : AGeom.Vector3d.t -> float -> AGeom.Vector3d.t
          val ( !. ) : AGeom.Vector3d.t -> AGeom.Vector3d.t -> float
          val ( ~. ) : AGeom.Vector3d.t -> AGeom.Vector3d.t
          val ( ?. ) : float * float * float -> AGeom.Vector3d.t
        end
    end
  module Quaternion :
    sig
      type t = float * float * float * float
      val q : float -> float -> float -> float -> AGeom.Quaternion.t
      val real : AGeom.Quaternion.t -> float
      val imag : AGeom.Quaternion.t -> float * float * float
      val of_scalar : float -> AGeom.Quaternion.t
      val to_list : AGeom.Quaternion.t -> float list
      val of_list : float list -> AGeom.Quaternion.t
      val add :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val sub :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val div :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val mul :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val addr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
      val radd : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val rsub : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val subr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
      val rmul : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val mulr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
      val norm : AGeom.Quaternion.t -> float
      val conj : AGeom.Quaternion.t -> AGeom.Quaternion.t
      val neg : AGeom.Quaternion.t -> AGeom.Quaternion.t
      val unit : AGeom.Quaternion.t -> AGeom.Quaternion.t
      val reciprocal : AGeom.Quaternion.t -> AGeom.Quaternion.t
      val length : AGeom.Quaternion.t -> float
      val to_string : AGeom.Quaternion.t -> string
      val of_string : string -> AGeom.Quaternion.t
      module Infix :
        sig
          val ( + ) :
            AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
          val ( - ) :
            AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
          val ( * ) :
            AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
          val ( / ) :
            AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
          val ( ~. ) : AGeom.Quaternion.t -> AGeom.Quaternion.t
          val ( |. ) : AGeom.Quaternion.t -> float
        end
    end
  module Curves2d :
    sig
      module Bezier :
        sig
          module Linear :
            sig
              val pnt :
                float -> AGeom.Point2d.t * AGeom.Point2d.t -> AGeom.Point2d.t
              val drv :
                float ->
                AGeom.Point2d.t * AGeom.Point2d.t -> AGeom.Vector2d.t
              val rand :
                AGeom.Point2d.t ->
                AGeom.Point2d.t -> AGeom.Point2d.t * AGeom.Point2d.t
              val srand :
                Random.State.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t -> AGeom.Point2d.t * AGeom.Point2d.t
            end
          module Quadratic :
            sig
              val pnt :
                float ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t ->
                AGeom.Point2d.t
              val drv :
                float ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t ->
                AGeom.Vector2d.t
              val rand :
                AGeom.Point2d.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t
              val srand :
                Random.State.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t
            end
          module Cubic :
            sig
              val pnt :
                float ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t *
                AGeom.Point2d.t -> AGeom.Point2d.t
              val drv :
                float ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t *
                AGeom.Point2d.t -> AGeom.Vector2d.t
              val rand :
                AGeom.Point2d.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t *
                AGeom.Point2d.t
              val srand :
                Random.State.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t ->
                AGeom.Point2d.t * AGeom.Point2d.t * AGeom.Point2d.t *
                AGeom.Point2d.t
            end
        end
      module CubicHermiteSpline :
        sig
          val pnt :
            float ->
            p_pred:AGeom.Point2d.t ->
            p0:AGeom.Point2d.t ->
            p1:AGeom.Point2d.t ->
            p_succ:AGeom.Point2d.t -> float -> AGeom.Point2d.t
        end
    end
  module Curves3d :
    sig
      module Bezier :
        sig
          module Linear :
            sig
              val pnt :
                float -> AGeom.Point3d.t * AGeom.Point3d.t -> AGeom.Point3d.t
              val drv :
                float ->
                AGeom.Point3d.t * AGeom.Point3d.t -> AGeom.Vector3d.t
              val rand :
                AGeom.Point3d.t ->
                AGeom.Point3d.t -> AGeom.Point3d.t * AGeom.Point3d.t
              val srand :
                Random.State.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t -> AGeom.Point3d.t * AGeom.Point3d.t
            end
          module Quadratic :
            sig
              val pnt :
                float ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t ->
                AGeom.Point3d.t
              val drv :
                float ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t ->
                AGeom.Vector3d.t
              val rand :
                AGeom.Point3d.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t
              val srand :
                Random.State.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t
            end
          module Cubic :
            sig
              val pnt :
                float ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t *
                AGeom.Point3d.t -> AGeom.Point3d.t
              val drv :
                float ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t *
                AGeom.Point3d.t -> AGeom.Vector3d.t
              val rand :
                AGeom.Point3d.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t *
                AGeom.Point3d.t
              val srand :
                Random.State.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t ->
                AGeom.Point3d.t * AGeom.Point3d.t * AGeom.Point3d.t *
                AGeom.Point3d.t
            end
        end
      module CubicHermiteSpline :
        sig
          val pnt :
            float ->
            p_pred:AGeom.Point3d.t ->
            p0:AGeom.Point3d.t ->
            p1:AGeom.Point3d.t ->
            p_succ:AGeom.Point3d.t -> float -> AGeom.Point3d.t
        end
    end
end