diff --git a/modules/core/shared/src/main/scala/lucuma/core/math/Angle.scala b/modules/core/shared/src/main/scala/lucuma/core/math/Angle.scala index 757c29b6e..98f5a7573 100644 --- a/modules/core/shared/src/main/scala/lucuma/core/math/Angle.scala +++ b/modules/core/shared/src/main/scala/lucuma/core/math/Angle.scala @@ -300,6 +300,20 @@ object Angle extends AngleOptics { def -(a: Angle): Angle = Angle.fromMicroarcseconds(toMicroarcseconds - a.toMicroarcseconds) + /** + * Scalar multiplication of this angle and `a`. Exact + * @group Operations + */ + def *(a: Long): Angle = + Angle.fromMicroarcseconds(toMicroarcseconds * a) + + /** + * Scalar multiplication of this angle and `a`. approximate + * @group Operations + */ + def *?(a: Double): Angle = + Angle.fromMicroarcseconds((toMicroarcseconds * a).toLong) + /** * This angle as an Offset.P. Exact, invertible. * diff --git a/modules/tests/shared/src/test/scala/lucuma/core/math/AngleSuite.scala b/modules/tests/shared/src/test/scala/lucuma/core/math/AngleSuite.scala index 8a9f29aa5..4c8c4e163 100644 --- a/modules/tests/shared/src/test/scala/lucuma/core/math/AngleSuite.scala +++ b/modules/tests/shared/src/test/scala/lucuma/core/math/AngleSuite.scala @@ -182,4 +182,22 @@ final class AngleSuite extends munit.DisciplineSuite { assertEquals(a.tan, scala.math.tan(a.toDoubleRadians)) } } + + test("Scalar int multiplication") { + assertEquals(Angle.Angle0 * 2, Angle.Angle0) + assertEquals(Angle.Angle90 * 2, Angle.Angle180) + assertEquals(Angle.Angle90 * 4, Angle.Angle0) + assertEquals(Angle.Angle90 * -2, Angle.Angle180) + assertEquals(Angle.Angle90 * 10, Angle.Angle180) + } + + test("Scalar double multiplication") { + assertEquals(Angle.Angle0 *? 2, Angle.Angle0) + assertEquals(Angle.Angle90 *? 2, Angle.Angle180) + assertEquals(Angle.Angle90 *? 4, Angle.Angle0) + assertEquals(Angle.Angle90 *? -2, Angle.Angle180) + assertEquals(Angle.Angle90 *? 10, Angle.Angle180) + assertEquals(Angle.Angle180 *? 0.5, Angle.Angle90) + assert(((Angle.Angle180 *? 0.001) - Angle.fromDoubleDegrees(0.18)).toMicroarcseconds < 1000) + } }