import { mod } from '@mathigon/fermat' ; import { Line } from './line' ; import { Point } from './point' ; export type TransformMatrix = [ [ number , number , number ] , [ number , number , number ] ] ; export type SimplePoint = { x : number ; y : number ; } ; export interface GeoElement { type : string ; transform ( matrix ) : GeoElement ; rotate ( angle , center ? ) : GeoElement ; reflect ( l ) : GeoElement ; scale ( sx , sy ? ) : GeoElement ; shift ( x , y ? ) : GeoElement ; translate ( p ) : GeoElement ; equals ( other , tolerance ? , oriented ? ) : boolean ; } export interface GeoShape extends GeoElement { project ( p ) : Point ; contains ( p , tolerance ? ) : boolean ; at ( t ) : Point ; rotate ( angle , center ? ) : GeoShape ; reflect ( l ) : GeoShape ; scale ( sx , sy ? ) : GeoShape ; shift ( x , y ? ) : GeoShape ; translate ( p ) : GeoShape ; } export const TWO_PI = 2 * Math . PI ; export function rad ( p , c ? ) { const a = Math . atan2 ( p . y - ( c ? c . y : 0 ) , p . x - ( c ? c . x : 0 ) ) ; return mod ( a , TWO_PI ) ; }