GAQ      !"#$%&'()*+,-./0123456789 : ; < = > ? @ A B C D E F G H I J K L M N O P Safe4Modells data that has an angle and can be rotated. xAn object can return the orientation in space. If the object returns its orientation it should hold the following law:kfromMaybe True $ (==) <$> angle (r `rotate` x) <*> ((subtract pi).((`mod'` (2*pi)).(+pi).(+r)) <$> angle x)3Also angle should never return a value bigger than Q and smaller than `- pi`>fromMaybe True (fmap (\a -> a >= (- pi) && a <= pi) (angle x))The default implementation is angle _ = Nothing )Should rotate an object by a given angle.None35pThis data type modells the the characteristics of vectors in 2 dimensional space. You should construct it via . !Return the magnitude of a vector.RImplementing the S type class allows us to add and subtract vectors. Multiplication is implemented in terms of complex number multiplication. If you want to multiply using the dot or cross products use the appropriate functions from this package.T UVWXRYZ  T UVWXRYZNone7 gThe Distance between objects that have no volume, like points, should satisfy the triangle inequality.     None<This type class modells data that can be scaled by a factor.-A triangle is simply a tuple of three points.5This function defines the dot product of two vectors.7This function defined the cross product of two vectors.!Calculate the area of a triangle.iDetermin whether a point is in a triangle. A point being on the edge is considered inside the triangle.)Normalizes a scaleable point to length 1. [\   [\NoneNone3457 4Modells a finite line stretching between two points.(We expect the two points to be different"This type modells a infinite line. DTwo lines are almost equal if their ending points are almost equal.! Translate a  by a fiven vector"This ]$ instance should only produce valid s.#2Two lines are equal if their end points are equal.FinLine a b == FinLine b a$#Translate a line by a given vector.%Two lines are equal when they have the same root and the same slope. If the two lines do not have a root, that means that the lines are parallel to the x-axis. In this case we compare their y-value.&This ]$ instance should only produce valid s.' is a ^A where the function is mapped over both points which define the . !"#$%&''&%$#"!   !"#$%&'None(kConstruct an infinit line by specifiying two points. We won't get a line when the given points are equal.)VGet a function describing the line. We won't get a function if the line is vertical.*eCheck if two lines are paralllel to each other. This function assumes lines parallel to themselves.+jCalculate the slope of a line. We won't get a value for the slope if, and only if, the line is vertical.,}Calculate the point where a line meets the x-axis. We won't get a value if, and only if the line is parallel to the x-axis.-.Calculate the point where two lines intersect...mkFinLine returns a valid finite line, if any./ Get the length of a finite line.()*+,-./ ()*+,-./ ()*+,-./()*+,-./None3457 01234567801 018765432012345678 None3457N[AA3 describes geometric shapes in the euklidean plain.D<A Polygon is meant to describe a convex 2-dimensional shape.EThe point (first argument) should be inside the polygon, otherwise weird stuff will happen. Also you must not specify the same vector (second argument) twice.K;Calculate the convex hull of an arbitrary number of points.59:;<=>?@ABCDEFGHIJKLlength of one sidelength of the other sideM_`abcdefghijklmnopqrstuvwxyz{|}~9:;<=>?@ABCDEFGHIJKLMFGHIJDEKLABC;<=>?@9:M+9:;<=>?@ABCDEFGHIJKLM_`abcdefghijklmnopqrstuvwxyz{|}~ NoneNOP ;<=>?@ANOP A;<=>?@NOPNOP None, ()*+,-./01;<=>?@ANOP   !"#$%%&&'()*+,-./0123456789:;<=>?@A B B C D E F G H I J K L L M M N O P Q R S T U VWXYZW[\]^_`abcdefghWij k l m n o p q r s t u v w x y z { | } ~  geom2_JA6sM72xevN59w8SAdLuVZGeom2d.RotationGeom2d.Point.InternalGeom2d.Distance Geom2d.PointGeom2d.TranslateGeom2d.Line.Internal Geom2d.LineGeom2d.IntersectGeom2d.Shape.Internal Geom2d.ShapeGeom2dRotationanglerotatePointxy fromCoordsPoint' magnitudeDistancedistance$fDistanceV2V2$fDistancePoint'Point'ScalescaleTriangledotcrosstriAreapointInTriangle normalizescaleTo Translate translate$fTranslatePoint'FinLineInfLine$fDistancepFinLine$fDistanceFinLinep $fAEqFinLine$fTranslateFinLine$fArbitraryFinLine $fEqFinLine$fTranslateInfLine $fEqInfLine$fArbitraryInfLine$fFunctorInfLine mkInfLinelineFparallelsloperoot intersection mkFinLine lineLength Intersect intersect$fIntersectFinLineInfLine$fIntersectInfLineFinLine$fIntersectFinLineFinLine$fIntersectpInfLine$fIntersectInfLinep$fIntersectInfLineInfLine$fIntersectPoint'Point'BoxSpatialareaminXmaxXminYmaxYShape ShapeCircle ShapePolygonPolygonCircle mkCircleIntradiuscenter convexHull' rectangleInt spatialBoxcircle rectangle convexHullbase GHC.Floatpi$fNumpGHC.NumNum^$fRotationPoint'$fFunctorPoint' $fAEqPoint'$fArbitraryPoint' $fPointPoint' $fPointV2 $fScaleV2 $fScalePoint'Quick_BnZKeqxVf7FCbnejbqAnPLTest.QuickCheck.Arbitrary ArbitraryGHC.BaseFunctor$fIntersectBoxBox$fSpatialShape$fSpatialPolygon$fSpatialCircle$fTranslateShape$fArbitraryShape$fRotationShape$fIntersectFinLineShape$fIntersectShapeFinLine$fIntersectpShape$fIntersectShapep$fIntersectShapeShape$fTranslatePolygon$fRotationPolygon$fIntersectFinLinePolygon$fIntersectPolygonFinLine$fIntersectCirclePolygon$fIntersectPolygonPolygon$fIntersectPolygonCircle$fArbitraryPolygon$fIntersectPolygonp$fIntersectpPolygon$fTranslateCircle$fRotationCircle$fArbitraryCircle$fIntersectFinLineCircle$fIntersectCircleFinLine$fIntersectCircleCircle$fIntersectpCircle$fIntersectCirclep$fDistancepCircle$fDistanceCirclep