From a9c23e8f82345a0aa61c370e46ac80689552a464 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Sat, 17 Oct 2020 20:58:05 -0300 Subject: [PATCH 01/14] Create ellipsoid skeleton --- src/Ellipsoid3d.elm | 232 +++++++++++++++++++++++++++++++++++++++++ src/Geometry/Types.elm | 9 ++ 2 files changed, 241 insertions(+) create mode 100644 src/Ellipsoid3d.elm diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm new file mode 100644 index 00000000..30eaec71 --- /dev/null +++ b/src/Ellipsoid3d.elm @@ -0,0 +1,232 @@ +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-- This Source Code Form is subject to the terms of the Mozilla Public -- +-- License, v. 2.0. If a copy of the MPL was not distributed with this file, -- +-- you can obtain one at http://mozilla.org/MPL/2.0/. -- +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- + + +module Ellipsoid3d exposing + ( Ellipsoid3d + , with + , centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius + ) + +{-| Docs here + +@docs Ellipsoid3d + + +# Constructors + +@docs with + + +# Properties + +@docs centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius + +TODO: +volume : Ellipsoid3d units coordinates -> Quantity Float (Cubed units) +surfaceArea : Ellipsoid3d units coordinates -> Quantity Float (Squared units) +boundingBox : Ellipsoid3d units coordinates -> BoundingBox3d units coordinates + + +# Queries + +TODO: +contains : Point3d units coordinates -> Sphere3d units coordinates -> Bool + + +# Measurement + +TODO: +signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Interval Float units + + +# Transformations + +TODO: +scaleAbout : + Point3d units coordinates + -> Float + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates + +rotateAround : + Axis3d units coordinates + -> Angle + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates + +translateBy : + Vector3d units coordinates + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates + +translateIn : + Direction3d coordinates + -> Quantity Float units + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates + +mirrorAcross : + Plane3d units coordinates + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates + +# Unit conversions + +TODO: +at : + Quantity Float (Rate units2 units1) + -> Ellipsoid3d units1 coordinates + -> Ellipsoid3d units2 coordinates + +at_ : + Quantity Float (Rate units1 units2) + -> Ellipsoid3d units1 coordinates + -> Ellipsoid3d units2 coordinates + +# Coordinate conversions + +TODO: +relativeTo : + Frame3d units globalCoordinates { defines : localCoordinates } + -> Ellipsoid3d units globalCoordinates + -> Ellipsoid3d units localCoordinates + +placeIn : + Frame3d units globalCoordinates { defines : localCoordinates } + -> Ellipsoid3d units localCoordinates + -> Ellipsoid3d units globalCoordinates + +-} + +import Axis3d exposing (Axis3d) +import Direction3d exposing (Direction3d) +import Frame3d exposing (Frame3d) +import Geometry.Types as Types exposing (Ellipsoid3d) +import Point3d exposing (Point3d) +import Quantity exposing (Quantity) + + +{-| -} +type alias Ellipsoid3d units coordinates = + Types.Ellipsoid3d units coordinates + + +{-| Construct a 3d ellipsoid from a [Frame3d](Frame3d) and the x, y and z +radii. If you pass a negative radius, the absolute value will be used. + + exampleEllipsoid = + Ellipsoid3d.with + { axes = Frame3d.atPoint (Point3d.meters 2 1 3) + , xRadius = Length.meters 5 + , yRadius = Length.meters 3 + , zRadius = Length.meters 4 + } + +-} +with : + { axes : Frame3d units coordinates defines + , xRadius : Quantity Float units + , yRadius : Quantity Float units + , zRadius : Quantity Float units + } + -> Ellipsoid3d units coordinates +with properties = + Types.Ellipsoid3d + { axes = properties.axes + , xRadius = Quantity.abs properties.xRadius + , yRadius = Quantity.abs properties.yRadius + , zRadius = Quantity.abs properties.zRadius + } + + +{-| -} +centerPoint : Ellipsoid3d units coordinates -> Point3d units coordinates +centerPoint ellipsoid = + Frame3d.originPoint (axes ellipsoid) + + +{-| -} +axes : Ellipsoid3d units coordinates -> Frame3d units coordinates defines +axes (Types.Ellipsoid3d ellipsoid) = + Frame3d.copy ellipsoid.axes + + +{-| Get the X axis of an ellipsoid. +-} +xAxis : Ellipsoid3d units coordinates -> Axis3d units coordinates +xAxis ellipsoid = + Frame3d.xAxis (axes ellipsoid) + + +{-| Get the Y axis of an ellipsoid. +-} +yAxis : Ellipsoid3d units coordinates -> Axis3d units coordinates +yAxis ellipsoid = + Frame3d.yAxis (axes ellipsoid) + + +{-| Get the Z axis of an ellipsoid. +-} +zAxis : Ellipsoid3d units coordinates -> Axis3d units coordinates +zAxis ellipsoid = + Frame3d.zAxis (axes ellipsoid) + + +{-| Get the radius of an ellipsoid along its X axis. + + Ellipsoid3d.xRadius exampleEllipsoid + --> Length.meters 5 + +-} +xRadius : Ellipsoid3d units coordinates -> Quantity Float units +xRadius (Types.Ellipsoid3d ellipsoid) = + ellipsoid.xRadius + + +{-| Get the radius of an ellipsoid along its Y axis. + + Ellipsoid3d.yRadius exampleEllipsoid + --> Length.meters 3 + +-} +yRadius : Ellipsoid3d units coordinates -> Quantity Float units +yRadius (Types.Ellipsoid3d ellipsoid) = + ellipsoid.yRadius + + +{-| Get the radius of an ellipsoid along its Z axis. + + Ellipsoid3d.zRadius exampleEllipsoid + --> Length.meters 4 + +-} +zRadius : Ellipsoid3d units coordinates -> Quantity Float units +zRadius (Types.Ellipsoid3d ellipsoid) = + ellipsoid.zRadius + + +{-| Get the direction of the ellipsoid's X axis. +-} +xDirection : Ellipsoid3d units coordinates -> Direction3d coordinates +xDirection ellipsoid = + Frame3d.xDirection (axes ellipsoid) + + +{-| Get the direction of the ellipsoid's Y axis. +-} +yDirection : Ellipsoid3d units coordinates -> Direction3d coordinates +yDirection ellipsoid = + Frame3d.yDirection (axes ellipsoid) + + +{-| Get the direction of the ellipsoid's Z axis. +-} +zDirection : Ellipsoid3d units coordinates -> Direction3d coordinates +zDirection ellipsoid = + Frame3d.zDirection (axes ellipsoid) diff --git a/src/Geometry/Types.elm b/src/Geometry/Types.elm index d9bf4508..37854db3 100644 --- a/src/Geometry/Types.elm +++ b/src/Geometry/Types.elm @@ -179,6 +179,15 @@ type Ellipse3d units coordinates } +type Ellipsoid3d units coordinates + = Ellipsoid3d + { axes : Frame3d units coordinates {} + , xRadius : Quantity Float units + , yRadius : Quantity Float units + , zRadius : Quantity Float units + } + + type Sphere3d units coordinates = Sphere3d { centerPoint : Point3d units coordinates From 48196fbee63202497a187b2d83c39a835ac9d17d Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Sat, 17 Oct 2020 22:22:11 -0300 Subject: [PATCH 02/14] Organize and format files --- src/Ellipsoid3d.elm | 189 ++++++++++++++++++++++++++++++-------------- 1 file changed, 130 insertions(+), 59 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 30eaec71..3e13a729 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -25,91 +25,45 @@ module Ellipsoid3d exposing # Properties -@docs centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius - -TODO: -volume : Ellipsoid3d units coordinates -> Quantity Float (Cubed units) -surfaceArea : Ellipsoid3d units coordinates -> Quantity Float (Squared units) -boundingBox : Ellipsoid3d units coordinates -> BoundingBox3d units coordinates +@docs centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius, volume, surfaceArea, boundingBox # Queries -TODO: -contains : Point3d units coordinates -> Sphere3d units coordinates -> Bool +@docs contains # Measurement -TODO: -signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Interval Float units +@docs signedDistanceAlong # Transformations -TODO: -scaleAbout : - Point3d units coordinates - -> Float - -> Ellipsoid3d units coordinates - -> Ellipsoid3d units coordinates +@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross -rotateAround : - Axis3d units coordinates - -> Angle - -> Ellipsoid3d units coordinates - -> Ellipsoid3d units coordinates - -translateBy : - Vector3d units coordinates - -> Ellipsoid3d units coordinates - -> Ellipsoid3d units coordinates - -translateIn : - Direction3d coordinates - -> Quantity Float units - -> Ellipsoid3d units coordinates - -> Ellipsoid3d units coordinates - -mirrorAcross : - Plane3d units coordinates - -> Ellipsoid3d units coordinates - -> Ellipsoid3d units coordinates # Unit conversions -TODO: -at : - Quantity Float (Rate units2 units1) - -> Ellipsoid3d units1 coordinates - -> Ellipsoid3d units2 coordinates +@docs at, at_ -at_ : - Quantity Float (Rate units1 units2) - -> Ellipsoid3d units1 coordinates - -> Ellipsoid3d units2 coordinates # Coordinate conversions -TODO: -relativeTo : - Frame3d units globalCoordinates { defines : localCoordinates } - -> Ellipsoid3d units globalCoordinates - -> Ellipsoid3d units localCoordinates - -placeIn : - Frame3d units globalCoordinates { defines : localCoordinates } - -> Ellipsoid3d units localCoordinates - -> Ellipsoid3d units globalCoordinates +@docs relativeTo, placeIn -} +import Angle exposing (Angle) import Axis3d exposing (Axis3d) +import BoundingBox3d exposing (BoundingBox3d) import Direction3d exposing (Direction3d) import Frame3d exposing (Frame3d) import Geometry.Types as Types exposing (Ellipsoid3d) +import Plane3d exposing (Plane3d) import Point3d exposing (Point3d) -import Quantity exposing (Quantity) +import Quantity exposing (Cubed, Quantity, Rate, Squared) +import Vector3d exposing (Vector3d) {-| -} @@ -145,13 +99,15 @@ with properties = } -{-| -} +{-| Get the geometric center of an ellipsoid. +-} centerPoint : Ellipsoid3d units coordinates -> Point3d units coordinates centerPoint ellipsoid = Frame3d.originPoint (axes ellipsoid) -{-| -} +{-| Get the X, Y and Z axes of an ellipsoid as a `Frame3d`. +-} axes : Ellipsoid3d units coordinates -> Frame3d units coordinates defines axes (Types.Ellipsoid3d ellipsoid) = Frame3d.copy ellipsoid.axes @@ -230,3 +186,118 @@ yDirection ellipsoid = zDirection : Ellipsoid3d units coordinates -> Direction3d coordinates zDirection ellipsoid = Frame3d.zDirection (axes ellipsoid) + + +{-| Get the volume of an ellipsoid. +-} +volume : Ellipsoid3d units coordinates -> Quantity Float (Cubed units) +volume ellipsoid = + let + axesProduct = + xRadius ellipsoid + |> Quantity.times (yRadius ellipsoid) + |> Quantity.times (zRadius ellipsoid) + in + Quantity.multiplyBy (4 / 3 * pi) axesProduct + + +{-| -} +surfaceArea : Ellipsoid3d units coordinates -> Quantity Float (Squared units) +surfaceArea _ = + Debug.todo "surfaceArea" + + +{-| -} +boundingBox : Ellipsoid3d units coordinates -> BoundingBox3d units coordinates +boundingBox _ = + Debug.todo "boundingBox" + + +{-| -} +contains : Point3d units coordinates -> Ellipsoid3d units coordinates -> Bool +contains _ = + Debug.todo "boundingBox" + + +{-| -} +scaleAbout : + Point3d units coordinates + -> Float + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates +scaleAbout _ _ _ = + Debug.todo "scaleAbout" + + +{-| -} +rotateAround : + Axis3d units coordinates + -> Angle + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates +rotateAround _ _ _ = + Debug.todo "rotateAround" + + +{-| -} +translateBy : + Vector3d units coordinates + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates +translateBy _ _ = + Debug.todo "translateBy" + + +{-| -} +translateIn : + Direction3d coordinates + -> Quantity Float units + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates +translateIn _ _ _ = + Debug.todo "translateIn" + + +{-| -} +mirrorAcross : + Plane3d units coordinates + -> Ellipsoid3d units coordinates + -> Ellipsoid3d units coordinates +mirrorAcross _ _ = + Debug.todo "mirrorAcross" + + +{-| -} +at : + Quantity Float (Rate units2 units1) + -> Ellipsoid3d units1 coordinates + -> Ellipsoid3d units2 coordinates +at _ _ = + Debug.todo "at" + + +{-| -} +at_ : + Quantity Float (Rate units1 units2) + -> Ellipsoid3d units1 coordinates + -> Ellipsoid3d units2 coordinates +at_ _ _ = + Debug.todo "at_" + + +{-| -} +relativeTo : + Frame3d units globalCoordinates { defines : localCoordinates } + -> Ellipsoid3d units globalCoordinates + -> Ellipsoid3d units localCoordinates +relativeTo _ _ = + Debug.todo "relativeTo" + + +{-| -} +placeIn : + Frame3d units globalCoordinates { defines : localCoordinates } + -> Ellipsoid3d units localCoordinates + -> Ellipsoid3d units globalCoordinates +placeIn _ _ = + Debug.todo "placeIn" From 7afbf65345f6a5752a57ec07ccd6f833f97541ff Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 14:31:31 -0300 Subject: [PATCH 03/14] Organize imports and remove surfaceArea --- src/Ellipsoid3d.elm | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 3e13a729..cbfc2a46 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -10,7 +10,12 @@ module Ellipsoid3d exposing ( Ellipsoid3d , with - , centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius + , centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius, volume, boundingBox + , contains + , signedDistanceAlong + , scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross + , at, at_ + , relativeTo, placeIn ) {-| Docs here @@ -25,7 +30,7 @@ module Ellipsoid3d exposing # Properties -@docs centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius, volume, surfaceArea, boundingBox +@docs centerPoint, axes, xAxis, yAxis, zAxis, xDirection, yDirection, zDirection, xRadius, yRadius, zRadius, volume, boundingBox # Queries @@ -201,13 +206,14 @@ volume ellipsoid = Quantity.multiplyBy (4 / 3 * pi) axesProduct -{-| -} -surfaceArea : Ellipsoid3d units coordinates -> Quantity Float (Squared units) -surfaceArea _ = - Debug.todo "surfaceArea" +{-| Get the minimal bounding box containing a given ellipsoid. + Ellipsoid3d.boundingBox exampleSphere + --> BoundingBox3d.from + --> (Point3d.meters -3 -2 -1) + --> (Point3d.meters 7 4 7) -{-| -} +-} boundingBox : Ellipsoid3d units coordinates -> BoundingBox3d units coordinates boundingBox _ = Debug.todo "boundingBox" @@ -219,6 +225,12 @@ contains _ = Debug.todo "boundingBox" +{-| -} +signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Interval Float units +signedDistanceAlong _ _ = + Debug.todo "signedDistanceAlong" + + {-| -} scaleAbout : Point3d units coordinates From 6155f1280d58b2ea961e320c060c9217379ff56f Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 16:39:47 -0300 Subject: [PATCH 04/14] Create test and fix types --- src/Ellipsoid3d.elm | 4 ++-- tests/Tests/Ellipsoid3d.elm | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 tests/Tests/Ellipsoid3d.elm diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index cbfc2a46..9c927a55 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -89,7 +89,7 @@ radii. If you pass a negative radius, the absolute value will be used. -} with : - { axes : Frame3d units coordinates defines + { axes : Frame3d units coordinates {} , xRadius : Quantity Float units , yRadius : Quantity Float units , zRadius : Quantity Float units @@ -226,7 +226,7 @@ contains _ = {-| -} -signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Interval Float units +signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Quantity Float units signedDistanceAlong _ _ = Debug.todo "signedDistanceAlong" diff --git a/tests/Tests/Ellipsoid3d.elm b/tests/Tests/Ellipsoid3d.elm new file mode 100644 index 00000000..1ff0477f --- /dev/null +++ b/tests/Tests/Ellipsoid3d.elm @@ -0,0 +1,47 @@ +module Tests.Ellipsoid3d exposing (equivalences) + +import Ellipsoid3d exposing (Ellipsoid3d) +import Expect +import Frame3d exposing (Frame3d) +import Fuzz +import Geometry.Expect as Expect +import Geometry.Fuzz as Fuzz +import Length exposing (Meters, meters) +import Point3d exposing (Point3d) +import Sphere3d exposing (Sphere3d) +import Test exposing (Test) + + + +-- Helper methods + + +ellipsoidAtOriginWithRadii : ( Float, Float, Float ) -> Ellipsoid3d Meters coordinates +ellipsoidAtOriginWithRadii ( x, y, z ) = + Ellipsoid3d.with + { axes = Frame3d.atPoint (Point3d.meters 0 0 0) + , xRadius = Length.meters x + , yRadius = Length.meters y + , zRadius = Length.meters z + } + + + +-- Tests + + +equivalences : Test +equivalences = + Test.describe "Equivalent shapes" + [ Test.fuzz Fuzz.float "Ellipsoid with 3 equal radii is equivalent to a sphere" <| + \radius -> + let + sphere = + Sphere3d.withRadius (meters radius) (Point3d.meters 0 0 0) + + ellipsoid = + ellipsoidAtOriginWithRadii ( radius, radius, radius ) + in + Ellipsoid3d.volume ellipsoid + |> Expect.equal (Sphere3d.volume sphere) + ] From 922e25dd73740ea300a437324bbf1a3fa83a451c Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 17:38:51 -0300 Subject: [PATCH 05/14] Implement methods for ellipsoid unit conversion --- src/Ellipsoid3d.elm | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 9c927a55..bdfbd5a6 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -279,22 +279,33 @@ mirrorAcross _ _ = Debug.todo "mirrorAcross" -{-| -} +{-| Convert an ellipsoid from one units type to another, by providing a +conversion factor given as a rate of change of destination units with respect +to source units. +-} at : Quantity Float (Rate units2 units1) -> Ellipsoid3d units1 coordinates -> Ellipsoid3d units2 coordinates -at _ _ = - Debug.todo "at" +at rate (Types.Ellipsoid3d ellipsoid) = + Types.Ellipsoid3d + { axes = Frame3d.at rate ellipsoid.axes + , xRadius = Quantity.abs (Quantity.at rate ellipsoid.xRadius) + , yRadius = Quantity.abs (Quantity.at rate ellipsoid.yRadius) + , zRadius = Quantity.abs (Quantity.at rate ellipsoid.zRadius) + } -{-| -} +{-| Convert an ellipsoid from one units type to another, by providing an +'inverse' conversion factor given as a rate of change of source units with +respect to destination units. +-} at_ : Quantity Float (Rate units1 units2) -> Ellipsoid3d units1 coordinates -> Ellipsoid3d units2 coordinates -at_ _ _ = - Debug.todo "at_" +at_ rate ellipsoid = + at (Quantity.inverse rate) ellipsoid {-| -} From 23af2250f7fb0555ad79770e4c5c521b9331ae94 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 19:55:22 -0300 Subject: [PATCH 06/14] Implement ellipsoid methods for transformations --- src/Ellipsoid3d.elm | 75 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index bdfbd5a6..1595fd73 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -231,52 +231,97 @@ signedDistanceAlong _ _ = Debug.todo "signedDistanceAlong" -{-| -} +{-| Scale an ellipsoid about a given point by a given scale. +-} scaleAbout : Point3d units coordinates -> Float -> Ellipsoid3d units coordinates -> Ellipsoid3d units coordinates -scaleAbout _ _ _ = - Debug.todo "scaleAbout" +scaleAbout point scale ellipsoid = + let + newCenterPoint = + Point3d.scaleAbout point scale (centerPoint ellipsoid) + + newAxes = + if scale >= 0 then + Frame3d.unsafe + { originPoint = newCenterPoint + , xDirection = xDirection ellipsoid + , yDirection = yDirection ellipsoid + , zDirection = yDirection ellipsoid + } + + else + Frame3d.unsafe + { originPoint = newCenterPoint + , xDirection = Direction3d.reverse (xDirection ellipsoid) + , yDirection = Direction3d.reverse (yDirection ellipsoid) + , zDirection = Direction3d.reverse (yDirection ellipsoid) + } + in + Types.Ellipsoid3d + { axes = newAxes + , xRadius = Quantity.abs (Quantity.multiplyBy scale (xRadius ellipsoid)) + , yRadius = Quantity.abs (Quantity.multiplyBy scale (yRadius ellipsoid)) + , zRadius = Quantity.abs (Quantity.multiplyBy scale (zRadius ellipsoid)) + } -{-| -} +transformBy : + (Frame3d units coordinates1 {} -> Frame3d units coordinates2 {}) + -> Ellipsoid3d units coordinates1 + -> Ellipsoid3d units coordinates2 +transformBy axesTransformation (Types.Ellipsoid3d properties) = + Types.Ellipsoid3d + { axes = axesTransformation properties.axes + , xRadius = properties.xRadius + , yRadius = properties.yRadius + , zRadius = properties.zRadius + } + + +{-| Rotate an ellipsoid around a given axis by a given angle. +-} rotateAround : Axis3d units coordinates -> Angle -> Ellipsoid3d units coordinates -> Ellipsoid3d units coordinates -rotateAround _ _ _ = - Debug.todo "rotateAround" +rotateAround axis angle ellipsoid = + transformBy (Frame3d.rotateAround axis angle) ellipsoid -{-| -} +{-| Translate an ellipsoid by a given displacement. +-} translateBy : Vector3d units coordinates -> Ellipsoid3d units coordinates -> Ellipsoid3d units coordinates -translateBy _ _ = - Debug.todo "translateBy" +translateBy displacement ellipsoid = + transformBy (Frame3d.translateBy displacement) ellipsoid -{-| -} +{-| Translate an ellipsoid in a given direction by a given distance. +-} translateIn : Direction3d coordinates -> Quantity Float units -> Ellipsoid3d units coordinates -> Ellipsoid3d units coordinates -translateIn _ _ _ = - Debug.todo "translateIn" +translateIn direction distance ellipsoid = + translateBy (Vector3d.withLength distance direction) ellipsoid -{-| -} +{-| Mirror an ellipsoid across a given plane. Note that this will flip the +handedness of the ellipsoid's axes. +-} mirrorAcross : Plane3d units coordinates -> Ellipsoid3d units coordinates -> Ellipsoid3d units coordinates -mirrorAcross _ _ = - Debug.todo "mirrorAcross" +mirrorAcross plane ellipsoid = + transformBy (Frame3d.mirrorAcross plane) ellipsoid {-| Convert an ellipsoid from one units type to another, by providing a From 8c69d3d22d061329864b0fefe5b4632ca1c12957 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 19:55:48 -0300 Subject: [PATCH 07/14] Implement ellipsoid methods for coord. conversions --- src/Ellipsoid3d.elm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 1595fd73..7d4692bb 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -353,19 +353,23 @@ at_ rate ellipsoid = at (Quantity.inverse rate) ellipsoid -{-| -} +{-| Take an ellipsoid defined in global coordinates, and return it expressed in +local coordinates relative to a given reference frame. +-} relativeTo : Frame3d units globalCoordinates { defines : localCoordinates } -> Ellipsoid3d units globalCoordinates -> Ellipsoid3d units localCoordinates -relativeTo _ _ = - Debug.todo "relativeTo" +relativeTo frame ellipsoid = + transformBy (Frame3d.relativeTo frame) ellipsoid -{-| -} +{-| Take an ellipsoid considered to be defined in local coordinates relative to a +given reference frame, and return that ellipsoid expressed in global coordinates. +-} placeIn : Frame3d units globalCoordinates { defines : localCoordinates } -> Ellipsoid3d units localCoordinates -> Ellipsoid3d units globalCoordinates -placeIn _ _ = - Debug.todo "placeIn" +placeIn frame ellipsoid = + transformBy (Frame3d.placeIn frame) ellipsoid From 5011a81a58fbf69b6a4ebed87d4abec0372ad2c8 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 21:05:32 -0300 Subject: [PATCH 08/14] Implement remaining stuff for ellipsoid --- src/Ellipsoid3d.elm | 80 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 7d4692bb..72644c5a 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -68,6 +68,7 @@ import Geometry.Types as Types exposing (Ellipsoid3d) import Plane3d exposing (Plane3d) import Point3d exposing (Point3d) import Quantity exposing (Cubed, Quantity, Rate, Squared) +import Quantity.Interval as Interval exposing (Interval) import Vector3d exposing (Vector3d) @@ -215,20 +216,81 @@ volume ellipsoid = -} boundingBox : Ellipsoid3d units coordinates -> BoundingBox3d units coordinates -boundingBox _ = - Debug.todo "boundingBox" +boundingBox ellipsoid = + BoundingBox3d.xyz + (signedDistanceAlong Axis3d.x ellipsoid) + (signedDistanceAlong Axis3d.y ellipsoid) + (signedDistanceAlong Axis3d.z ellipsoid) -{-| -} +{-| Check if an ellipsoid contains a given point. +-} contains : Point3d units coordinates -> Ellipsoid3d units coordinates -> Bool -contains _ = - Debug.todo "boundingBox" +contains point ellipsoid = + let + localFrame = + axes ellipsoid + x = + Point3d.xCoordinateIn localFrame point -{-| -} -signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Quantity Float units -signedDistanceAlong _ _ = - Debug.todo "signedDistanceAlong" + y = + Point3d.yCoordinateIn localFrame point + + z = + Point3d.zCoordinateIn localFrame point + + c1 = + Quantity.squared x + |> Quantity.ratio (Quantity.squared (xRadius ellipsoid)) + + c2 = + Quantity.squared y + |> Quantity.ratio (Quantity.squared (yRadius ellipsoid)) + + c3 = + Quantity.squared z + |> Quantity.ratio (Quantity.squared (zRadius ellipsoid)) + in + c1 + c2 + c3 <= 1 + + +{-| Project an ellipsoid onto an axis, returning the range of projected distances +along that axis. +-} +signedDistanceAlong : Axis3d units coordinates -> Ellipsoid3d units coordinates -> Interval Float units +signedDistanceAlong axis ellipsoid = + let + centralDistance = + Point3d.signedDistanceAlong axis (centerPoint ellipsoid) + + axisDirection = + Axis3d.direction axis + + a = + xRadius ellipsoid + |> Quantity.multiplyBy + (Direction3d.componentIn axisDirection (xDirection ellipsoid)) + + b = + yRadius ellipsoid + |> Quantity.multiplyBy + (Direction3d.componentIn axisDirection (yDirection ellipsoid)) + + c = + zRadius ellipsoid + |> Quantity.multiplyBy + (Direction3d.componentIn axisDirection (zDirection ellipsoid)) + + delta = + Quantity.squared a + |> Quantity.plus (Quantity.squared b) + |> Quantity.plus (Quantity.squared c) + |> Quantity.sqrt + in + Interval.from + (centralDistance |> Quantity.minus delta) + (centralDistance |> Quantity.plus delta) {-| Scale an ellipsoid about a given point by a given scale. From 6c15dbb88ca6e4334dc80d237119ad7fa96c175a Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 19 Oct 2020 21:14:18 -0300 Subject: [PATCH 09/14] Add self to AUTHORS --- AUTHORS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index b420f308..b6a82e47 100644 --- a/AUTHORS +++ b/AUTHORS @@ -12,4 +12,4 @@ Lalit Umbarkar (bounding box expand/offset) Sebastian Kazenbroot-Guppy (circle-bbox intersections) Andrey Kuzmin (arc midpoint, polygon centroid, interval distances for line segments, Cone3d) Suzanne Wood (intersection of axis and sphere) -Guilherme Riekes Belmonte (scaleTo for Vector2d and Vector3d) +Guilherme Riekes Belmonte (Ellipsoid3d, scaleTo and physics for Vector2d and Vector3d) From 32cda6417f705f37905783a14fbeed8aae3e23bb Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Sat, 31 Oct 2020 14:23:15 -0300 Subject: [PATCH 10/14] Add transformation tests --- tests/Geometry/Fuzz.elm | 53 +++++++++++++++- tests/Tests/Ellipsoid3d.elm | 119 +++++++++++++++++++++++++++++++++++- 2 files changed, 169 insertions(+), 3 deletions(-) diff --git a/tests/Geometry/Fuzz.elm b/tests/Geometry/Fuzz.elm index 2b700c87..09373756 100644 --- a/tests/Geometry/Fuzz.elm +++ b/tests/Geometry/Fuzz.elm @@ -4,7 +4,7 @@ module Geometry.Fuzz exposing , point2d, point3d, vector2d, vector3d, direction2d, direction3d, boundingBox2d, boundingBox3d , axis2d, axis3d, frame2d, frame3d, plane3d, sketchPlane3d , lineSegment2d, lineSegment3d, triangle2d, triangle3d, rectangle2d, block3d, polyline2d, polyline3d, polygon2d - , arc2d, arc3d, circle2d, circle3d, cubicSpline2d, cubicSpline3d, cylinder3d, cone3d, ellipse2d, ellipticalArc2d, ellipticalArc3d, quadraticSpline2d, quadraticSpline3d, sphere3d + , arc2d, arc3d, circle2d, circle3d, cubicSpline2d, cubicSpline3d, cylinder3d, cone3d, ellipse2d, ellipticalArc2d, ellipticalArc3d, ellipsoid3d, quadraticSpline2d, quadraticSpline3d, sphere3d ) {-| A collection of [`Fuzzer`](https://package.elm-lang.org/packages/elm-explorations/test/latest/Fuzz)s @@ -52,7 +52,7 @@ running into any naming conflicts. # Complex geometry -@docs arc2d, arc3d, circle2d, circle3d, cubicSpline2d, cubicSpline3d, cylinder3d, cone3d, ellipse2d, ellipticalArc2d, ellipticalArc3d, quadraticSpline2d, quadraticSpline3d, sphere3d +@docs arc2d, arc3d, circle2d, circle3d, cubicSpline2d, cubicSpline3d, cylinder3d, cone3d, ellipse2d, ellipticalArc2d, ellipticalArc3d, ellipsoid3d, quadraticSpline2d, quadraticSpline3d, sphere3d -} @@ -73,6 +73,7 @@ import Cylinder3d exposing (Cylinder3d) import Direction2d exposing (Direction2d) import Direction3d exposing (Direction3d) import Ellipse2d exposing (Ellipse2d) +import Ellipsoid3d exposing (Ellipsoid3d) import EllipticalArc2d exposing (EllipticalArc2d) import EllipticalArc3d exposing (EllipticalArc3d) import Frame2d exposing (Frame2d) @@ -275,6 +276,36 @@ frame3d = Fuzz.map4 frame point3d direction3d Fuzz.bool Fuzz.bool +{-| Generate a random `Frame3d`. Note that the generated frame may be [either +left-handed or right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness). +-} +globalFrame3d : Fuzzer (Frame3d Meters coordinates {}) +globalFrame3d = + let + frame originPoint xDirection reverseY reverseZ = + let + ( yDirection, zDirection ) = + Direction3d.perpendicularBasis xDirection + in + Frame3d.unsafe + { originPoint = originPoint + , xDirection = xDirection + , yDirection = + if reverseY then + Direction3d.reverse yDirection + + else + yDirection + , zDirection = + if reverseZ then + Direction3d.reverse zDirection + + else + zDirection + } + in + Fuzz.map4 frame point3d direction3d Fuzz.bool Fuzz.bool + {-| Generate a random `SketchPlane3d`. -} sketchPlane3d : Fuzzer (SketchPlane3d Meters coordinates { defines : sketchCoordinates }) @@ -485,6 +516,24 @@ ellipticalArc3d = Fuzz.map2 EllipticalArc3d.on sketchPlane3d ellipticalArc2d +{-| Generate a random `Ellipsoid3d`. +-} +ellipsoid3d : Fuzzer (Ellipsoid3d Meters coordinates) +ellipsoid3d = + let + ellipsoid axes ( xRadius, yRadius, zRadius ) = + Ellipsoid3d.with + { axes = axes + , xRadius = xRadius + , yRadius = yRadius + , zRadius = zRadius + } + in + Fuzz.map2 ellipsoid + globalFrame3d + (Fuzz.tuple3 ( positiveLength, positiveLength, positiveLength )) + + {-| Generate a random `Rectangle2d`. -} rectangle2d : Fuzzer (Rectangle2d Meters coordinates) diff --git a/tests/Tests/Ellipsoid3d.elm b/tests/Tests/Ellipsoid3d.elm index 1ff0477f..c7551583 100644 --- a/tests/Tests/Ellipsoid3d.elm +++ b/tests/Tests/Ellipsoid3d.elm @@ -1,5 +1,9 @@ -module Tests.Ellipsoid3d exposing (equivalences) +module Tests.Ellipsoid3d exposing + ( equivalences + , transformations + ) +import Axis3d exposing (Axis3d) import Ellipsoid3d exposing (Ellipsoid3d) import Expect import Frame3d exposing (Frame3d) @@ -8,6 +12,8 @@ import Geometry.Expect as Expect import Geometry.Fuzz as Fuzz import Length exposing (Meters, meters) import Point3d exposing (Point3d) +import Quantity +import Quantity.Interval as Interval exposing (Interval) import Sphere3d exposing (Sphere3d) import Test exposing (Test) @@ -45,3 +51,114 @@ equivalences = Ellipsoid3d.volume ellipsoid |> Expect.equal (Sphere3d.volume sphere) ] + + +transformations : Test +transformations = + Test.describe "Transforming two objects equally maintains their relative properties" + [ Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.point3d )) + Fuzz.vector3d + "contains before/after translation" + (\( ellipsoid, point ) vector -> + let + beforeTransformation = + Ellipsoid3d.contains point ellipsoid + + afterTransformation = + Ellipsoid3d.contains + (Point3d.translateBy vector point) + (Ellipsoid3d.translateBy vector ellipsoid) + in + Expect.equal beforeTransformation afterTransformation + ) + , Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.point3d )) + Fuzz.plane3d + "contains before/after mirroring" + (\( ellipsoid, point ) plane -> + let + beforeTransformation = + Ellipsoid3d.contains point ellipsoid + + afterTransformation = + Ellipsoid3d.contains + (Point3d.mirrorAcross plane point) + (Ellipsoid3d.mirrorAcross plane ellipsoid) + in + Expect.equal beforeTransformation afterTransformation + ) + , Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.point3d )) + (Fuzz.tuple ( Fuzz.axis3d, Fuzz.angle )) + "contains before/after rotating" + (\( ellipsoid, point ) ( axis, angle ) -> + let + beforeTransformation = + Ellipsoid3d.contains point ellipsoid + + afterTransformation = + Ellipsoid3d.contains + (Point3d.rotateAround axis angle point) + (Ellipsoid3d.rotateAround axis angle ellipsoid) + in + Expect.equal beforeTransformation afterTransformation + ) + , Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.axis3d )) + Fuzz.vector3d + "signedDistanceAlong before/after translation" + (\( ellipsoid, axis ) vector -> + let + beforeTransformation = + Ellipsoid3d.signedDistanceAlong axis ellipsoid + + afterTransformation = + Ellipsoid3d.signedDistanceAlong + (Axis3d.translateBy vector axis) + (Ellipsoid3d.translateBy vector ellipsoid) + in + Expect.equal True <| + Quantity.equalWithin (Length.centimeters 1) + (Interval.width afterTransformation) + (Interval.width beforeTransformation) + ) + , Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.axis3d )) + Fuzz.plane3d + "signedDistanceAlong before/after mirroring" + (\( ellipsoid, axis ) plane -> + let + beforeTransformation = + Ellipsoid3d.signedDistanceAlong axis ellipsoid + + afterTransformation = + Ellipsoid3d.signedDistanceAlong + (Axis3d.mirrorAcross plane axis) + (Ellipsoid3d.mirrorAcross plane ellipsoid) + in + Expect.equal True <| + Quantity.equalWithin (Length.centimeters 1) + (Interval.width afterTransformation) + (Interval.width beforeTransformation) + ) + , Test.fuzz2 + (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.axis3d )) + (Fuzz.tuple ( Fuzz.axis3d, Fuzz.angle )) + "signedDistanceAlong before/after rotating" + (\( ellipsoid, axis ) ( rotAxis, angle ) -> + let + beforeTransformation = + Ellipsoid3d.signedDistanceAlong axis ellipsoid + + afterTransformation = + Ellipsoid3d.signedDistanceAlong + (Axis3d.rotateAround rotAxis angle axis) + (Ellipsoid3d.rotateAround rotAxis angle ellipsoid) + in + Expect.equal True <| + Quantity.equalWithin (Length.centimeters 1) + (Interval.width afterTransformation) + (Interval.width beforeTransformation) + ) + ] From e7b08d5decc503acd30baeb2f0a43b690344528e Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Sat, 31 Oct 2020 14:27:27 -0300 Subject: [PATCH 11/14] Add top level docs for ellipsoid --- src/Ellipsoid3d.elm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 72644c5a..f0375d1b 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -18,7 +18,14 @@ module Ellipsoid3d exposing , relativeTo, placeIn ) -{-| Docs here +{-| An [ellipsoid](https://en.wikipedia.org/wiki/Ellipsoid) is defined by a +center point, X, Y and Z radii, and a `Frame3d` representing the local +coordinate system. +This module includes functionality for + + - Constructing ellipsoids + - Scaling, rotating and translating ellipsoids + - Converting ellipsoids between different coordinate systems @docs Ellipsoid3d From 4796aaff023da17ee851b17329c0042d01ae7101 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Mon, 2 Nov 2020 21:48:54 -0300 Subject: [PATCH 12/14] Odds and ends --- src/Ellipsoid3d.elm | 4 ++-- tests/Geometry/Fuzz.elm | 32 +------------------------------- 2 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index f0375d1b..7e61f2a9 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -97,7 +97,7 @@ radii. If you pass a negative radius, the absolute value will be used. -} with : - { axes : Frame3d units coordinates {} + { axes : Frame3d units coordinates defines , xRadius : Quantity Float units , yRadius : Quantity Float units , zRadius : Quantity Float units @@ -105,7 +105,7 @@ with : -> Ellipsoid3d units coordinates with properties = Types.Ellipsoid3d - { axes = properties.axes + { axes = Frame3d.copy properties.axes , xRadius = Quantity.abs properties.xRadius , yRadius = Quantity.abs properties.yRadius , zRadius = Quantity.abs properties.zRadius diff --git a/tests/Geometry/Fuzz.elm b/tests/Geometry/Fuzz.elm index 09373756..0c8d4280 100644 --- a/tests/Geometry/Fuzz.elm +++ b/tests/Geometry/Fuzz.elm @@ -276,36 +276,6 @@ frame3d = Fuzz.map4 frame point3d direction3d Fuzz.bool Fuzz.bool -{-| Generate a random `Frame3d`. Note that the generated frame may be [either -left-handed or right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness). --} -globalFrame3d : Fuzzer (Frame3d Meters coordinates {}) -globalFrame3d = - let - frame originPoint xDirection reverseY reverseZ = - let - ( yDirection, zDirection ) = - Direction3d.perpendicularBasis xDirection - in - Frame3d.unsafe - { originPoint = originPoint - , xDirection = xDirection - , yDirection = - if reverseY then - Direction3d.reverse yDirection - - else - yDirection - , zDirection = - if reverseZ then - Direction3d.reverse zDirection - - else - zDirection - } - in - Fuzz.map4 frame point3d direction3d Fuzz.bool Fuzz.bool - {-| Generate a random `SketchPlane3d`. -} sketchPlane3d : Fuzzer (SketchPlane3d Meters coordinates { defines : sketchCoordinates }) @@ -530,7 +500,7 @@ ellipsoid3d = } in Fuzz.map2 ellipsoid - globalFrame3d + frame3d (Fuzz.tuple3 ( positiveLength, positiveLength, positiveLength )) From 226969520387c6b7e2e9c6e96b1004f5de2d3619 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Wed, 4 Nov 2020 09:53:53 -0300 Subject: [PATCH 13/14] Fix tests --- tests/Tests/Ellipsoid3d.elm | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/Tests/Ellipsoid3d.elm b/tests/Tests/Ellipsoid3d.elm index c7551583..f75deb0c 100644 --- a/tests/Tests/Ellipsoid3d.elm +++ b/tests/Tests/Ellipsoid3d.elm @@ -25,7 +25,7 @@ import Test exposing (Test) ellipsoidAtOriginWithRadii : ( Float, Float, Float ) -> Ellipsoid3d Meters coordinates ellipsoidAtOriginWithRadii ( x, y, z ) = Ellipsoid3d.with - { axes = Frame3d.atPoint (Point3d.meters 0 0 0) + { axes = Frame3d.atOrigin , xRadius = Length.meters x , yRadius = Length.meters y , zRadius = Length.meters z @@ -43,7 +43,7 @@ equivalences = \radius -> let sphere = - Sphere3d.withRadius (meters radius) (Point3d.meters 0 0 0) + Sphere3d.atOrigin (meters radius) ellipsoid = ellipsoidAtOriginWithRadii ( radius, radius, radius ) @@ -118,10 +118,11 @@ transformations = (Axis3d.translateBy vector axis) (Ellipsoid3d.translateBy vector ellipsoid) in - Expect.equal True <| - Quantity.equalWithin (Length.centimeters 1) - (Interval.width afterTransformation) - (Interval.width beforeTransformation) + afterTransformation + |> Expect.all + [ Interval.minValue >> Expect.quantity (Interval.minValue beforeTransformation) + , Interval.maxValue >> Expect.quantity (Interval.maxValue beforeTransformation) + ] ) , Test.fuzz2 (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.axis3d )) @@ -137,10 +138,11 @@ transformations = (Axis3d.mirrorAcross plane axis) (Ellipsoid3d.mirrorAcross plane ellipsoid) in - Expect.equal True <| - Quantity.equalWithin (Length.centimeters 1) - (Interval.width afterTransformation) - (Interval.width beforeTransformation) + afterTransformation + |> Expect.all + [ Interval.minValue >> Expect.quantity (Interval.minValue beforeTransformation) + , Interval.maxValue >> Expect.quantity (Interval.maxValue beforeTransformation) + ] ) , Test.fuzz2 (Fuzz.tuple ( Fuzz.ellipsoid3d, Fuzz.axis3d )) @@ -156,9 +158,10 @@ transformations = (Axis3d.rotateAround rotAxis angle axis) (Ellipsoid3d.rotateAround rotAxis angle ellipsoid) in - Expect.equal True <| - Quantity.equalWithin (Length.centimeters 1) - (Interval.width afterTransformation) - (Interval.width beforeTransformation) + afterTransformation + |> Expect.all + [ Interval.minValue >> Expect.quantity (Interval.minValue beforeTransformation) + , Interval.maxValue >> Expect.quantity (Interval.maxValue beforeTransformation) + ] ) ] From 178eb76bb5ead493b9693e25e8090bb9b931a072 Mon Sep 17 00:00:00 2001 From: Guilherme Belmonte Date: Wed, 4 Nov 2020 10:08:34 -0300 Subject: [PATCH 14/14] Fix `contains` function for ellipsoid --- src/Ellipsoid3d.elm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Ellipsoid3d.elm b/src/Ellipsoid3d.elm index 7e61f2a9..4301adfb 100644 --- a/src/Ellipsoid3d.elm +++ b/src/Ellipsoid3d.elm @@ -248,16 +248,16 @@ contains point ellipsoid = Point3d.zCoordinateIn localFrame point c1 = - Quantity.squared x - |> Quantity.ratio (Quantity.squared (xRadius ellipsoid)) + Quantity.squared (xRadius ellipsoid) + |> Quantity.ratio (Quantity.squared x) c2 = - Quantity.squared y - |> Quantity.ratio (Quantity.squared (yRadius ellipsoid)) + Quantity.squared (yRadius ellipsoid) + |> Quantity.ratio (Quantity.squared y) c3 = - Quantity.squared z - |> Quantity.ratio (Quantity.squared (zRadius ellipsoid)) + Quantity.squared (zRadius ellipsoid) + |> Quantity.ratio (Quantity.squared z) in c1 + c2 + c3 <= 1