module Physics ( RasenschachReal, -- One dimensional Time, DTime, Frequency, Mass, Length, Distance, Position, Speed, Velocity, Acceleration, Angle, Heading, Bearing, RotVel, RotAcc, -- Two dimensional Distance2, Position2, Velocity2, Acceleration2, -- Three dimensional Distance3, Position3, Velocity3, Acceleration3, -- Operations normalizeAngle, -- :: Angle -> Angle normalizeHeading, -- :: Heading -> Heading bearingToHeading, -- :: Bearing -> Heading headingToBearing, -- :: Heading -> Bearing -- Constants -- ground, -- border, -- pitchLength, -- pitchWidth, -- homeGoalCenter, -- awayGoalCenter, -- pitchCenter, -- maxheight, -- gravity, -- playerSpeedMax, -- playerAccMax, -- eps ) where import FRP.Yampa (Time, DTime) import FRP.Yampa.Miscellany (fMod) import FRP.Yampa.Geometry -- Many of the physical dimensions below are related to time, and variables -- of these types can thus be expected to occur in numerical expressions along -- with variables of type time. To facilitate things, they should thus share -- the same representation. Maybe it is a mistake that AFRP has fixed the -- type of Time (currently to Double)? -- Dimensionless type. Same representation as AFRP's Time. type RasenschachReal = Time ------------------------------------------------------------------------------ -- One-dimensional types ------------------------------------------------------------------------------ type Frequency = RasenschachReal -- [Hz] type Mass = RasenschachReal -- [kg] type Length = RasenschachReal -- [m] type Position = RasenschachReal -- [m] (absolute) type Distance = RasenschachReal -- [m] (relative) type Speed = RasenschachReal -- [m/s] (unsigned, speed = abs(velocity)) type Velocity = RasenschachReal -- [m/s] (signed) type Acceleration = RasenschachReal -- [m/s^2] type Angle = RasenschachReal -- [rad] (relative) type Heading = RasenschachReal -- [rad] (angle relative to x-axis = east) type Bearing = RasenschachReal -- [deg] (compass direction, 0 = N, 90 = E) type RotVel = RasenschachReal -- [rad/s] type RotAcc = RasenschachReal -- [rad/s^2] ------------------------------------------------------------------------------ -- Two-dimensional types ------------------------------------------------------------------------------ type Position2 = Point2 Position -- [m] (absolute) type Distance2 = Vector2 Distance -- [m] (relative) type Velocity2 = Vector2 Velocity -- [m/s] type Acceleration2 = Vector2 Acceleration -- [m/s^2] ------------------------------------------------------------------------------ -- Three-dimensional types ------------------------------------------------------------------------------ type Position3 = Point3 Position -- [m] (absolute) type Distance3 = Vector3 Distance -- [m] (relative) type Velocity3 = Vector3 Velocity -- [m/s] type Acceleration3 = Vector3 Acceleration -- [m/s^2] ------------------------------------------------------------------------------ -- Operations ------------------------------------------------------------------------------ -- The resulting angle is in the interval [-pi, pi). normalizeAngle :: Angle -> Angle normalizeAngle d = fMod (d + pi) (2 * pi) - pi -- The resulting heading is in the interval [-pi, pi). normalizeHeading :: Heading -> Heading normalizeHeading = normalizeAngle -- Bearings in degrees are understood as on a compass; i.e., north is 0, -- east is 90, south is 180, west is 270. -- Heading is understood as the angle (in radians) relative to the "x-axis" -- which is supposed to point East. -- The resulting heading is in the interval [-pi, pi). bearingToHeading :: Bearing -> Heading bearingToHeading b = (fMod (270 - b) 360 - 180) * pi / 180 -- The resulting bearing is in the interval [0, 360). headingToBearing :: Heading -> Bearing headingToBearing d = fMod (90 - d * 180 / pi) 360