diff --git a/shared/src/main/scala/squants/motion/AngularVelocity.scala b/shared/src/main/scala/squants/motion/AngularVelocity.scala index 84dfedb6..5b28ff6e 100644 --- a/shared/src/main/scala/squants/motion/AngularVelocity.scala +++ b/shared/src/main/scala/squants/motion/AngularVelocity.scala @@ -9,7 +9,8 @@ package squants.motion import squants._ -import squants.space.{ Degrees, Gradians, Turns } +import squants.space.{Degrees, Gradians, Turns} +import squants.time.TimeDerivative /** * @author garyKeorkunian @@ -19,14 +20,17 @@ import squants.space.{ Degrees, Gradians, Turns } * */ final class AngularVelocity private (val value: Double, val unit: AngularVelocityUnit) - extends Quantity[AngularVelocity] { - // TODO - Make this a TimeDerivative of Angle + extends Quantity[AngularVelocity] with TimeDerivative[Angle] { def dimension = AngularVelocity def toRadiansPerSecond = to(RadiansPerSecond) def toDegreesPerSecond = to(DegreesPerSecond) def toGradsPerSecond = to(GradsPerSecond) def toTurnsPerSecond = to(TurnsPerSecond) + + protected[squants] def timeIntegrated: Angle = Radians(toRadiansPerSecond) + + protected[squants] def time: Time = Seconds(1) } object AngularVelocity extends Dimension[AngularVelocity] { diff --git a/shared/src/main/scala/squants/space/Angle.scala b/shared/src/main/scala/squants/space/Angle.scala index f04e6359..840324cc 100644 --- a/shared/src/main/scala/squants/space/Angle.scala +++ b/shared/src/main/scala/squants/space/Angle.scala @@ -9,7 +9,8 @@ package squants.space import squants._ -import squants.time.Time +import squants.motion.{AngularVelocity, RadiansPerSecond} +import squants.time.{Time, TimeIntegral} /** * @author garyKeorkunian @@ -18,7 +19,7 @@ import squants.time.Time * @param value value in [[squants.space.Radians]] */ final class Angle private (val value: Double, val unit: AngleUnit) - extends Quantity[Angle] { + extends Quantity[Angle] with TimeIntegral[AngularVelocity] { def dimension = Angle @@ -34,6 +35,10 @@ final class Angle private (val value: Double, val unit: AngleUnit) def tan = math.tan(toRadians) def asin = math.asin(toRadians) def acos = math.acos(toRadians) + + protected def timeDerived: AngularVelocity = RadiansPerSecond(toRadians) + + override protected def time: Time = Seconds(1) } object Angle extends Dimension[Angle] { diff --git a/shared/src/test/scala/squants/motion/AngularVelocitySpec.scala b/shared/src/test/scala/squants/motion/AngularVelocitySpec.scala index 634d3e61..f3e536c1 100644 --- a/shared/src/test/scala/squants/motion/AngularVelocitySpec.scala +++ b/shared/src/test/scala/squants/motion/AngularVelocitySpec.scala @@ -12,6 +12,7 @@ import org.scalatest.{ Matchers, FlatSpec } import scala.language.postfixOps import squants.space.Radians import squants.QuantityParseException +import squants.time.Seconds /** * @author garyKeorkunian @@ -53,6 +54,10 @@ class AngularVelocitySpec extends FlatSpec with Matchers { TurnsPerSecond(1).toString(TurnsPerSecond) should be("1.0 turns/s") } + it should "return Angle when multiplied by Time" in { + RadiansPerSecond(1) * Seconds(1) should be(Radians(1)) + } + behavior of "AngularVelocityConversions" it should "provide aliases for single unit values" in { diff --git a/shared/src/test/scala/squants/space/AngleSpec.scala b/shared/src/test/scala/squants/space/AngleSpec.scala index b50342a6..0d1e439e 100644 --- a/shared/src/test/scala/squants/space/AngleSpec.scala +++ b/shared/src/test/scala/squants/space/AngleSpec.scala @@ -10,6 +10,8 @@ package squants.space import org.scalatest.{ FlatSpec, Matchers } import squants.QuantityParseException +import squants.motion.RadiansPerSecond +import squants.time.Seconds /** * @author garyKeorkunian @@ -75,6 +77,14 @@ class AngleSpec extends FlatSpec with Matchers { Radians(1).asin should be(math.asin(1)) } + it should "return AngularVelocity when divided by Time" in { + Radians(1) / Seconds(1) should be(RadiansPerSecond(1)) + } + + it should "return Time when divided by AngularVelocity" in { + Radians(1) / RadiansPerSecond(1) should be(Seconds(1)) + } + behavior of "AngleConversion" it should "provide aliases for single unit values" in { diff --git a/shared/src/test/scala/squants/space/SpaceChecks.scala b/shared/src/test/scala/squants/space/SpaceChecks.scala index 472691cd..e7a6bb96 100644 --- a/shared/src/test/scala/squants/space/SpaceChecks.scala +++ b/shared/src/test/scala/squants/space/SpaceChecks.scala @@ -11,7 +11,7 @@ package squants.space import org.scalacheck.Prop._ import org.scalacheck.Properties import squants.QuantityChecks -import squants.motion.CubicMetersPerSecond +import squants.motion.{CubicMetersPerSecond, RadiansPerSecond} import squants.time.Seconds /** @@ -22,6 +22,7 @@ import squants.time.Seconds object SpaceChecks extends Properties("Space") with QuantityChecks { implicit val tolVfr = CubicMetersPerSecond(tol) + implicit val tolAngularVelocity = RadiansPerSecond(tol) property("Area = Length * Length") = forAll(posNum, posNum) { (length1: TestData, length2: TestData) ⇒ SquareMeters(length1 * length2) == Meters(length1) * Meters(length2) && @@ -41,4 +42,11 @@ object SpaceChecks extends Properties("Space") with QuantityChecks { Seconds(time) =~ CubicMeters(vfr * time) / CubicMetersPerSecond(vfr) && CubicMetersPerSecond(vfr) =~ CubicMeters(vfr * time) / Seconds(time) } + + property("Angle = AngularVelocity * Time") = forAll(posNum, posNum) { (angularVel: TestData, time: TestData) ⇒ + Radians(angularVel * time) == RadiansPerSecond(angularVel) * Seconds(time) && + Radians(angularVel * time) == Seconds(time) * RadiansPerSecond(angularVel) && + Seconds(time) =~ Radians(angularVel * time) / RadiansPerSecond(angularVel) && + RadiansPerSecond(angularVel) =~ Radians(angularVel * time) / Seconds(time) + } }