-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathdocs.json
1 lines (1 loc) · 558 KB
/
docs.json
1
[{"name":"Arc2d","comment":" An `Arc2d` is a section of a circle, defined by its center point, start\npoint and swept angle (the counterclockwise angle from the start point to the\nend point). This module includes functionality for\n\n - Constructing arcs through given points and/or with a given radius\n - Scaling, rotating, translating and mirroring arcs\n - Converting arcs between different coordinate systems\n\n@docs Arc2d\n\n\n# Constructors\n\n@docs from, with, sweptAround, throughPoints, withRadius\n\n\n# Properties\n\n@docs centerPoint, radius, startPoint, midpoint, endPoint, sweptAngle, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate, toPolyline\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, numApproximationSegments\n\n","unions":[{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"Arc2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Arc2d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate an arc as a polyline, within a given tolerance:\n\n Arc2d.approximate (Length.meters 0.1) exampleArc\n --> Polyline2d.fromVertices\n --> [ Point2d.meters 3 1\n --> , Point2d.meters 2.732 2\n --> , Point2d.meters 2 2.732\n --> , Point2d.meters 1 3\n --> ]\n\nIn this example, every point on the returned polyline will be within 0.1 meters\nof the original arc.\n\n","type":"Quantity.Quantity Basics.Float units -> Arc2d.Arc2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"at","comment":" Convert an arc from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Arc2d.Arc2d units1 coordinates -> Arc2d.Arc2d units2 coordinates"},{"name":"at_","comment":" Convert an arc from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Arc2d.Arc2d units1 coordinates -> Arc2d.Arc2d units2 coordinates"},{"name":"boundingBox","comment":" Get a bounding box for a given arc.\n","type":"Arc2d.Arc2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centerPoint","comment":" Get the center point of an arc.\n","type":"Arc2d.Arc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"endPoint","comment":" Get the end point of an arc.\n","type":"Arc2d.Arc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of an arc at a given parameter value.\n","type":"Arc2d.Arc2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"from","comment":" Construct an arc with from the first given point to the second, with the\ngiven swept angle.\n\n p1 =\n Point2d.meters 2 1\n\n p2 =\n Point2d.meters 1 2\n\n arc1 =\n Arc2d.from p1 p2 (Angle.degrees 90)\n\n Arc2d.centerPoint arc1\n --> Point2d.meters 1 1\n\n arc2 =\n Arc2d.from p1 p2 (Angle.degrees -90)\n\n Arc2d.centerPoint arc2\n --> Point2d.meters 2 2\n\n arc3 =\n Arc2d.from p1 p2 (Angle.degrees 180)\n\n Arc2d.centerPoint arc3\n --> Point2d.meters 1.5 1.5\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Angle.Angle -> Arc2d.Arc2d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate arc back to a general `Arc2d`.\n","type":"Arc2d.Nondegenerate units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"midpoint","comment":" Get the midpoint of an arc.\n","type":"Arc2d.Arc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an arc across a given axis. This negates the sign of the arc's\nswept angle.\n","type":"Axis2d.Axis2d units coordinates -> Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate arc from a general `Arc2d`. If the arc\nis in fact degenerate (consists of a single point), returns an `Err` with that\npoint.\n","type":"Arc2d.Arc2d units coordinates -> Result.Result (Point2d.Point2d units coordinates) (Arc2d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate an arc to\nwithin a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> Arc2d.Arc2d units coordinats -> Basics.Int"},{"name":"placeIn","comment":" Take an arc considered to be defined in local coordinates relative to a\ngiven reference frame, and return that arc expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Arc2d.Arc2d units localCoordinates -> Arc2d.Arc2d units globalCoordinates"},{"name":"pointOn","comment":" Get the point along an arc at a given parameter value.\n","type":"Arc2d.Arc2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"radius","comment":" Get the radius of an arc.\n","type":"Arc2d.Arc2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take an arc defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Arc2d.Arc2d units globalCoordinates -> Arc2d.Arc2d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an arc, so that the start point becomes the end\npoint and vice versa.\n","type":"Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"rotateAround","comment":" Rotate an arc around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate arc at a given\nparameter value.\n","type":"Arc2d.Nondegenerate units coordinates -> Basics.Float -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"scaleAbout","comment":" Scale an arc about a given point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"segments","comment":" Approximate an arc by a given number of line segments:\n\n Arc2d.segments 2 exampleArc\n --> Polyline2d.fromVertices\n --> [ Point2d.meters 3 1\n --> , Point2d.meters 2.4142 2.4142\n --> , Point2d.meters 1 3\n --> ]\n\nNote that the number of points in the polyline is one more than the number of\nsegments.\n\n","type":"Basics.Int -> Arc2d.Arc2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"startPoint","comment":" Get the start point of an arc.\n","type":"Arc2d.Arc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"sweptAngle","comment":" Get the swept angle of an arc. The result will be positive for a\ncounterclockwise arc and negative for a clockwise one.\n","type":"Arc2d.Arc2d units coordinates -> Angle.Angle"},{"name":"sweptAround","comment":" Construct an arc by sweeping (rotating) a given start point around a given\ncenter point by a given angle. The center point to sweep around is given first\nand the start point to be swept is given last.\n\n exampleArc =\n Point2d.meters 3 1\n |> Arc2d.sweptAround (Point2d.meters 1 1)\n (Angle.degrees 90)\n\n Arc2d.endPoint exampleArc\n --> Point2d.meters 1 3\n\nA positive swept angle means that the arc is formed by rotating the start point\ncounterclockwise around the center point. A negative swept angle results in\na clockwise arc instead.\n\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Point2d.Point2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate arc at a given parameter\nvalue.\n","type":"Arc2d.Nondegenerate units coordinates -> Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"throughPoints","comment":" Attempt to construct an arc that starts at the first given point, passes\nthrough the second given point and ends at the third given point:\n\n Arc2d.throughPoints\n Point2d.origin\n (Point2d.meters 1 0)\n (Point2d.meters 0 1)\n --> Just\n --> (Point2d.origin\n --> |> Arc2d.sweptAround\n --> (Point2d.meters 0.5 0.5)\n --> (Angle.degrees 270)\n --> )\n\nIf the three points are collinear, returns `Nothing`:\n\n Arc2d.throughPoints\n Point2d.origin\n (Point2d.meters 1 0)\n (Point2d.meters 2 0)\n --> Nothing\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Maybe.Maybe (Arc2d.Arc2d units coordinates)"},{"name":"toPolyline","comment":" DEPRECATED - use [`segments`](#segments) or [`approximate`](#approximate)\ninstead.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> Arc2d.Arc2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"translateBy","comment":" Translate an arc by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"translateIn","comment":" Translate an arc in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Arc2d.Arc2d units coordinates -> Arc2d.Arc2d units coordinates"},{"name":"with","comment":" Construct an arc with the given center point, radius, start angle and swept\nangle:\n\n arc =\n Arc2d.with\n { centerPoint = Point2d.meters 2 0\n , radius = Length.meters 1\n , startAngle = Angle.degrees 45\n , sweptAngle = Angle.degrees -90\n }\n\n Arc2d.startPoint arc\n --> Point2d.meters 2.7071 0.7071\n\n Arc2d.endPoint arc\n --> Point2d.meters 2.7071 -0.7071\n\n","type":"{ centerPoint : Point2d.Point2d units coordinates, radius : Quantity.Quantity Basics.Float units, startAngle : Angle.Angle, sweptAngle : Angle.Angle } -> Arc2d.Arc2d units coordinates"},{"name":"withRadius","comment":" Attempt to construct an arc with the given radius between the given start\nand end points. Note that this is only possible if the given radius is large\nenough! For any given valid radius, start point and end point, there are four\npossible results, so the [`SweptAngle`](SweptAngle) argument is used to specify\nwhich arc to create. For example:\n\n p1 =\n Point2d.meters 1 0\n\n p2 =\n Point2d.meters 0 1\n\n Arc2d.withRadius (Length.meters 1)\n SweptAngle.smallPositive\n p1\n p2\n --> Just\n --> (Point2d.meters 1 0\n --> |> Arc2d.sweptAround Point2d.origin\n --> (Angle.degrees 90)\n --> )\n\nIf the start and end points are coincident or the distance between them is more\nthan twice the given radius, returns `Nothing`:\n\n -- p1 and p2 are too far apart to be connected by an\n -- arc of radius 0.5\n Arc2d.withRadius (Length.meters 0.5)\n SweptAngle.smallPositive\n p1\n p2\n --> Nothing\n\nNote that this means it is dangerous to use this function to construct 180\ndegree arcs (half circles), since in this case due to numerical roundoff the\ndistance between the two given points may appear to be slightly more than twice\nthe given radius. In this case it is safer to use `Arc2d.from`, such as (for a\ncounterclockwise arc):\n\n halfCircle =\n Arc2d.from firstPoint secondPoint <|\n Angle.degrees 180\n\n(Use `Angle.degrees -180` for a clockwise arc.)\n\n","type":"Quantity.Quantity Basics.Float units -> SweptAngle.SweptAngle -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Maybe.Maybe (Arc2d.Arc2d units coordinates)"}],"binops":[]},{"name":"Arc3d","comment":" An `Arc3d` is a section of a circle in 3D, defined by its central axis,\nstart point and swept angle (the counterclockwise angle around the axis from the\nstart point to the arc's end point). This module includes functionality for\n\n - Constructing arcs through given points\n - Scaling, rotating, translating and mirroring arcs\n - Converting arcs between different coordinate systems\n\n@docs Arc3d\n\n\n# Constructors\n\n@docs on, sweptAround, throughPoints\n\n\n# Properties\n\n@docs axialDirection, axis, centerPoint, radius, startPoint, midpoint, endPoint, sweptAngle, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate, toPolyline\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, projectInto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, numApproximationSegments\n\n","unions":[{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"Arc3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Arc3d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate an arc as a polyline, within a given tolerance:\n\n Arc3d.approximate (Length.meters 0.1) exampleArc\n --> Polyline3d.fromVertices\n --> [ Point3d.meters 1 1 0\n --> , Point3d.meters 0.366 1.366 0\n --> , Point3d.meters -0.366 1.366 0\n --> , Point3d.meters -1 1 0\n --> ]\n\nIn this example, every point on the returned polyline will be within 0.1 meters\nof the original arc.\n\n","type":"Quantity.Quantity Basics.Float units -> Arc3d.Arc3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"at","comment":" Convert an arc from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Arc3d.Arc3d units1 coordinates -> Arc3d.Arc3d units2 coordinates"},{"name":"at_","comment":" Convert an arc from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Arc3d.Arc3d units1 coordinates -> Arc3d.Arc3d units2 coordinates"},{"name":"axialDirection","comment":" Get the axial direction of an arc.\n\n Arc3d.axialDirection exampleArc\n --> Direction3d.z\n\n","type":"Arc3d.Arc3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"axis","comment":" Get the central axis of an arc. The origin point of the axis will be equal\nto the center point of the arc.\n","type":"Arc3d.Arc3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"boundingBox","comment":" Get a bounding box for a given arc.\n","type":"Arc3d.Arc3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of an arc.\n","type":"Arc3d.Arc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"endPoint","comment":" Get the end point of an arc.\n","type":"Arc3d.Arc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of an arc at a given parameter value.\n","type":"Arc3d.Arc3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate arc back to a general `Arc3d`.\n","type":"Arc3d.Nondegenerate units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"midpoint","comment":" Get the midpoint of an arc.\n","type":"Arc3d.Arc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an arc across a given plane. This flips the sign of the arc's swept\nangle.\n","type":"Plane3d.Plane3d units coordinates -> Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate arc from a general `Arc3d`. If the arc\nis in fact degenerate (consists of a single point), returns an `Err` with that\npoint.\n","type":"Arc3d.Arc3d units coordinates -> Result.Result (Point3d.Point3d units coordinates) (Arc3d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate an arc to\nwithin a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> Arc3d.Arc3d units coordinats -> Basics.Int"},{"name":"on","comment":" Construct a 3D arc lying _on_ a sketch plane by providing a 2D arc specified\nin XY coordinates _within_ the sketch plane.\n\n arc =\n Arc3d.on SketchPlane3d.xz\n (Point2d.meters 3 1\n |> Arc2d.sweptAround (Point2d.meters 1 1)\n (Angle.degrees 90)\n )\n\n Arc3d.startPoint arc\n --> Point3d.meters 3 0 1\n\n Arc3d.endPoint arc\n --> Point3d.meters 1 0 3\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Arc2d.Arc2d units coordinates2d -> Arc3d.Arc3d units coordinates3d"},{"name":"placeIn","comment":" Take an arc considered to be defined in local coordinates relative to a\ngiven reference frame, and return that arc expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Arc3d.Arc3d units localCoordinates -> Arc3d.Arc3d units globalCoordinates"},{"name":"pointOn","comment":" Get the point along an arc at a given parameter value.\n","type":"Arc3d.Arc3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"projectInto","comment":" Project an arc into a sketch plane. Note that the result is an elliptical\narc, not a circular one!\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Arc3d.Arc3d units coordinates3d -> EllipticalArc2d.EllipticalArc2d units coordinates2d"},{"name":"projectOnto","comment":" Project an arc onto a plane. Note that the result is an elliptical arc, not\na circular one!\n","type":"Plane3d.Plane3d units coordinates -> Arc3d.Arc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"radius","comment":" Get the radius of an arc.\n","type":"Arc3d.Arc3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take an arc defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Arc3d.Arc3d units globalCoordinates -> Arc3d.Arc3d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an arc, so that the start point becomes the end\npoint and vice versa. The resulting arc will have the same axis as the original\nbut a swept angle with the opposite sign.\n","type":"Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"rotateAround","comment":" Rotate an arc around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate arc at a given\nparameter value.\n","type":"Arc3d.Nondegenerate units coordinates -> Basics.Float -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"scaleAbout","comment":" Scale an arc about the given center point by the given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"segments","comment":" Approximate an arc by a given number of line segments:\n\n Arc3d.segments 3 exampleArc\n --> Polyline3d.fromVertices\n --> [ Point3d.meters 1 1 0\n --> , Point3d.meters 1 1.4142 0\n --> , Point3d.meters -1 1 0\n --> ]\n\n","type":"Basics.Int -> Arc3d.Arc3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"startPoint","comment":" Get the start point of an arc.\n","type":"Arc3d.Arc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"sweptAngle","comment":" Get the swept angle of an arc. A positive swept angle means that the arc is\nformed by rotating the given start point counterclockwise around the central\naxis, and vice versa for a negative angle.\n","type":"Arc3d.Arc3d units coordinates -> Angle.Angle"},{"name":"sweptAround","comment":" Construct an arc by sweeping the given point around the given axis by the\ngiven angle:\n\n exampleArc =\n Point3d.meters 1 1 0\n |> Arc3d.sweptAround Axis3d.z\n (Angle.degrees 90)\n\n Arc3d.endPoint exampleArc\n --> Point3d.meters -1 1 0\n\nPositive swept angles result in a counterclockwise (right-handed) rotation\naround the given axis and vice versa for negative swept angles. The center point\nof the returned arc will lie on the given axis.\n\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Point3d.Point3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate arc at a given parameter\nvalue.\n","type":"Arc3d.Nondegenerate units coordinates -> Basics.Float -> Direction3d.Direction3d coordinates"},{"name":"throughPoints","comment":" Attempt to construct an arc that starts at the first given point, passes\nthrough the second given point and ends at the third given point. If the three\npoints are collinear, returns `Nothing`.\n\n Arc3d.throughPoints\n (Point3d.meters 0 0 1)\n Point3d.origin\n (Point3d.meters 0 1 0)\n --> Just <|\n --> Arc3d.on SketchPlane3d.yz\n --> (Point2d.meters 0 1\n --> |> Arc2d.sweptAround\n --> (Point2d.meters 0.5 0.5)\n --> (Angle.degrees 180)\n --> )\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Arc3d.Arc3d units coordinates)"},{"name":"toPolyline","comment":" DEPRECATED - use [`segments`](#segments) or [`approximate`](#approximate)\ninstead.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> Arc3d.Arc3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"translateBy","comment":" Translate an arc by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"},{"name":"translateIn","comment":" Translate an arc in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Arc3d.Arc3d units coordinates -> Arc3d.Arc3d units coordinates"}],"binops":[]},{"name":"ArcLengthParameterization","comment":" _You will likely never need to use this module directly._ In the vast\nmajority of cases the individual curve modules such as `QuadraticSpline2d`\nshould contain all the functionality you need to construct an arc length\nparameterization and use it to do things like evaluate a curve at evenly-spaced\npoints. This module is primarily for use internally by those curve modules, but\nmay be useful if you want to do some fancy mapping between arc length and curve\nparameter values.\n\n@docs ArcLengthParameterization\n\n\n# Constructing\n\n@docs build\n\n\n# Evaluating\n\n@docs totalArcLength, arcLengthToParameterValue, parameterValueToArcLength\n\n","unions":[{"name":"ArcLengthParameterization","comment":" Contains a mapping from curve parameter value to arc length, and vice versa.\nParameter values are assumed to range from 0 to 1.\n","args":["units"],"cases":[]}],"aliases":[],"values":[{"name":"arcLengthToParameterValue","comment":" Convert an arc length to the corresponding parameter value. The given arc\nlength will be clamped to the range [0, length].\n","type":"Quantity.Quantity Basics.Float units -> ArcLengthParameterization.ArcLengthParameterization units -> Basics.Float"},{"name":"build","comment":" Build an arc length parameterization for some curve. You must supply:\n\n - A `derivativeMagnitude` function that returns the magnitude of the first\n derivative of the curve at a given parameter value\n - The maximum magnitude of the second derivative of the curve\n - A tolerance specifying the maximum error of the resulting parameterization\n\n","type":"{ derivativeMagnitude : Basics.Float -> Quantity.Quantity Basics.Float units, maxSecondDerivativeMagnitude : Quantity.Quantity Basics.Float units, maxError : Quantity.Quantity Basics.Float units } -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"parameterValueToArcLength","comment":" Convert a parameter value to the corresponding arc length. The parameter\nvalue will be clamped to the range [0, 1].\n","type":"Basics.Float -> ArcLengthParameterization.ArcLengthParameterization units -> Quantity.Quantity Basics.Float units"},{"name":"totalArcLength","comment":" Find the total arc length of some curve given its arc length\nparameterization;\n\n ArcLengthParameterization.totalArcLength\n parameterization\n\nis equivalent to\n\n ArcLengthParameterization.parameterValueToArcLength 1\n parameterization\n\nbut is more efficient. The arc length will be accurate to within the maximum\nerror specified when building the parameterization.\n\n","type":"ArcLengthParameterization.ArcLengthParameterization units -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"Axis2d","comment":" An `Axis2d` represents an infinitely long straight line in 2D and is defined\nby an origin point and direction. Axes have several uses, such as:\n\n - Mirroring across the axis\n - Projecting onto the axis\n - Measuring distance along the axis from the origin point\n\n@docs Axis2d\n\n\n# Constants\n\n@docs x, y\n\n\n# Constructors\n\n@docs through, withDirection, throughPoints\n\n\n# Properties\n\n@docs originPoint, direction\n\n\n# Transformations\n\n@docs reverse, moveTo, rotateAround, rotateBy, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Axis2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Axis2d units coordinates"}],"values":[{"name":"at","comment":" Convert an axis from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Axis2d.Axis2d units1 coordinates -> Axis2d.Axis2d units2 coordinates"},{"name":"at_","comment":" Convert an axis from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Axis2d.Axis2d units1 coordinates -> Axis2d.Axis2d units2 coordinates"},{"name":"direction","comment":" Get the direction of an axis.\n\n Axis2d.direction exampleAxis\n --> Direction2d.degrees 30\n\n","type":"Axis2d.Axis2d units coordinates -> Direction2d.Direction2d coordinates"},{"name":"mirrorAcross","comment":" Mirror one axis across another. The axis to mirror across is given first and\nthe axis to mirror is given second.\n\n Axis2d.mirrorAcross Axis2d.x exampleAxis\n --> Axis2d.through (Point2d.meters 1 -3)\n --> (Direction2d.degrees -30)\n\n","type":"Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"moveTo","comment":" Move an axis so that it has the given origin point but unchanged direction.\n","type":"Point2d.Point2d units coordinates -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"originPoint","comment":" Get the origin point of an axis.\n\n Axis2d.originPoint exampleAxis\n --> Point2d.meters 1 3\n\n","type":"Axis2d.Axis2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"placeIn","comment":" Take an axis defined in local coordinates relative to a given reference\nframe, and return that axis expressed in global coordinates.\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Axis2d.Axis2d units localCoordinates -> Axis2d.Axis2d units globalCoordinates"},{"name":"relativeTo","comment":" Take an axis defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Axis2d.Axis2d units globalCoordinates -> Axis2d.Axis2d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an axis while keeping the same origin point.\n","type":"Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"rotateAround","comment":" Rotate an axis around a given center point by a given angle. Rotates the\naxis' origin point around the given point by the given angle and the axis'\ndirection by the given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"rotateBy","comment":" Rotate an axis around its own origin point by the given angle.\n","type":"Angle.Angle -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"through","comment":" Construct an axis through the given origin point with the given direction.\n\n exampleAxis =\n Axis2d.through (Point2d.meters 1 3)\n (Direction2d.degrees 30)\n\n","type":"Point2d.Point2d units coordinates -> Direction2d.Direction2d coordinates -> Axis2d.Axis2d units coordinates"},{"name":"throughPoints","comment":" Attempt to construct an axis through the two given points;\n\n Axis2d.throughPoints p1 p2\n\nis equivalent to\n\n Maybe.map (Axis2d.through firstPoint)\n (Direction2d.from firstPoint secondPoint)\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Maybe.Maybe (Axis2d.Axis2d units coordinates)"},{"name":"translateBy","comment":" Translate an axis by a given displacement. Applies the given displacement to\nthe axis' origin point and leaves the direction unchanged.\n","type":"Vector2d.Vector2d units coordinates -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"translateIn","comment":" Translate an axis in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Axis2d.Axis2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"withDirection","comment":" Construct an axis with the given direction, through the given origin point.\nFlipped version of `through`. Having both versions allow you to do different\nthings with partial application:\n\n -- A list of axes in different directions all passing\n -- through the same origin point\n List.map (Axis2d.through point) directions\n\n -- A list of parallel axes (all having the same\n -- direction) through different points\n List.map (Axis2d.withDirection direction) points\n\n","type":"Direction2d.Direction2d coordinates -> Point2d.Point2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"x","comment":" The global X axis.\n\n Axis2d.x\n --> Axis2d.through Point2d.origin Direction2d.x\n\n","type":"Axis2d.Axis2d units coordinates"},{"name":"y","comment":" The global Y axis.\n\n Axis2d.y\n --> Axis2d.through Point2d.origin Direction2d.y\n\n","type":"Axis2d.Axis2d units coordinates"}],"binops":[]},{"name":"Axis3d","comment":" An `Axis3d` represents an infinitely long straight line in 3D and is defined\nby an origin point and direction. Axes have several uses, such as:\n\n - Rotating around the axis\n - Projecting onto the axis\n - Measuring distance along the axis from the origin point\n\n@docs Axis3d\n\n\n# Constants\n\n@docs x, y, z\n\n\n# Constructors\n\n@docs through, withDirection, throughPoints, on\n\n\n# Properties\n\n@docs originPoint, direction\n\n\n# Intersection\n\n@docs intersectionWithPlane, intersectionWithSphere\n\n\n# Transformations\n\n@docs reverse, moveTo, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n","unions":[],"aliases":[{"name":"Axis3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Axis3d units coordinates"}],"values":[{"name":"at","comment":" Convert an axis from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Axis3d.Axis3d units1 coordinates -> Axis3d.Axis3d units2 coordinates"},{"name":"at_","comment":" Convert an axis from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Axis3d.Axis3d units1 coordinates -> Axis3d.Axis3d units2 coordinates"},{"name":"direction","comment":" Get the direction of an axis.\n","type":"Axis3d.Axis3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"intersectionWithPlane","comment":" Try to find the unique intersection point of an axis with a plane. If\nthe axis does not intersect the plane, or if it is coplanar with it (lying\nperfectly in the plane), returns `Nothing`.\n","type":"Geometry.Types.Plane3d units coordinates -> Axis3d.Axis3d units coordinates -> Maybe.Maybe (Point3d.Point3d units coordinates)"},{"name":"intersectionWithSphere","comment":" Attempt to find the intersection of an axis with a sphere. The two points\nwill be in order of signed distance along the axis. Returns `Nothing` if there\nis no intersection.\n","type":"Geometry.Types.Sphere3d units coordinates -> Axis3d.Axis3d units coordinates -> Maybe.Maybe ( Point3d.Point3d units coordinates, Point3d.Point3d units coordinates )"},{"name":"mirrorAcross","comment":" Mirror an axis across a plane.\n\n Axis3d.mirrorAcross Plane3d.xy exampleAxis\n --> Axis3d.withDirection Direction3d.y\n --> (Point3d.meters 1 2 -3)\n\n","type":"Geometry.Types.Plane3d units coordinates -> Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"moveTo","comment":" Move an axis so that it has the given origin point but unchanged direction.\n","type":"Point3d.Point3d units coordinates -> Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"on","comment":" Construct a 3D axis lying _on_ a sketch plane by providing a 2D axis\nspecified in XY coordinates _within_ the sketch plane.\n\n axis2d =\n Axis2d.through (Point2d.meters 1 3)\n (Direction2d.degrees 30)\n\n Axis3d.on SketchPlane3d.xy axis2d\n --> Axis3d.through (Point3d.meters 1 3 0)\n --> (Direction3d.xy (Angle.degrees 30))\n\n Axis3d.on SketchPlane3d.zx axis2d\n --> Axis3d.through (Point3d.meters 3 0 1)\n --> (Direction3d.zx (Angle.degees 30))\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Axis2d.Axis2d units coordinates2d -> Axis3d.Axis3d units coordinates3d"},{"name":"originPoint","comment":" Get the origin point of an axis.\n","type":"Axis3d.Axis3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"placeIn","comment":" Take an axis defined in local coordinates relative to a given reference\nframe, and return that axis expressed in global coordinates.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Axis3d.Axis3d units localCoordinates -> Axis3d.Axis3d units globalCoordinates"},{"name":"projectInto","comment":" Project an axis into a given sketch plane. Conceptually, this finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the axis onto the plane and then expresses the projected axis in 2D sketch\ncoordinates.\n\nThis is only possible if the axis is not perpendicular to the sketch\nplane; if it is perpendicular, `Nothing` is returned.\n\n Axis3d.projectInto SketchPlane3d.xy exampleAxis\n --> Just <|\n --> Axis2d.withDirection Direction2d.y\n --> (Point2d.meters 1 2)\n\n -- The global Y direction is the X direction of the\n -- YZ plane:\n Axis3d.projectInto SketchPlane3d.yz exampleAxis\n --> Just <|\n --> Axis2d.withDirection Direction2d.x\n --> (Point2d.meters 2 3)\n\n Axis3d.projectInto SketchPlane3d.xz exampleAxis\n --> Nothing\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Axis3d.Axis3d units coordinates3d -> Maybe.Maybe (Axis2d.Axis2d units coordinates2d)"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof an axis onto a plane. If the given axis is exactly perpendicular to the given\nplane, returns `Nothing`.\n\n Axis3d.projectOnto Plane3d.xy exampleAxis\n --> Just <|\n --> Axis3d.withDirection Direction3d.y\n --> (Point3d.meters 1 2 0)\n\n Axis3d.projectOnto Plane3d.xy Axis3d.z\n --> Nothing\n\n","type":"Geometry.Types.Plane3d units coordinates -> Axis3d.Axis3d units coordinates -> Maybe.Maybe (Axis3d.Axis3d units coordinates)"},{"name":"relativeTo","comment":" Take an axis defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Axis3d.Axis3d units globalCoordinates -> Axis3d.Axis3d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an axis while keeping the same origin point.\n","type":"Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"rotateAround","comment":" Rotate an axis around another axis by a given angle. The axis to rotate\naround is given first and the axis to rotate is given last.\n\n exampleAxis\n |> Axis3d.rotateAround Axis3d.z\n (Angle.degrees 90)\n --> Axis3d.withDirection Direction3d.negativeX\n --> (Point3d.meters -2 1 3)\n\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"through","comment":" Construct an axis through the given point, with the given direction.\n\n exampleAxis =\n Axis3d.through (Point3d.meters 1 2 3) Direction3d.y\n\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> Axis3d.Axis3d units coordinates"},{"name":"throughPoints","comment":" Attempt to construct an axis through the two given points;\n\n Axis3d.throughPoints p1 p2\n\nis equivalent to\n\n Maybe.map (Axis3d.through firstPoint)\n (Direction3d.from firstPoint secondPoint)\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Axis3d.Axis3d units coordinates)"},{"name":"translateBy","comment":" Translate an axis by a given displacement. Applies the given displacement to\nthe axis' origin point and leaves the direction unchanged.\n","type":"Vector3d.Vector3d units coordinates -> Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"translateIn","comment":" Translate an axis in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Axis3d.Axis3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"withDirection","comment":" Construct an axis with the given directoin, through the given point. Flipped\nversion of `through`. Having both versions allow you to do different\nthings with partial application:\n\n -- A list of axes in different directions all passing\n -- through the same origin point\n List.map (Axis3d.through point) directions\n\n -- A list of parallel axes (all having the same\n -- direction) through different points\n List.map (Axis3d.withDirection direction) points\n\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"x","comment":" The global X axis.\n\n Axis3d.x\n --> Axis3d.through Point3d.origin Direction3d.x\n\n","type":"Axis3d.Axis3d units coordinates"},{"name":"y","comment":" The global Y axis.\n\n Axis3d.y\n --> Axis3d.through Point3d.origin Direction3d.y\n\n","type":"Axis3d.Axis3d units coordinates"},{"name":"z","comment":" The global Z axis.\n\n Axis3d.z\n --> Axis3d.through Point3d.origin Direction3d.z\n\n","type":"Axis3d.Axis3d units coordinates"}],"binops":[]},{"name":"Block3d","comment":" A `Block3d` represents a rectangular block in 3D space. This module contains\nblock-related functionality such as:\n\n - Constructing blocks in various ways\n - Extracting block vertices and edges\n - Scaling, rotating, translating and mirroring blocks\n - Converting blocks between different coordinate systems\n\nUnlike bounding boxes, blocks are _not_ constrained to be axis-aligned -\nthey can have arbitrary orientation and so can be rotated, mirrored etc.\n\n@docs Block3d\n\n\n# Construction\n\n@docs with, from, centeredOn, fromBoundingBox\n\n\n# Properties\n\n@docs dimensions, axes, xAxis, yAxis, zAxis, centerPoint, volume, vertices, edges, boundingBox\n\n\n# Interpolation\n\n@docs interpolate\n\n\n# Querying\n\n@docs contains\n\n\n# Transformation\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Block3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Block3d units coordinates"}],"values":[{"name":"at","comment":" Convert a block from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Block3d.Block3d units1 coordinates -> Block3d.Block3d units2 coordinates"},{"name":"at_","comment":" Convert a block from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Block3d.Block3d units1 coordinates -> Block3d.Block3d units2 coordinates"},{"name":"axes","comment":" Get the central axes of a block as a `Frame3d`. The origin point of the\nframe will be the center point of the block.\n","type":"Block3d.Block3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given block. This will have\nexactly the same shape and size as the block itself if the block is\naxis-aligned, but will be larger than the block if the block is at an\nangle.\n\n cube =\n Block3d.from\n (Point3d.meters 0 0 0)\n (Point3d.meters 1 1 1)\n\n rotatedCube =\n cube\n |> Block3d.rotateAround Axis3d.y\n (Angle.degrees -45)\n\n Block3d.boundingBox rotatedCube\n --> BoundingBox3d.fromExtrema\n --> { minX = Length.meters -0.7071\n --> , maxX = Length.meters 0.7071\n --> , minY = Length.meters 0\n --> , maxY = Length.meters 1\n --> , minZ = Length.meters 0\n --> , maxZ = Length.meters 1.4142\n --> }\n\n","type":"Block3d.Block3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a block.\n","type":"Block3d.Block3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"centeredOn","comment":" Construct a frame centered on the given axes, with the given overall\ndimensions (length/width/height):\n\n block =\n Block3d.centeredOn Frame3d.atOrigin\n ( meters 20, meters 10, meters 30 )\n\n Block3d.vertices block\n --> [ Point3d.meters -10 -5 -15\n --> , Point3d.meters -10 -5 15\n --> , Point3d.meters -10 5 -15\n --> , Point3d.meters -10 5 15\n --> , Point3d.meters 10 -5 -15\n --> , Point3d.meters 10 -5 15\n --> , Point3d.meters 10 5 -15\n --> , Point3d.meters 10 5 15\n --> ]\n\n","type":"Frame3d.Frame3d units coordinates defines -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Block3d.Block3d units coordinates"},{"name":"contains","comment":" Check if a block contains a given point:\n\n block =\n Block3d.from\n (Point3d.meters 2 1 0)\n (Point3d.meters 5 3 4)\n\n block |> Block3d.contains (Point3d.meters 3 2 3)\n --> True\n\n block |> Block3d.contains (Point3d.meters 3 4 1)\n --> False\n\n","type":"Point3d.Point3d units coordinates -> Block3d.Block3d units coordinates -> Basics.Bool"},{"name":"dimensions","comment":" Get the overall dimensions (e.g. length, width, height) of a block.\n","type":"Block3d.Block3d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"edges","comment":" Get the 12 edges of a block as a list. The orientation of each edge and the\norder in which they are returned are unspecified.\n","type":"Block3d.Block3d units coordinates -> List.List (LineSegment3d.LineSegment3d units coordinates)"},{"name":"from","comment":" Construct an axis-aligned block stretching from one point to another;\n\n Block3d.from p1 p2\n\nis equivalent to\n\n Block3d.with\n { x1 = Point3d.xCoordinate p1\n , y1 = Point3d.yCoordinate p1\n , z1 = Point3d.zCoordinate p1\n , x2 = Point3d.xCoordinate p2\n , y2 = Point3d.yCoordinate p2\n , z2 = Point3d.zCoordinate p2\n }\n\nand so the same logic about the resulting block's X, Y and Z directions\napplies (see above for details).\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"fromBoundingBox","comment":" Convert a `BoundingBox3d` to the equivalent axis-aligned `Block3d`.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"interpolate","comment":" Interpolate within a block based on coordinates which range from 0 to 1.\nFor example, the center point of a block is\n\n Block3d.interpolate block 0.5 0.5 0.5\n\n","type":"Block3d.Block3d units coordinates -> Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a block across a given plane. Note that this will flip the\nhandedness of the block's axes.\n","type":"Plane3d.Plane3d units coordinates -> Block3d.Block3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"placeIn","comment":" Take a block considered to be defined in local coordinates relative to a\ngiven reference frame, and return that block expressed in global\ncoordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Block3d.Block3d units localCoordinates -> Block3d.Block3d units globalCoordinates"},{"name":"relativeTo","comment":" Take a block defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Block3d.Block3d units globalCoordinates -> Block3d.Block3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a block around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Block3d.Block3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"scaleAbout","comment":" Scale a block about a given point by a given scale. Note that scaling by\na negative value will flip the handedness of the block's axes, and therefore\nthe order/direction of results from `Block3d.vertices` and\n`Block3d.edges` will change.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Block3d.Block3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"translateBy","comment":" Translate a block by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Block3d.Block3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"translateIn","comment":" Translate a block in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Block3d.Block3d units coordinates -> Block3d.Block3d units coordinates"},{"name":"vertices","comment":" Get the 8 vertices of a block as a list. The order of the vertices\nreturned is unspecified.\n","type":"Block3d.Block3d units coordinates -> List.List (Point3d.Point3d units coordinates)"},{"name":"volume","comment":" Get the volume of a block.\n","type":"Block3d.Block3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Cubed units)"},{"name":"with","comment":" Construct an axis-aligned block given the X, Y and Z coordinates of two\ndiagonally opposite vertices. The X, Y and Z directions of the resulting block\nare determined by the order of the given values. For example, if `x1 <= x2`,\nthen the block's X direction will be `Direction3d.positiveX`, otherwise it will\nbe `Direction3d.negativeX`, and similar for Y and Z. Therefore, something like\n\n Block3d.with\n { x1 = Length.meters 0\n , x2 = Length.meters 500\n , y1 = Length.meters 300\n , y2 = Length.meters 0\n , z1 = Length.meters 100\n , z2 = Length.meters 200\n }\n\nwould have its X direction equal to `Direction3d.positiveX`, its Y direction\nequal to `Direction3d.negativeY`, and its Z direction equal to `Direction3d.positiveZ`.\n\n","type":"{ x1 : Quantity.Quantity Basics.Float units, y1 : Quantity.Quantity Basics.Float units, z1 : Quantity.Quantity Basics.Float units, x2 : Quantity.Quantity Basics.Float units, y2 : Quantity.Quantity Basics.Float units, z2 : Quantity.Quantity Basics.Float units } -> Block3d.Block3d units coordinates"},{"name":"xAxis","comment":" Get the X axis of a block.\n","type":"Block3d.Block3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"yAxis","comment":" Get the Y axis of a block.\n","type":"Block3d.Block3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"zAxis","comment":" Get the Z axis of a block.\n","type":"Block3d.Block3d units coordinates -> Axis3d.Axis3d units coordinates"}],"binops":[]},{"name":"BoundingBox2d","comment":" A `BoundingBox2d` is a rectangular box in 2D defined by its minimum and\nmaximum X and Y values. It is possible to generate bounding boxes for most\ngeometric objects; for example, [`Triangle2d.boundingBox`](Triangle2d#boundingBox)\ntakes a `Triangle2d` and returns a `BoundingBox2d` that contains that triangle.\nThere are several use cases where it is more efficient to deal with the bounding\nbox of an object than the object itself, such as:\n\n - Intersection checking: If (for example) the bounding boxes of a line segment\n and a triangle do not overlap, then the line segment and triangle cannot\n possibly intersect each other. Expensive intersection checking therefore\n only has to be performed for line segments and triangles whose bounding\n boxes _do_ overlap.\n - 2D rendering: When rendering a 2D scene, any object whose bounding box does\n not overlap the viewing area must itself be completely outside the viewing\n area, and therefore does not have to be drawn. This provides a simple form\n of culling.\n\n@docs BoundingBox2d\n\n\n# Constructors\n\n@docs from, fromExtrema, withDimensions, singleton, xy, fromIntervals\n\n\n## Booleans\n\n@docs union, intersection\n\n\n## Hull\n\nFunctions for building bounding boxes containing several points.\n\n@docs hull, hull3, hullN, hullOf, hullOfN\n\n\n## Aggregation\n\nFunctions for combining several bounding boxes into one bounding box that\ncontains all of the input boxes.\n\n@docs aggregate, aggregate3, aggregateN, aggregateOf, aggregateOfN\n\n\n# Properties\n\n@docs extrema\n\nYou can also get these values separately:\n\n@docs minX, maxX, minY, maxY, dimensions, midX, midY, centerPoint\n\nYou can also get the X and Y ranges of a bounding box as [intervals](https://package.elm-lang.org/packages/ianmackenzie/elm-units-interval/latest/):\n\n@docs xInterval, yInterval, intervals\n\n\n# Queries\n\n@docs contains, isContainedIn, intersects, overlappingByAtLeast, separatedByAtLeast\n\n\n# Transformations\n\n@docs scaleAbout, translateBy, translateIn, expandBy, offsetBy\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Random point generation\n\n@docs randomPoint\n\n","unions":[],"aliases":[{"name":"BoundingBox2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.BoundingBox2d units coordinates"}],"values":[{"name":"aggregate","comment":" Find the bounding box containing one or more input boxes; works much like\n[`hull`](#hull). See also [`aggregateN`](#aggregateN).\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> List.List (BoundingBox2d.BoundingBox2d units coordinates) -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"aggregate3","comment":" Build a bounding box that contains all three of the given bounding boxes;\n\n BoundingBox2d.aggregate3 b1 b2 b3\n\nis equivalent to\n\n BoundingBox2d.aggregate b1 [ b2, b3 ]\n\nbut is more efficient.\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"aggregateN","comment":" Construct a bounding box containing all bounding boxes in the given list. If\nthe list is empty, returns `Nothing`. If you know you have at least one bounding\nbox, you can use [`aggregate`](#aggregate) instead.\n","type":"List.List (BoundingBox2d.BoundingBox2d units coordinates) -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"aggregateOf","comment":" Like [`aggregate`](#aggregate), but lets you work on any kind of item as\nlong as a bounding box can be extracted from it. For example, to get the\nbounding box around four triangles:\n\n BoundingBox2d.aggregateOf Triangle2d.boundingBox\n firstTriangle\n [ secondTriangle\n , thirdTriangle\n , fourthTriangle\n ]\n\n","type":"(a -> BoundingBox2d.BoundingBox2d units coordinates) -> a -> List.List a -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"aggregateOfN","comment":" Combination of [`aggregateOf`](#aggregateOf) and [`aggregateN`](#aggregateN).\n","type":"(a -> BoundingBox2d.BoundingBox2d units coordinates) -> List.List a -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"at","comment":" Convert a bounding box from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> BoundingBox2d.BoundingBox2d units1 coordinates -> BoundingBox2d.BoundingBox2d units2 coordinates"},{"name":"at_","comment":" Convert a bounding box from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> BoundingBox2d.BoundingBox2d units1 coordinates -> BoundingBox2d.BoundingBox2d units2 coordinates"},{"name":"centerPoint","comment":" Get the point at the center of a bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"contains","comment":" Check if a bounding box contains a particular point.\n","type":"Point2d.Point2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Basics.Bool"},{"name":"dimensions","comment":" Get the X and Y dimensions (width and height) of a bounding box.\n\n ( width, height ) =\n BoundingBox2d.dimensions exampleBox\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"expandBy","comment":" Expand the given bounding box in all directions by the given offset:\n\n BoundingBox2d.expandBy (Length.meters 3) exampleBox\n --> BoundingBox2d.fromExtrema\n --> { minX = Length.meters 0\n --> , maxX = Length.meters 11\n --> , minY = Length.meters -1\n --> , maxY = Length.meters 9\n --> }\n\nNegative offsets will be treated as positive (the absolute value will be used),\nso the resulting box will always be at least as large as the original. If you\nneed to be able to contract a bounding box, use\n[`offsetBy`](BoundingBox2d#offsetBy) instead.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"extrema","comment":" Get the minimum and maximum X and Y values of a bounding box in a single\nrecord.\n\n BoundingBox2d.extrema exampleBox\n --> { minX = Length.meters 3\n --> , maxX = Length.meters 8\n --> , minY = Length.meters 2\n --> , maxY = Length.meters 6\n --> }\n\nCan be useful when combined with record destructuring, e.g.\n\n { minX, maxX, minY, maxY } =\n BoundingBox2d.extrema exampleBox\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> { minX : Quantity.Quantity Basics.Float units, maxX : Quantity.Quantity Basics.Float units, minY : Quantity.Quantity Basics.Float units, maxY : Quantity.Quantity Basics.Float units }"},{"name":"from","comment":" Construct a bounding box with the two given points as two of its corners.\nThe points can be given in any order and don't have to represent the 'primary'\ndiagonal of the bounding box.\n\n BoundingBox2d.from\n (Point2d.meters 2 3)\n (Point2d.meters -1 5)\n --> BoundingBox2d.fromExtrema\n --> { minX = Length.meters -1\n --> , maxX = Length.meters 2\n --> , minY = Length.meters 3\n --> , maxY = Length.meters 5\n --> }\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"fromExtrema","comment":" Construct a bounding box from its minimum and maximum X and Y values:\n\n exampleBox =\n BoundingBox2d.fromExtrema\n { minX = Length.meters 3\n , maxX = Length.meters 8\n , minY = Length.meters 2\n , maxY = Length.meters 6\n }\n\nIf the minimum and maximum values are provided in the wrong order (for example\nif `minX` is greater than `maxX`), then they will be swapped so that the\nresulting bounding box is valid.\n\n","type":"{ minX : Quantity.Quantity Basics.Float units, maxX : Quantity.Quantity Basics.Float units, minY : Quantity.Quantity Basics.Float units, maxY : Quantity.Quantity Basics.Float units } -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"fromIntervals","comment":" Construct a bounding box from a pair of X and Y intervals.\n","type":"( Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units ) -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"hull","comment":" Find the bounding box containing one or more input points:\n\n BoundingBox2d.hull p1 [ p2, p3, p4 ]\n\nOften ends up being used within a `case` expression:\n\n case points of\n [] ->\n -- some default behavior\n\n first :: rest ->\n let\n boundingBox =\n BoundingBox2d.hull first rest\n in\n -- normal behavior using 'boundingBox'\n\nSee also [`hullN`](#hullN).\n\n","type":"Point2d.Point2d units coordinates -> List.List (Point2d.Point2d units coordinates) -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"hull3","comment":" Build a bounding box that contains all three of the given points;\n\n BoundingBox2d.hull3 p1 p2 p3\n\nis equivalent to\n\n BoundingBox2d.hull p1 [ p2, p3 ]\n\nbut is more efficient.\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"hullN","comment":" Construct a bounding box containing all _N_ points in the given list. If the\nlist is empty, returns `Nothing`. If you know you have at least one point, you\ncan use [`hull`](#hull) instead.\n","type":"List.List (Point2d.Point2d units coordinates) -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"hullOf","comment":" Like [`hull`](#hull), but lets you work on any kind of item as long as a\npoint can be extracted from it. For example, if you had\n\n type alias Vertex =\n { id : Int\n , position : Point2d Meters WorldCoordinates\n , color : Color\n }\n\nthen you could get the bounding box around several vertices using\n\n BoundingBox2d.hullOf .position\n firstVertex\n [ secondVertex\n , thirdVertex\n , fourthVertex\n ]\n\n","type":"(a -> Point2d.Point2d units coordinates) -> a -> List.List a -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"hullOfN","comment":" Combination of [`hullOf`](#hullOf) and [`hullN`](#hullN).\n","type":"(a -> Point2d.Point2d units coordinates) -> List.List a -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"intersection","comment":" Attempt to build a bounding box that contains all points common to both\ngiven bounding boxes. If the given boxes do not intersect, returns `Nothing`.\n\n firstBox =\n BoundingBox2d.from\n (Point2d.meters 1 2)\n (Point2d.meters 4 3)\n\n secondBox =\n BoundingBox2d.from\n (Point2d.meters 2 1)\n (Point2d.meters 5 4)\n\n BoundingBox2d.intersection firstBox secondBox\n --> Just <|\n --> BoundingBox2d.from\n --> (Point2d.meters 2 2)\n --> (Point2d.meters 4 3)\n\nIf two boxes just touch along an edge or at a corner, they are still considered\nto have an intersection, even though that intersection will have zero area (at\nleast one of its dimensions will be zero):\n\n firstBox =\n BoundingBox2d.from\n (Point2d.meters 0 0)\n (Point2d.meters 1 2)\n\n secondBox =\n BoundingBox2d.from\n (Point2d.meters 1 1)\n (Point2d.meters 2 3)\n\n BoundingBox2d.intersection firstBox secondBox\n --> Just <|\n --> BoundingBox2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 1 2)\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"intersects","comment":" Test if two boxes touch or overlap at all (have any points in common);\n\n BoundingBox2d.intersects firstBox secondBox\n\nis equivalent to\n\n BoundingBox2d.intersection firstBox secondBox\n /= Nothing\n\nbut is more efficient.\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Basics.Bool"},{"name":"intervals","comment":" Convert a bounding box to a pair of X and Y intervals.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> ( Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units )"},{"name":"isContainedIn","comment":" Test if the second given bounding box is fully contained within the first\n(is a subset of it).\n\n outerBox =\n BoundingBox2d.from\n (Point2d.meters 0 0)\n (Point2d.meters 10 10)\n\n innerBox =\n BoundingBox2d.from\n (Point2d.meters 1 3)\n (Point2d.meters 5 9)\n\n overlappingBox =\n BoundingBox2d.from\n (Point2d.meters 1 3)\n (Point2d.meters 5 12)\n\n innerBox |> BoundingBox2d.isContainedIn outerBox\n --> True\n\n overlappingBox |> BoundingBox2d.isContainedIn outerBox\n --> False\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Basics.Bool"},{"name":"maxX","comment":" ","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"maxY","comment":" ","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midX","comment":" Get the median (central) X value of a bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midY","comment":" Get the median (central) Y value of a bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"minX","comment":" ","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"minY","comment":" ","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"offsetBy","comment":" Expand or shrink the given bounding box in all the directions by the given\ndistance. A positive offset will cause the bounding box to expand and a negative\nvalue will cause it to shrink.\n\n BoundingBox2d.offsetBy (Length.meters -1) exampleBox\n --> Just <|\n --> BoundingBox2d.fromExtrema\n --> { minX = Length.meters 4\n --> , maxX = Length.meters 7\n --> , minY = Length.meters 3\n --> , maxY = Length.meters 5\n --> }\n\nReturns `Nothing` if the offset is negative and large enough to cause the\nbounding box to vanish (that is, if the offset is larger than half the height or\nhalf the width of the bounding box, whichever is less):\n\n BoundingBox2d.offsetBy (Length.meters -3) exampleBox\n --> Nothing\n\nIf you only want to expand a bounding box, you can use\n[`expandBy`](BoundingBox2d#expandBy) instead (which does not return a `Maybe`).\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"overlappingByAtLeast","comment":" Check two boxes overlap by at least the given amount. For example, you could\nimplement a tolerant collision check (one that only returns true if the boxes\noverlap by at least a millimeter, and ignores boxes that just barely touch each\nother) as\n\n boxesCollide firstBox secondBox =\n BoundingBox2d.overlappingByAtLeast\n (Length.millimeters 1)\n firstBox\n secondBox\n\nOverlap is defined as the _minimum_ distance one box would have to move so that\nit did not touch the other. Boxes that just touch are considered to have an\noverlap of zero, so\n\n BoundingBox2d.overlappingByAtLeast Quantity.zero\n firstBox\n secondBox\n\nwill return true even if the two boxes just touch each other.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Basics.Bool"},{"name":"randomPoint","comment":" Create a [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor points within a given bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Random.Generator (Point2d.Point2d units coordinates)"},{"name":"scaleAbout","comment":" Scale a bounding box about a given point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"separatedByAtLeast","comment":" Check if two boxes are separated by at least the given amount. For example,\nto perform clash detection between some objects, you could use `separatedBy` on\nthose objects' bounding boxes as a quick check to see if the objects had a gap\nof at least 1 cm between them:\n\n safelySeparated firstBox secondBox =\n BoundingBox2d.separatedByAtLeast\n (Length.centimeters 1)\n firstBox\n secondBox\n\nSeparation is defined as the _minimum_ distance one box would have to move so\nthat it touched the other. (Note that this may be a _diagonal_ distance between\ncorners.) Boxes that just touch are considered to have a separation of zero, so\n\n BoundingBox2d.separatedByAtLeast Quantity.zero\n firstBox\n secondBox\n\nwill return true even if the two boxes just touch each other.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> Basics.Bool"},{"name":"singleton","comment":" Construct a zero-width bounding box containing a single point.\n","type":"Point2d.Point2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"translateBy","comment":" Translate a bounding box by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"translateIn","comment":" Translate a bounding box in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"union","comment":" Build a bounding box that contains both given bounding boxes.\n\n firstBox =\n BoundingBox2d.from\n (Point2d.meters 1 2)\n (Point2d.meters 4 3)\n\n secondBox =\n BoundingBox2d.from\n (Point2d.meters -2 4)\n (Point2d.meters 2 5)\n\n BoundingBox2d.union firstBox secondBox\n --> BoundingBox2d.from\n --> (Point2d.meters -2 2)\n --> (Point2d.meters 4 5)\n\n(Note that this is not strictly speaking a 'union' in the precise mathematical\nsense.)\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"withDimensions","comment":" Construct a bounding box given its overall dimensions (width and height)\nand center point.\n","type":"( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Point2d.Point2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"xInterval","comment":" Get the range of X values contained by a bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"xy","comment":" Construct a bounding box from separate X and Y [intervals](https://package.elm-lang.org/packages/ianmackenzie/elm-units-interval/latest/).\n","type":"Quantity.Interval.Interval Basics.Float units -> Quantity.Interval.Interval Basics.Float units -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"yInterval","comment":" Get the range of Y values contained by a bounding box.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Quantity.Interval.Interval Basics.Float units"}],"binops":[]},{"name":"BoundingBox3d","comment":" A `BoundingBox3d` is a rectangular box in 3D defined by its minimum and\nmaximum X, Y and Z values. It is possible to generate bounding boxes for most\ngeometric objects; for example, [`Triangle3d.boundingBox`](Triangle3d#boundingBox)\ntakes a `Triangle3d` and returns a `BoundingBox3d` that contains that triangle.\nThere are several use cases where it is more efficient to deal with the bounding\nbox of an object than the object itself, such as:\n\n - Intersection checking: If (for example) the bounding boxes of a line segment\n and a triangle do not overlap, then the line segment and triangle cannot\n possibly intersect each other. Expensive intersection checking therefore\n only has to be performed for line segments and triangles whose bounding\n boxes _do_ overlap.\n - 3D rendering: When rendering a 3D scene, any object whose bounding box is\n not visible must itself be not visible, and therefore does not have to be\n drawn. This provides a simple form of culling.\n\n@docs BoundingBox3d\n\n\n# Constructors\n\n@docs from, fromExtrema, withDimensions, singleton, xyz, fromIntervals\n\n\n## Booleans\n\n@docs union, intersection\n\n\n## Hull\n\nFunctions for building bounding boxes containing several points.\n\n@docs hull, hull3, hullN, hullOf, hullOfN\n\n\n## Aggregation\n\nFunctions for combining several bounding boxes into one bounding box that\ncontains all of the input boxes.\n\n@docs aggregate, aggregate3, aggregateN, aggregateOf, aggregateOfN\n\n\n# Properties\n\n@docs extrema\n\nYou can also get these values separately:\n\n@docs minX, maxX, minY, maxY, minZ, maxZ, dimensions, midX, midY, midZ, centerPoint\n\nYou can also get the X, Y and Z ranges of a bounding box as [intervals](https://package.elm-lang.org/packages/ianmackenzie/elm-units-interval/latest/):\n\n@docs xInterval, yInterval, zInterval, intervals\n\n\n# Queries\n\n@docs contains, isContainedIn, intersects, overlappingByAtLeast, separatedByAtLeast\n\n\n# Transformations\n\n@docs scaleAbout, translateBy, translateIn, expandBy, offsetBy\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Random point generation\n\n@docs randomPoint\n\n","unions":[],"aliases":[{"name":"BoundingBox3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.BoundingBox3d units coordinates"}],"values":[{"name":"aggregate","comment":" Find the bounding box containing one or more input boxes; works much\nlike [`hull`](#hull). If you need to handle the case of zero input boxes, see\n[`aggregateN`](#aggregateN).\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> List.List (BoundingBox3d.BoundingBox3d units coordinates) -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"aggregate3","comment":" Build a bounding box that contains all three of the given bounding boxes;\n\n BoundingBox3d.aggregate3 b1 b2 b3\n\nis equivalent to\n\n BoundingBox3d.aggregate b1 [ b2, b3 ]\n\nbut is more efficient.\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"aggregateN","comment":" Construct a bounding box containing all bounding boxes in the given list. If\nthe list is empty, returns `Nothing`. If you know you have at least one bounding\nbox, you can use [`aggregate`](#aggregate) instead.\n","type":"List.List (BoundingBox3d.BoundingBox3d units coordinates) -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"aggregateOf","comment":" Like [`aggregate`](#aggregate), but lets you work on any kind of item as\nlong as a bounding box can be extracted from it. For example, to get the\nbounding box around four triangles:\n\n BoundingBox3d.aggregateOf Triangle3d.boundingBox\n firstTriangle\n [ secondTriangle\n , thirdTriangle\n , fourthTriangle\n ]\n\n","type":"(a -> BoundingBox3d.BoundingBox3d units coordinates) -> a -> List.List a -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"aggregateOfN","comment":" Combination of [`aggregateOf`](#aggregateOf) and\n[`aggregateN`](#aggregateN).\n","type":"(a -> BoundingBox3d.BoundingBox3d units coordinates) -> List.List a -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"at","comment":" Convert a bounding box from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> BoundingBox3d.BoundingBox3d units1 coordinates -> BoundingBox3d.BoundingBox3d units2 coordinates"},{"name":"at_","comment":" Convert a bounding box from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> BoundingBox3d.BoundingBox3d units1 coordinates -> BoundingBox3d.BoundingBox3d units2 coordinates"},{"name":"centerPoint","comment":" Get the point at the center of a bounding box.\n\n BoundingBox3d.centerPoint exampleBox\n --> Point3d.meters 0 3.5 3.5\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"contains","comment":" Check if a bounding box contains a particular point.\n","type":"Point3d.Point3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Basics.Bool"},{"name":"dimensions","comment":" Get the X, Y and Z dimensions (widths) of a bounding box.\n\n BoundingBox3d.dimensions exampleBox\n --> ( Length.meters 4\n --> , Length.meters 3\n --> , Length.meters 1\n --> )\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"expandBy","comment":" Expand the given bounding box in all directions by the given offset:\n\n BoundingBox3d.expandBy (Length.meters 3) exampleBox\n --> BoundingBox3d.fromExtrema\n --> { minX = Length.meters -5\n --> , maxX = Length.meters 5\n --> , minY = Length.meters -1\n --> , maxY = Length.meters 8\n --> , minZ = Length.meters 0\n --> , maxZ = Length.meters 7\n --> }\n\nNegative offsets will be treated as positive (the absolute value will be used),\nso the resulting box will always be at least as large as the original. If you\nneed to be able to contract a bounding box, use\n[`offsetBy`](BoundingBox3d#offsetBy) instead.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"extrema","comment":" Get the minimum and maximum X, Y and Z values of a bounding box in a single\nrecord.\n\n BoundingBox3d.extrema exampleBox\n --> { minX = Length.meters -2\n --> , maxX = Length.meters 2\n --> , minY = Length.meters 2\n --> , maxY = Length.meters 5\n --> , minZ = Length.meters 3\n --> , maxZ = Length.meters 4\n --> }\n\nCan be useful when combined with record destructuring, e.g.\n\n { minX, maxX, minY, maxY, minZ, maxZ } =\n BoundingBox3d.extrema exampleBox\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> { minX : Quantity.Quantity Basics.Float units, maxX : Quantity.Quantity Basics.Float units, minY : Quantity.Quantity Basics.Float units, maxY : Quantity.Quantity Basics.Float units, minZ : Quantity.Quantity Basics.Float units, maxZ : Quantity.Quantity Basics.Float units }"},{"name":"from","comment":" Construct a bounding box with the two given points as two of its corners.\nThe points can be given in any order and don't have to represent the 'primary'\ndiagonal of the bounding box.\n\n BoundingBox3d.from\n (Point3d.meters 2 1 3)\n (Point3d.meters -1 5 -2)\n --> BoundingBox3d.fromExtrema\n --> { minX = Length.meters -1\n --> , maxX = Length.meters 2\n --> , minY = Length.meters 1\n --> , maxY = Length.meters 5\n --> , minZ = Length.meters -2\n --> , maxZ = Length.meters 3\n --> }\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"fromExtrema","comment":" Construct a bounding box from its minimum and maximum X, Y and Z values:\n\n exampleBox =\n BoundingBox3d.fromExtrema\n { minX = Length.meters -2\n , maxX = Length.meters 2\n , minY = Length.meters 2\n , maxY = Length.meters 5\n , minZ = Length.meters 3\n , maxZ = Length.meters 4\n }\n\nIf the minimum and maximum values are provided in the wrong order (for example\nif `minX` is greater than `maxX`, then they will be swapped so that the\nresulting bounding box is valid.\n\n","type":"{ minX : Quantity.Quantity Basics.Float units, maxX : Quantity.Quantity Basics.Float units, minY : Quantity.Quantity Basics.Float units, maxY : Quantity.Quantity Basics.Float units, minZ : Quantity.Quantity Basics.Float units, maxZ : Quantity.Quantity Basics.Float units } -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"fromIntervals","comment":" Construct a bounding box from a tuple of X, Y and Z intervals.\n","type":"( Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units ) -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"hull","comment":" Find the bounding box containing one or more input points. You would\ngenerally use this within a `case` expression:\n\n case points of\n [] ->\n -- some default behavior\n\n first :: rest ->\n let\n boundingBox =\n BoundingBox3d.hull first rest\n in\n ...\n\nIf you need to handle the case of zero input points, see [`hullN`](#hullN).\n\n","type":"Point3d.Point3d units coordinates -> List.List (Point3d.Point3d units coordinates) -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"hull3","comment":" Build a bounding box that contains all three of the given points;\n\n BoundingBox3d.hull3 p1 p2 p3\n\nis equivalent to\n\n BoundingBox3d.hull p1 [ p2, p3 ]\n\nbut is more efficient.\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"hullN","comment":" Construct a bounding box containing all _N_ points in the given list. If the\nlist is empty, returns `Nothing`. If you know you have at least one point, you\ncan use [`hull`](#hull) instead.\n","type":"List.List (Point3d.Point3d units coordinates) -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"hullOf","comment":" Like [`hull`](#hull), but lets you work on any kind of item as long as a\npoint can be extracted from it. For example, to get the bounding box around the\ncentroids of four triangles:\n\n BoundingBox3d.hullOf Triangle3d.centroid\n firstTriangle\n [ secondTriangle\n , thirdTriangle\n , fourthTriangle\n ]\n\n","type":"(a -> Point3d.Point3d units coordinates) -> a -> List.List a -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"hullOfN","comment":" Combination of [`hullOf`](#hullOf) and [`hullN`](#hullN).\n","type":"(a -> Point3d.Point3d units coordinates) -> List.List a -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"intersection","comment":" Attempt to build a bounding box that contains all points common to both\ngiven bounding boxes. If the given boxes do not overlap, returns `Nothing`.\n\n firstBox =\n BoundingBox3d.from\n (Point3d.meters 1 2 5)\n (Point3d.meters 4 3 8)\n\n secondBox =\n BoundingBox3d.from\n (Point3d.meters 2 1 6)\n (Point3d.meters 5 4 7)\n\n BoundingBox3d.intersection firstBox secondBox\n --> Just <|\n --> BoundingBox3d.from\n --> (Point3d.meters 2 2 6)\n --> (Point3d.meters 4 3 7)\n\nIf two boxes just touch along an edge or at a corner, they are still considered\nto have an intersection, even though that intersection will have zero volume (at\nleast one of its dimensions will be zero):\n\n firstBox =\n BoundingBox3d.from\n (Point3d.meters 0 0 0)\n (Point3d.meters 1 2 3)\n\n secondBox =\n BoundingBox3d.from\n (Point3d.meters 1 1 1)\n (Point3d.meters 2 3 4)\n\n BoundingBox3d.intersection firstBox secondBox\n --> Just <|\n --> BoundingBox3d.from\n --> (Point3d.meters 1 1 1)\n --> (Point3d.meters 1 2 3)\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"intersects","comment":" Test if two boxes touch or overlap at all (have any points in common);\n\n BoundingBox3d.intersects firstBox secondBox\n\nis equivalent to\n\n BoundingBox3d.intersection firstBox secondBox\n /= Nothing\n\nbut is more efficient.\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Basics.Bool"},{"name":"intervals","comment":" Convert a bounding box to a pair of X and Y intervals.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> ( Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units, Quantity.Interval.Interval Basics.Float units )"},{"name":"isContainedIn","comment":" Test if the second given bounding box is fully contained within the first\n(is a subset of it).\n\n outerBox =\n BoundingBox3d.from\n (Point3d.meters 0 0 0)\n (Point3d.meters 10 10 10)\n\n innerBox =\n BoundingBox3d.from\n (Point3d.meters 1 3 7)\n (Point3d.meters 5 9 8)\n\n overlappingBox =\n BoundingBox3d.from\n (Point3d.meters 1 3 7)\n (Point3d.meters 5 12 8)\n\n innerBox |> BoundingBox3d.isContainedIn outerBox\n --> True\n\n overlappingBox |> BoundingBox3d.isContainedIn outerBox\n --> False\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Basics.Bool"},{"name":"maxX","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"maxY","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"maxZ","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midX","comment":" Get the median (central) X value of a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midY","comment":" Get the median (central) Y value of a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midZ","comment":" Get the median (central) Z value of a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"minX","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"minY","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"minZ","comment":" ","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"offsetBy","comment":" Expand or shrink the given bounding box in all the directions by the given\ndistance. A positive offset will cause the bounding box to expand and a negative\nvalue will cause it to shrink.\n\n BoundingBox3d.offsetBy (Length.meters -0.5) exampleBox\n --> Just <|\n --> BoundingBox3d.fromExtrema\n --> { minX = Length.meters -1.5\n --> , maxX = Length.meters 1.5\n --> , minY = Length.meters 2.5\n --> , maxY = Length.meters 4.5\n --> , minZ = Length.meters 3.5\n --> , maxZ = Length.meters 3.5\n --> }\n\nReturns `Nothing` if the offset is negative and large enough to cause the\nbounding box to vanish (that is, if the offset is larger than half the height or\nhalf the width of the bounding box, whichever is less):\n\n BoundingBox3d.offsetBy (Length.meters -1) exampleBox\n --> Nothing\n\nIf you only want to expand a bounding box, you can use\n[`expandBy`](BoundingBox3d#expandBy) instead (which does not return a `Maybe`).\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"overlappingByAtLeast","comment":" Check two boxes overlap by at least the given amount. For example, you could\nimplement a tolerant collision check (one that only returns true if the boxes\noverlap by at least a millimeter, and ignores boxes that just barely touch each\nother) as\n\n boxesCollide firstBox secondBox =\n BoundingBox3d.overlappingByAtLeast\n (Length.millimeters 1)\n firstBox\n secondBox\n\nOverlap is defined as the _minimum_ distance one box would have to move so that\nit did not touch the other. Boxes that just touch are considered to have an\noverlap of zero, so\n\n BoundingBox3d.overlappingByAtLeast Quantity.zero\n firstBox\n secondBox\n\nwill return true even if the two boxes just touch each other.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Basics.Bool"},{"name":"randomPoint","comment":" Create a [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor points within a given bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Random.Generator (Point3d.Point3d units coordinates)"},{"name":"scaleAbout","comment":" Scale a bounding box about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"separatedByAtLeast","comment":" Check if two boxes are separated by at least the given amount. For example,\nto perform clash detection between some objects, you could use `separatedBy` on\nthose objects' bounding boxes as a quick check to see if the objects had a gap\nof at least 1 cm between them:\n\n safelySeparated firstBox secondBox =\n BoundingBox3d.separatedByAtLeast\n (Length.centimeters 1)\n firstBox\n secondBox\n\nSeparation is defined as the _minimum_ distance one box would have to move so\nthat it touched the other. (Note that this may be a _diagonal_ distance between\ncorners.) Boxes that just touch are considered to have a separation of zero, so\n\n BoundingBox3d.separatedByAtLeast Quantity.zero\n firstBox\n secondBox\n\nwill return true even if the two boxes just touch each other.\n\n","type":"Quantity.Quantity Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> Basics.Bool"},{"name":"singleton","comment":" Construct a zero-width bounding box containing a single point.\n","type":"Point3d.Point3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"translateBy","comment":" Translate a bounding box by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"translateIn","comment":" Translate a bounding box in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"union","comment":" Build a bounding box that contains both given bounding boxes.\n\n firstBox =\n BoundingBox3d.from\n (Point3d.meters 1 2 0)\n (Point3d.meters 4 3 5)\n\n secondBox =\n BoundingBox3d.from\n (Point3d.meters -2 4 -1)\n (Point3d.meters 2 5 0)\n\n BoundingBox3d.union firstBox secondBox\n --> BoundingBox3d.from\n --> (Point3d.meters -2 2 -1)\n --> (Point3d.meters 4 5 5)\n\n(Note that this is not strictly speaking a 'union' in the precise mathematical\nsense.)\n\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"withDimensions","comment":" Construct a bounding box given its overall dimensions (length, width,\nheight) and center point.\n","type":"( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Point3d.Point3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"xInterval","comment":" Get the range of X values contained by a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"xyz","comment":" Construct a bounding box from separate X, Y and Z [intervals](https://package.elm-lang.org/packages/ianmackenzie/elm-units-interval/latest/).\n","type":"Quantity.Interval.Interval Basics.Float units -> Quantity.Interval.Interval Basics.Float units -> Quantity.Interval.Interval Basics.Float units -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"yInterval","comment":" Get the range of Y values contained by a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"zInterval","comment":" Get the range of Y values contained by a bounding box.\n","type":"BoundingBox3d.BoundingBox3d units coordinates -> Quantity.Interval.Interval Basics.Float units"}],"binops":[]},{"name":"Circle2d","comment":" A `Circle2d` is defined by its center point and radius. This module includes\nfunctionality for\n\n - Constructing circles through points or with a given center/radius\n - Scaling, rotating and translating circles\n - Extracting properties of circles like area, center point and radius\n\n@docs Circle2d\n\n\n# Constructors\n\n@docs atPoint, withRadius, atOrigin, throughPoints, sweptAround\n\n\n# Properties\n\n@docs centerPoint, radius, diameter, area, circumference, boundingBox\n\n\n# Conversion\n\n@docs toArc\n\n\n# Queries\n\n@docs contains, intersectsBoundingBox\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Circle2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Circle2d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a circle.\n","type":"Circle2d.Circle2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a circle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Circle2d.Circle2d units1 coordinates -> Circle2d.Circle2d units2 coordinates"},{"name":"atOrigin","comment":" Construct a circle at the origin with the given radius.\n","type":"Quantity.Quantity Basics.Float units -> Circle2d.Circle2d units coordinates"},{"name":"atPoint","comment":" Construct a circle from its radius and center point:\n\n exampleCircle =\n Circle2d.atPoint (Point2d.meters 1 2)\n (Length.meters 3)\n\nIf you pass a negative radius, the absolute value will be used.\n\n","type":"Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units -> Circle2d.Circle2d units coordinates"},{"name":"at_","comment":" Convert a circle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Circle2d.Circle2d units1 coordinates -> Circle2d.Circle2d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given circle.\n\n Circle2d.boundingBox exampleCircle\n --> BoundingBox2d.from\n --> (Point2d.meters -2 -1)\n --> (Point2d.meters 4 5)\n\n","type":"Circle2d.Circle2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a circle.\n","type":"Circle2d.Circle2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"circumference","comment":" Get the circumference (perimeter) of a circle.\n","type":"Circle2d.Circle2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"contains","comment":" Check if a circle contains a given point.\n","type":"Point2d.Point2d units coordinates -> Circle2d.Circle2d units coordinates -> Basics.Bool"},{"name":"diameter","comment":" Get the diameter of a circle (twice the radius).\n","type":"Circle2d.Circle2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"intersectsBoundingBox","comment":" Check if a circle intersects with a given bounding box. This function will\nreturn true if the circle intersects the edges of the bounding box _or_ is fully\ncontained within the bounding box.\n\n boundingBox =\n BoundingBox2d.from\n (Point2d.meters 2 0)\n (Point2d.meters 3 2)\n\n circle =\n Circle2d.atOrigin (Length.meters 3)\n\n Circle2d.intersectsBoundingBox boundingBox circle\n --> True\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Circle2d.Circle2d units coordinates -> Basics.Bool"},{"name":"mirrorAcross","comment":" Mirror a circle across a given axis.\n","type":"Axis2d.Axis2d units coordinates -> Circle2d.Circle2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"placeIn","comment":" Take a circle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that circle expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Circle2d.Circle2d units localCoordinates -> Circle2d.Circle2d units globalCoordinates"},{"name":"radius","comment":" Get the radius of a circle.\n","type":"Circle2d.Circle2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take a circle defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Circle2d.Circle2d units globalCoordinates -> Circle2d.Circle2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a circle around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Circle2d.Circle2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"scaleAbout","comment":" Scale a circle about a given point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Circle2d.Circle2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"sweptAround","comment":" Construct a circle by rotating a point on the circle around a given center\npoint. The center point is given first and the point on the circle is given\nsecond.\n\n Circle2d.sweptAround Point2d.origin\n (Point2d.meters 2 0)\n --> Circle2d.atOrigin (Length.meters 2)\n\nThe above example could be rewritten as\n\n Point2d.meters 2 0\n |> Circle2d.sweptAround Point2d.origin\n\nand if you wanted to create many concentric circles all centered on a specific\npoint but passing through several other different points, you could use\nsomething like\n\n concentricCircles =\n List.map (Circle2d.sweptAround centerPoint) points\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"throughPoints","comment":" Attempt to construct a circle that passes through the three given points:\n\n Circle2d.throughPoints\n Point2d.origin\n (Point2d.meters 1 0)\n (Point2d.meters 0 1)\n --> Just <|\n --> Circle2d.atPoint (Point2d.meters 0.5 0.5)\n --> (Length.meters 0.7071)\n\nIf the three given points are collinear, returns `Nothing`:\n\n Circle2d.throughPoints\n Point2d.origin\n (Point2d.meters 2 0)\n (Point2d.meters 4 0)\n --> Nothing\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Maybe.Maybe (Circle2d.Circle2d units coordinates)"},{"name":"toArc","comment":" Convert a circle to a 360 degree arc.\n","type":"Circle2d.Circle2d units coordinates -> Geometry.Types.Arc2d units coordinates"},{"name":"translateBy","comment":" Translate a circle by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Circle2d.Circle2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"translateIn","comment":" Translate a circle in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Circle2d.Circle2d units coordinates -> Circle2d.Circle2d units coordinates"},{"name":"withRadius","comment":" Construct a circle from its radius and center point. Flipped version of\n`atPoint` that may be more useful in some situations like constructing a bunch\nof circles of the same radius at different points:\n\n circles =\n List.map (Circle2d.withRadius radius) listOfPoints\n\n","type":"Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates -> Circle2d.Circle2d units coordinates"}],"binops":[]},{"name":"Circle3d","comment":" A `Circle3d` is defined by its center point, axial direction and radius. The\naxial direction is the direction of the axis through the center of the circle\nthat all points on the circle are equidistant from, or equivalently the normal\ndirection of the plane defined by the circle. This module contains functionality\nfor:\n\n - Constructing circles around axes, on planes, or through points\n - Scaling, rotating and translating circles\n - Extracting circle properties like center point and area\n\n@docs Circle3d\n\n\n# Constructors\n\n@docs withRadius, sweptAround, on, throughPoints\n\n\n# Properties\n\n@docs centerPoint, axialDirection, radius, diameter, axis, plane, area, circumference, boundingBox\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs flip, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectInto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Circle3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Circle3d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a circle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Circle3d.Circle3d units1 coordinates -> Circle3d.Circle3d units2 coordinates"},{"name":"at_","comment":" Convert a circle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Circle3d.Circle3d units1 coordinates -> Circle3d.Circle3d units2 coordinates"},{"name":"axialDirection","comment":" Get the axial direction of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"axis","comment":" Get the central axis of a circle, perpendicular to its [`plane`](#plane).\nThe origin point of the returned axis will be the center point of the circle.\n","type":"Circle3d.Circle3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given circle.\n\n Circle3d.boundingBox exampleCircle\n --> BoundingBox3d.from\n --> (Point3d.meters -1 -3 1)\n --> (Point3d.meters 5 3 1)\n\n","type":"Circle3d.Circle3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"circumference","comment":" Get the circumference (perimeter) of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"diameter","comment":" Get the diameter of a circle (twice its radius).\n","type":"Circle3d.Circle3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"flip","comment":" Flip the axial direction of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a circle across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"on","comment":" Construct a 3D circle lying _on_ a sketch plane by providing a 2D circle\nspecified in XY coordinates _within_ the sketch plane.\n\n Circle3d.on SketchPlane3d.yz <|\n Circle2d.withRadius (Length.meters 3)\n (Point2d.meters 1 2)\n --> Circle3d.withRadius (Length.meters 3)\n --> Direction3d.x\n --> (Point3d.meters 0 1 2)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Circle2d.Circle2d units coordinates2d -> Circle3d.Circle3d units coordinates3d"},{"name":"placeIn","comment":" Take a circle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that circle expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Circle3d.Circle3d units localCoordinates -> Circle3d.Circle3d units globalCoordinates"},{"name":"plane","comment":" Get the plane that a circle lies in. The origin point of the returned plane\nwill be the center point of the circle, and its normal direction will be the\naxial direction of the circle.\n","type":"Circle3d.Circle3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"projectInto","comment":" Project a circle into a sketch plane. Note that the result is in general an\nellipse, not a circle!\n\n inclinedCircle : Circle3d\n inclinedCircle =\n Circle3d.withRadius (Length.meters 1)\n (Direction3d.xz (Angle.degrees 45))\n (Point3d.meters 1 2 3)\n\n Circle3d.projectInto SketchPlane3d.xy inclinedCircle\n --> Ellipse2d.with\n --> { centerPoint = Point2d.meters 1 2\n --> , xDirection = Direction2d.negativeY\n --> , xRadius = Length.meters 1\n --> , yRadius = Length.meters 0.7071\n --> }\n\nThe X radius of the returned ellipse will always be greater than or equal to the\nY radius (the X axis will be the major axis and the Y axis will be the minor\naxis). Note that if the 3D circle is perfectly parallel to the sketch plane,\nthen the resulting ellipse will be circular (its X and Y radii will be equal)\nand its X and Y axis directions will be chosen arbitrarily.\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Circle3d.Circle3d units coordinates3d -> Geometry.Types.Ellipse2d units coordinates2d"},{"name":"radius","comment":" Get the radius of a circle.\n","type":"Circle3d.Circle3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take a circle defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Circle3d.Circle3d units globalCoordinates -> Circle3d.Circle3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a circle around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"scaleAbout","comment":" Scale a circle around a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"sweptAround","comment":" Construct a circle by sweeping the given point around the given axis.\n\n Circle3d.sweptAround Axis3d.z (Point3d.meters 3 0 2)\n --> Circle3d.withRadius (Length.meters 3)\n --> Direction3d.z\n --> (Point3d.meters 0 0 2)\n\n","type":"Axis3d.Axis3d units coordinates -> Point3d.Point3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"throughPoints","comment":" Attempt to construct a circle that passes through the three given points.\nThe axial direction of the returned circle will be such that the three points\nare in counterclockwise order around it, according to the right-hand rule. If\nthe three given points are collinear, returns `Nothing`.\n\n Circle3d.throughPoints\n (Point3d.meters 1 0 0)\n (Point3d.meters 0 1 0)\n (Point3d.meters 0 0 1)\n --> Just <|\n --> Circle3d.withRadius (Length.meters 0.8165)\n --> (Direction3d.xyZ\n --> (Angle.degrees 45)\n --> (Angle.degrees 35.26)\n --> )\n --> (Point3d.meters 0.333 0.333 0.333)\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Circle3d.Circle3d units coordinates)"},{"name":"translateBy","comment":" Translate a circle by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"translateIn","comment":" Translate a circle in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Circle3d.Circle3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"withRadius","comment":" Construct a circle from its radius, axial direction and center point:\n\n exampleCircle =\n Circle3d.withRadius (Length.meters 3)\n Direction3d.z\n (Point3d.meters 2 0 1)\n\nIf you pass a negative radius, the absolute value will be used.\n\n","type":"Quantity.Quantity Basics.Float units -> Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Circle3d.Circle3d units coordinates"}],"binops":[]},{"name":"Cone3d","comment":" A `Cone3d` consists of a conical outer surface, a circular base and a tip;\nit is defined by its center point on the base, axial direction, radius and overall\nlength. This module contains functionality for:\n\n - Constructing cones in various ways\n - Scaling, rotating and translating cones\n - Extracting cone properties like base point and volume\n\n@docs Cone3d\n\n\n# Constructors\n\n@docs along, startingAt, from\n\n\n# Properties\n\n@docs axis, axialDirection, radius, diameter, length, basePoint\n@docs tipPoint, base, basePlane, volume, boundingBox\n\n\n# Queries\n\n@docs contains\n\n\n# Transformations\n\nTransformations generally behave just like [the ones in the\n`Point3d` module](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs placeIn, relativeTo\n\n","unions":[],"aliases":[{"name":"Cone3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Cone3d units coordinates"}],"values":[{"name":"along","comment":" Construct a cone that lies along the given axis, with the center of the base\nand tip points given as (signed) distances along that axis:\n\n exampleCone =\n Cone3d.along Axis3d.x\n { base = Length.meters -1\n , tip = Length.meters 3\n , radius = Length.meters 1\n }\n\n Cone3d.basePoint exampleCone\n --> Point3d.meters -1 0 0\n\n Cone3d.tipPoint exampleCone\n --> Point3d.meters 3 0 0\n\n Cone3d.length exampleCone\n --> Length.meters 4\n\nNote that `tip` may be less than `base`, but then the axial direction of the\nreturned cone will be the opposite of the axial direction of the given axis.\n\n","type":"Axis3d.Axis3d units coordinates -> { base : Quantity.Quantity Basics.Float units, tip : Quantity.Quantity Basics.Float units, radius : Quantity.Quantity Basics.Float units } -> Cone3d.Cone3d units coordinates"},{"name":"at","comment":" Convert a cone from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Cone3d.Cone3d units1 coordinates -> Cone3d.Cone3d units2 coordinates"},{"name":"at_","comment":" Convert a cone from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Cone3d.Cone3d units1 coordinates -> Cone3d.Cone3d units2 coordinates"},{"name":"axialDirection","comment":" Get the axial direction of a cone.\n","type":"Cone3d.Cone3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"axis","comment":" Get the central axis of a cone. The origin point of the axis will be at\nthe center point of the base, and the direction of the axis will be from the\ncone's base point towards its tip.\n","type":"Cone3d.Cone3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"base","comment":" Get the circle at the base of a cone. The axial direction of this\ncircle will be the _reverse_ of the axial direction of the cone itself (the\ncircle axial direction will point backwards/outwards).\n","type":"Cone3d.Cone3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"basePlane","comment":" Get the plane at the base of a cone. The normal direction of this\nplane will be the same as the axial direction of the cone itself.\n","type":"Cone3d.Cone3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"basePoint","comment":" Get the base point of a cone. This is the center point of the circle\nthat forms the base of the cone.\n","type":"Cone3d.Cone3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given cone.\n","type":"Cone3d.Cone3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"contains","comment":" Check if a cone contains a given point.\n","type":"Point3d.Point3d units coordinates -> Cone3d.Cone3d units coordinates -> Basics.Bool"},{"name":"diameter","comment":" Get the base diameter of a cone (twice its radius).\n","type":"Cone3d.Cone3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"from","comment":" Attempt to construct a cone from the given center point on the base,\ntip point and radius. If the base and tip points are coincident (the same point),\nreturns `Nothing`.\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units -> Maybe.Maybe (Cone3d.Cone3d units coordinates)"},{"name":"length","comment":" Get the overall length of a cone.\n","type":"Cone3d.Cone3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mirrorAcross","comment":" Mirror a cone across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Cone3d.Cone3d units coordinates -> Cone3d.Cone3d units coordinates"},{"name":"placeIn","comment":" Take a cone considered to be defined in local coordinates relative to a\ngiven reference frame, and return that cone expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Cone3d.Cone3d units localCoordinates -> Cone3d.Cone3d units globalCoordinates"},{"name":"radius","comment":" Get the base radius of a cone.\n","type":"Cone3d.Cone3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take a cone defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Cone3d.Cone3d units globalCoordinates -> Cone3d.Cone3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a cone around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Cone3d.Cone3d units coordinates -> Cone3d.Cone3d units coordinates"},{"name":"scaleAbout","comment":" Scale a cone about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Cone3d.Cone3d units coordinates -> Cone3d.Cone3d units coordinates"},{"name":"startingAt","comment":" Construct a cone given the center point on the base, axial direction\ntowards the tip, radius and length. Negative values for radius or length\nwill be treated as positive (the absolute values will be used).\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> { radius : Quantity.Quantity Basics.Float units, length : Quantity.Quantity Basics.Float units } -> Cone3d.Cone3d units coordinates"},{"name":"tipPoint","comment":" Get the tip point of a cone.\n","type":"Cone3d.Cone3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"translateBy","comment":" Translate a cone by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Cone3d.Cone3d units coordinates -> Cone3d.Cone3d units coordinates"},{"name":"translateIn","comment":" Translate a cone in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Cone3d.Cone3d units coordinates -> Cone3d.Cone3d units coordinates"},{"name":"volume","comment":" Get the volume of a cone.\n","type":"Cone3d.Cone3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Cubed units)"}],"binops":[]},{"name":"CubicSpline2d","comment":" A `CubicSpline2d` is a cubic [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve)\nin 2D defined by a start point, end point and two inner control points. This module\ncontains functionality for\n\n - Constructing splines\n - Evaluating points and tangent directions along a spline\n - Scaling, rotating, translating or mirroring a spline\n - Converting a spline between local and global coordinates in different\n reference frames\n\n@docs CubicSpline2d\n\n\n# Constructors\n\n@docs fromControlPoints, fromEndpoints, fromQuadraticSpline\n\n\n# Properties\n\n@docs startPoint, firstControlPoint, secondControlPoint, thirdControlPoint, fourthControlPoint, endPoint, startDerivative, endDerivative, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Subdivision\n\n@docs bisect, splitAt\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength, midpoint\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `CubicSpline2d`. If you need to do something fancy, you can extract\nthese two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, secondDerivative, thirdDerivative, maxSecondDerivativeMagnitude, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" A spline that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"CubicSpline2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.CubicSpline2d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate a cubic spline as a polyline, within a given tolerance. Every\npoint on the returned polyline will be within the given tolerance of the spline.\n","type":"Quantity.Quantity Basics.Float units -> CubicSpline2d.CubicSpline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of a spline, to within the accuracy given when\ncalling [`arcLengthParameterized`](#arcLengthParameterized).\n","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given spline, with a given\naccuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> CubicSpline2d.Nondegenerate units coordinates -> CubicSpline2d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert a spline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> CubicSpline2d.CubicSpline2d units1 coordinates -> CubicSpline2d.CubicSpline2d units2 coordinates"},{"name":"at_","comment":" Convert a spline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> CubicSpline2d.CubicSpline2d units1 coordinates -> CubicSpline2d.CubicSpline2d units2 coordinates"},{"name":"bisect","comment":" Split a spline into two roughly equal halves. Equivalent to\n`CubicSpline2d.splitAt 0.5`.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> ( CubicSpline2d.CubicSpline2d units coordinates, CubicSpline2d.CubicSpline2d units coordinates )"},{"name":"boundingBox","comment":" Compute a bounding box for a given spline. It is not guaranteed that the\nresult will be the _smallest_ possible bounding box, since for efficiency the\nbounding box is computed from the spline's control points (which cover a larger\narea than the spline itself).\n\n CubicSpline2d.boundingBox exampleSpline\n --> BoundingBox2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 7 4)\n\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"endDerivative","comment":" Get the end derivative of a spline. This is equal to three times the vector\nfrom the spline's end control point to its end point.\n\n CubicSpline2d.endDerivative exampleSpline\n --> Vector2d.meters 6 9\n\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"endPoint","comment":" Get the end point of a spline. Equal to\n[`fourthControlPoint`](#fourthControlPoint).\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstControlPoint","comment":" Get the first control point of the spline. Equal to\n[`startPoint`](#startPoint).\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of a spline at a given parameter value.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"fourthControlPoint","comment":" Get the fourth and last control point of the spline.\nEqual to [`endPoint`](#endPoint).\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"fromArcLengthParameterized","comment":" ","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"fromControlPoints","comment":" Construct a spline from its four control points:\n\n exampleSpline =\n CubicSpline2d.fromControlPoints\n (Point2d.meters 1 1)\n (Point2d.meters 3 4)\n (Point2d.meters 5 1)\n (Point2d.meters 7 4)\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"fromEndpoints","comment":" Construct a spline from a given start point with a given start derivative,\nto a given end point with a given end derivative, like so:\n\n![Cubic spline from endpoints](https://ianmackenzie.github.io/elm-geometry/1.0.0/CubicSpline2d/fromEndpoints.svg)\n\nThe spline is based on a parameter that ranges from 0 to 1; as a result, in most\ncases the length of each derivative vector should be roughly equal to the length\nof the resulting spline.\n\n","type":"Point2d.Point2d units coordinates -> Vector2d.Vector2d units coordinates -> Point2d.Point2d units coordinates -> Vector2d.Vector2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate spline back to a general `CubicSpline2d`.\n","type":"CubicSpline2d.Nondegenerate units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"fromQuadraticSpline","comment":" Convert a quadratic spline into the equivalent cubic spline (every quadratic\nspline can be represented exactly as a cubic spline).\n\n quadraticSpline =\n QuadraticSpline2d.fromControlPoints\n Point2d.origin\n (Point2d.meters 3 0)\n (Point2d.meters 3 3)\n\n CubicSpline2d.fromQuadraticSpline quadraticSpline\n --> CubicSpline2d.fromControlPoints\n --> Point2d.origin\n --> (Point2d.meters 2 0)\n --> (Point2d.meters 3 1)\n --> (Point2d.meters 3 3)\n\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"maxSecondDerivativeMagnitude","comment":" Find a conservative upper bound on the magnitude of the second derivative of\na spline. This can be useful when determining error bounds for various kinds of\nlinear approximations.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midpoint","comment":" Get the midpoint of a spline. Note that this is the point half way along the\nspline by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a spline across an axis.\n","type":"Axis2d.Axis2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate spline from a general `CubicSpline2d`.\nIf the spline is in fact degenerate (consists of a single point), returns an\n`Err` with that point.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Result.Result (Point2d.Point2d units coordinates) (CubicSpline2d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate a cubic\nspline to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> CubicSpline2d.CubicSpline2d units coordinats -> Basics.Int"},{"name":"placeIn","comment":" Take a spline considered to be defined in local coordinates relative to a\ngiven reference frame, and return that spline expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> CubicSpline2d.CubicSpline2d units localCoordinates -> CubicSpline2d.CubicSpline2d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along a spline at a given arc length.\n","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates"},{"name":"pointOn","comment":" Get the point along a spline at a given parameter value.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"relativeTo","comment":" Take a spline defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> CubicSpline2d.CubicSpline2d units globalCoordinates -> CubicSpline2d.CubicSpline2d units localCoordinates"},{"name":"reverse","comment":" Reverse a spline so that the start point becomes the end point, and vice\nversa.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"rotateAround","comment":" Rotate a spline counterclockwise around a given center point by a given\nangle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate spline at a\ngiven parameter value.\n","type":"CubicSpline2d.Nondegenerate units coordinates -> Basics.Float -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along a spline at a given arc length.\n","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"scaleAbout","comment":" Scale a spline about the given center point by the given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"secondControlPoint","comment":" Get the second control point of the spline.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"secondDerivative","comment":" Evaluate the second derivative of a spline at a given parameter value.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"segments","comment":" Approximate a cubic spline by a given number of line segments. Note that the\nnumber of points in the polyline will be one more than the number of segments.\n","type":"Basics.Int -> CubicSpline2d.CubicSpline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"splitAt","comment":" Split a spline at a particular parameter value, resulting in two smaller\nsplines.\n","type":"Basics.Float -> CubicSpline2d.CubicSpline2d units coordinates -> ( CubicSpline2d.CubicSpline2d units coordinates, CubicSpline2d.CubicSpline2d units coordinates )"},{"name":"startDerivative","comment":" Get the start derivative of a spline. This is equal to three times the\nvector from the spline's start point to its start control point.\n\n CubicSpline2d.startDerivative exampleSpline\n --> Vector2d.meters 6 9\n\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"startPoint","comment":" Get the start point of a spline. Equal to\n[`firstControlPoint`](#firstControlPoint).\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate spline at a given parameter\nvalue.\n","type":"CubicSpline2d.Nondegenerate units coordinates -> Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along a spline at a given arc length.\n","type":"CubicSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction2d.Direction2d coordinates"},{"name":"thirdControlPoint","comment":" Get the third control point of the spline.\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"thirdDerivative","comment":" Get the third derivative of a spline (for a cubic spline, this is a\nconstant).\n","type":"CubicSpline2d.CubicSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"translateBy","comment":" Translate a spline by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"},{"name":"translateIn","comment":" Translate a spline in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> CubicSpline2d.CubicSpline2d units coordinates -> CubicSpline2d.CubicSpline2d units coordinates"}],"binops":[]},{"name":"CubicSpline3d","comment":" A `CubicSpline3d` is a cubic [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve)\nin 3D defined by a start point, end point and two control points. This module\ncontains functionality for\n\n - Constructing splines\n - Evaluating points and derivatives along a spline\n - Scaling, rotating, translating or mirroring a spline\n - Converting a spline between local and global coordinates in different\n reference frames\n\n@docs CubicSpline3d\n\n\n# Constructors\n\n@docs fromControlPoints, fromEndpoints, on, fromQuadraticSpline\n\n\n# Properties\n\n@docs startPoint, firstControlPoint, secondControlPoint, thirdControlPoint, fourthControlPoint, endPoint, startDerivative, endDerivative, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n\n# Subdivision\n\n@docs bisect, splitAt\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength, midpoint\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `CubicSpline3d`. If you need to do something fancy, you can extract\nthese two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, secondDerivative, thirdDerivative, maxSecondDerivativeMagnitude, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" A spline that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"CubicSpline3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.CubicSpline3d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate a cubic spline as a polyline, within a given tolerance. Every\npoint on the returned polyline will be within the given tolerance of the spline.\n","type":"Quantity.Quantity Basics.Float units -> CubicSpline3d.CubicSpline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of a spline, to within the accuracy specified\nwhen constructing the given arc length parameterization.\n","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given spline, with a given\naccuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> CubicSpline3d.Nondegenerate units coordinates -> CubicSpline3d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert a spline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> CubicSpline3d.CubicSpline3d units1 coordinates -> CubicSpline3d.CubicSpline3d units2 coordinates"},{"name":"at_","comment":" Convert a spline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> CubicSpline3d.CubicSpline3d units1 coordinates -> CubicSpline3d.CubicSpline3d units2 coordinates"},{"name":"bisect","comment":" Split a spline into two roughly equal halves. Equivalent to\n`CubicSpline3d.splitAt 0.5`.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> ( CubicSpline3d.CubicSpline3d units coordinates, CubicSpline3d.CubicSpline3d units coordinates )"},{"name":"boundingBox","comment":" Compute a bounding box for a given spline. It is not guaranteed that the\nresult will be the _smallest_ possible bounding box, since for efficiency the\nbounding box is computed from the spline's control points (which cover a larger\nvolume than the spline itself).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"endDerivative","comment":" Get the end derivative of a spline. This is equal to three times the vector\nfrom the spline's end control point to its end point.\n\n CubicSpline3d.endDerivative exampleSpline\n --> Vector3d.meters 0 0 6\n\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"endPoint","comment":" Get the end point of a spline. Equal to\n[`fourthControlPoint`](#fourthControlPoint).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstControlPoint","comment":" Get the first control point of a spline. Equal to\n[`startPoint`](#startPoint).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of a spline at a given parameter value.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"fourthControlPoint","comment":" Get the fourth and last control point of a spline.\nEqual to [`endPoint`](#endPoint).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"fromArcLengthParameterized","comment":" ","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"fromControlPoints","comment":" Construct a spline from its four control points:\n\n exampleSpline =\n CubicSpline3d.fromControlPoints\n (Point3d.meters 1 1 1)\n (Point3d.meters 3 1 1)\n (Point3d.meters 3 3 1)\n (Point3d.meters 3 3 3)\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"fromEndpoints","comment":" Construct a spline from a given start point with a given start derivative,\nto a given end point with a given end derivative, like so:\n\n![Cubic spline from endpoints](https://ianmackenzie.github.io/elm-geometry/1.0.0/CubicSpline2d/fromEndpoints.svg)\n\nFor good results, in most cases the length of each derivative vector should be\nroughly equal to the length of the resulting spline.\n\n","type":"Point3d.Point3d units coordinates -> Vector3d.Vector3d units coordinates -> Point3d.Point3d units coordinates -> Vector3d.Vector3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate spline back to a general `CubicSpline3d`.\n","type":"CubicSpline3d.Nondegenerate units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"fromQuadraticSpline","comment":" Convert a quadratic spline into the equivalent cubic spline (every quadratic\nspline can be represented exactly as a cubic spline).\n\n quadraticSpline =\n QuadraticSpline3d.fromControlPoints\n Point3d.origin\n (Point3d.meters 3 0 0)\n (Point3d.meters 3 3 0)\n\n CubicSpline3d.fromQuadraticSpline quadraticSpline\n --> CubicSpline3d.fromControlPoints\n --> Point3d.origin\n --> (Point3d.meters 2 0 0)\n --> (Point3d.meters 3 1 0)\n --> (Point3d.meters 3 3 0)\n\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"maxSecondDerivativeMagnitude","comment":" Find a conservative upper bound on the magnitude of the second derivative of\na spline. This can be useful when determining error bounds for various kinds of\nlinear approximations.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midpoint","comment":" Get the midpoint of a spline. Note that this is the point half way along the\nspline by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a spline across a plane.\n","type":"Plane3d.Plane3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate spline from a general `CubicSpline3d`.\nIf the spline is in fact degenerate (consists of a single point), returns an\n`Err` with that point.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Result.Result (Point3d.Point3d units coordinates) (CubicSpline3d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate a cubic\nspline to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> CubicSpline3d.CubicSpline3d units coordinats -> Basics.Int"},{"name":"on","comment":" Construct a 3D spline lying _on_ a sketch plane by providing a 2D spline\nspecified in XY coordinates _within_ the sketch plane.\n\n CubicSpline3d.on SketchPlane3d.xz <|\n CubicSpline2d.fromControlPoints\n (Point2d.meters 1 1)\n (Point2d.meters 3 4)\n (Point2d.meters 5 1)\n (Point2d.meters 7 4)\n --> CubicSpline3d.fromControlPoints\n --> (Point3d.meters 1 0 1)\n --> (Point3d.meters 3 0 4)\n --> (Point3d.meters 5 0 1)\n --> (Point3d.meters 7 0 4)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> CubicSpline2d.CubicSpline2d units coordinates2d -> CubicSpline3d.CubicSpline3d units coordinates3d"},{"name":"placeIn","comment":" Take a spline considered to be defined in local coordinates relative to a\ngiven reference frame, and return that spline expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> CubicSpline3d.CubicSpline3d units localCoordinates -> CubicSpline3d.CubicSpline3d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along a spline at a given arc length.\n","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"pointOn","comment":" Get a point on a spline at a given parameter value.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"projectInto","comment":" Project a spline into a given sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> CubicSpline3d.CubicSpline3d units coordinates3d -> CubicSpline2d.CubicSpline2d units coordinates2d"},{"name":"projectOnto","comment":" Find the orthographic projection of a spline onto a plane.\n","type":"Plane3d.Plane3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"relativeTo","comment":" Take a spline defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> CubicSpline3d.CubicSpline3d units globalCoordinates -> CubicSpline3d.CubicSpline3d units localCoordinates"},{"name":"reverse","comment":" Reverse a spline so that the start point becomes the end point, and vice\nversa.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"rotateAround","comment":" Rotate a spline counterclockwise around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate spline at a\ngiven parameter value.\n","type":"CubicSpline3d.Nondegenerate units coordinates -> Basics.Float -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along a spline at a given arc\nlength.\n","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"scaleAbout","comment":" Scale a spline about the given center point by the given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"secondControlPoint","comment":" Get the second control point of a spline.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"secondDerivative","comment":" Get the second derivative value at a point along a spline.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"segments","comment":" Approximate a cubic spline by a given number of line segments. Note that the\nnumber of points in the polyline will be one more than the number of segments.\n","type":"Basics.Int -> CubicSpline3d.CubicSpline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"splitAt","comment":" Split a spline at a particular parameter value, resulting in two smaller\nsplines.\n","type":"Basics.Float -> CubicSpline3d.CubicSpline3d units coordinates -> ( CubicSpline3d.CubicSpline3d units coordinates, CubicSpline3d.CubicSpline3d units coordinates )"},{"name":"startDerivative","comment":" Get the start derivative of a spline. This is equal to three times the\nvector from the spline's start point to its start control point.\n\n CubicSpline3d.startDerivative exampleSpline\n --> Vector3d.meters 6 0 0\n\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"startPoint","comment":" Get the start point of a spline. Equal to\n[`firstControlPoint`](#firstControlPoint).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate spline at a given parameter\nvalue.\n","type":"CubicSpline3d.Nondegenerate units coordinates -> Basics.Float -> Direction3d.Direction3d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along a spline at a given arc length.\n","type":"CubicSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction3d.Direction3d coordinates"},{"name":"thirdControlPoint","comment":" Get the third control point of a spline.\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"thirdDerivative","comment":" Get the third derivative of a spline (for a cubic spline, this is a\nconstant).\n","type":"CubicSpline3d.CubicSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"translateBy","comment":" Translate a spline by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"},{"name":"translateIn","comment":" Translate a spline in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> CubicSpline3d.CubicSpline3d units coordinates -> CubicSpline3d.CubicSpline3d units coordinates"}],"binops":[]},{"name":"Cylinder3d","comment":" A `Cylinder3d` consists of a cylindrical outer surface and two circular\nend caps; it is defined by its center point, axial direction, radius and overall\nlength. This module contains functionality for:\n\n - Constructing cylinders in various ways\n - Scaling, rotating and translating cylinders\n - Extracting cylinder properties like center point and volume\n\n@docs Cylinder3d\n\n\n# Constructors\n\n@docs along, centeredOn, startingAt, from\n\n\n# Properties\n\n@docs axis, centerPoint, axialDirection, radius, diameter, length, startPoint\n@docs endPoint, startCap, endCap, volume, boundingBox\n\n\n# Queries\n\n@docs contains\n\n\n# Transformations\n\n@docs reverse\n\nThe remaining transformations generally behave just like [the ones in the\n`Point3d` module](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs placeIn, relativeTo\n\n","unions":[],"aliases":[{"name":"Cylinder3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Cylinder3d units coordinates"}],"values":[{"name":"along","comment":" Construct a cylinder that lies along the given axis, with the start and end\npoints given as (signed) distances along that axis:\n\n exampleCylinder =\n Cylinder3d.along Axis3d.x\n { start = Length.meters -1\n , end = Length.meters 3\n , radius = Length.meters 1\n }\n\n Cylinder3d.startPoint exampleCylinder\n --> Point3d.meters -1 0 0\n\n Cylinder3d.endPoint exampleCylinder\n --> Point3d.meters 3 0 0\n\n Cylinder3d.length exampleCylinder\n --> Length.meters 4\n\nNote that `end` may be less than `start`, but then the axial direction of the\nreturned cylinder will be the opposite of the axial direction of the given axis.\n\n","type":"Axis3d.Axis3d units coordinates -> { start : Quantity.Quantity Basics.Float units, end : Quantity.Quantity Basics.Float units, radius : Quantity.Quantity Basics.Float units } -> Cylinder3d.Cylinder3d units coordinates"},{"name":"at","comment":" Convert a cylinder from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Cylinder3d.Cylinder3d units1 coordinates -> Cylinder3d.Cylinder3d units2 coordinates"},{"name":"at_","comment":" Convert a cylinder from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Cylinder3d.Cylinder3d units1 coordinates -> Cylinder3d.Cylinder3d units2 coordinates"},{"name":"axialDirection","comment":" Get the axial direction of a cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"axis","comment":" Get the central axis of a cylinder. The origin point of the axis will be at\nthe center point of the cylinder, and the direction of the axis will be from the\ncylinder's start point towards its end point.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"centeredOn","comment":" Construct a cylinder given its center point, axial direction, radius and\nlength. Negative values for radius or length will be treated as positive (the\nabsolute values will be used).\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> { radius : Quantity.Quantity Basics.Float units, length : Quantity.Quantity Basics.Float units } -> Cylinder3d.Cylinder3d units coordinates"},{"name":"contains","comment":" Check if a cylinder contains a given point.\n","type":"Point3d.Point3d units coordinates -> Cylinder3d.Cylinder3d units coordinates -> Basics.Bool"},{"name":"diameter","comment":" Get the diameter of a cylinder (twice its radius).\n","type":"Cylinder3d.Cylinder3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"endCap","comment":" Get the circle at the end of a cylinder. The axial direction of this circle\nwill be the same as that of the cylinder itself.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"endPoint","comment":" Get the end point of a cylinder. This is the center point of the circle that\nforms the end cap of the cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"from","comment":" Attempt to construct a cylinder from the given start point, end point and\nradius. If the start and end points are coincident (the same point), returns\n`Nothing`.\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units -> Maybe.Maybe (Cylinder3d.Cylinder3d units coordinates)"},{"name":"length","comment":" Get the overall length of a cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mirrorAcross","comment":" Mirror a cylinder across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"placeIn","comment":" Take a cylinder considered to be defined in local coordinates relative to a\ngiven reference frame, and return that cylinder expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Cylinder3d.Cylinder3d units localCoordinates -> Cylinder3d.Cylinder3d units globalCoordinates"},{"name":"radius","comment":" Get the radius of a cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take a cylinder defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Cylinder3d.Cylinder3d units globalCoordinates -> Cylinder3d.Cylinder3d units localCoordinates"},{"name":"reverse","comment":" Reverse a cylinder so that the start point becomes the end point and vice\nversa. This also means that the axial direction will be reversed.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"rotateAround","comment":" Rotate a cylinder around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"scaleAbout","comment":" Scale a cylinder about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"startCap","comment":" Get the circle at the start of a cylinder. The axial direction of this\ncircle will be the _reverse_ of the axial direction of the cylinder itself (the\ncircle axial direction will point backwards/outwards).\n","type":"Cylinder3d.Cylinder3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"startPoint","comment":" Get the start point of a cylinder. This is the center point of the circle\nthat forms the start cap of the cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"startingAt","comment":" Construct a cylinder given its start point, axial direction, radius and\nlength. Negative values for radius or length will be treated as positive (the\nabsolute values will be used).\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> { radius : Quantity.Quantity Basics.Float units, length : Quantity.Quantity Basics.Float units } -> Cylinder3d.Cylinder3d units coordinates"},{"name":"translateBy","comment":" Translate a cylinder by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"translateIn","comment":" Translate a cylinder in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Cylinder3d.Cylinder3d units coordinates -> Cylinder3d.Cylinder3d units coordinates"},{"name":"volume","comment":" Get the volume of a cylinder.\n","type":"Cylinder3d.Cylinder3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Cubed units)"}],"binops":[]},{"name":"DelaunayTriangulation2d","comment":" This module provides functionality for working with [Delaunay\ntriangulations](https://en.wikipedia.org/wiki/Delaunay_triangulation).\n\n![Delaunay triangulation](https://ianmackenzie.github.io/elm-geometry/1.2.0/DelaunayTriangulation2d/DelaunayTriangulation.png)\n\nYou can:\n\n - Build a Delaunay triangulation from a set of points or arbitrary vertices\n - Add a new vertex to an existing Delaunay triangulation\n - Extract the resulting triangulation as a list of triangles or a\n [`TriangularMesh`](https://package.elm-lang.org/packages/ianmackenzie/elm-triangular-mesh/latest/TriangularMesh#TriangularMesh)\n\nThe current implementation is somewhat inefficient, but there are plans to speed\nit up in the future (without requiring any changes to the API).\n\n@docs DelaunayTriangulation2d, Error, Face\n\n\n# Construction\n\nConstructing a Delaunay triangulation from points/vertices is currently an\nO(n^2) operation but should be O(n log n) in the future.\n\n@docs empty\n\n@docs fromPoints, fromVerticesBy\n\n\n# Modification\n\nInserting a point into a Delaunay triangulation is currently an O(n) operation\nbut should be O(log n) in the future.\n\n@docs insertPoint, insertVertexBy\n\n\n# Properties\n\n@docs vertices, triangles, circumcircles, faces, toMesh\n\n","unions":[{"name":"Error","comment":" An error type indicating that the two given vertices have the same position.\n","args":["vertex"],"cases":[["CoincidentVertices",["vertex","vertex"]]]}],"aliases":[{"name":"DelaunayTriangulation2d","comment":" A 2D Delaunay triangulation of a set of vertices.\n","args":["vertex","units","coordinates"],"type":"Geometry.Types.DelaunayTriangulation2d vertex units coordinates"},{"name":"Face","comment":" All the details about a particular face of a Delaunay triangulation:\n\n - The three input vertices it is formed from\n - The `Triangle2d` defining its shape\n - The circumcircle of that triangle\n\n","args":["vertex","units","coordinates"],"type":"{ vertices : ( vertex, vertex, vertex ), triangle : Triangle2d.Triangle2d units coordinates, circumcircle : Circle2d.Circle2d units coordinates }"}],"values":[{"name":"circumcircles","comment":" Get all circumcircles in a given Delaunay triangulation;\n\n DelaunayTriangulation2d.circumcircles triangulation\n\nis equivalent to\n\n DelaunayTriangulation2d.faces triangulation\n |> List.map .circumcircle\n\nbut somewhat more efficient. Complexity: O(n).\n\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> List.List (Circle2d.Circle2d units coordinates)"},{"name":"empty","comment":" An empty Delaunay triangulation with no vertices or faces.\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates"},{"name":"faces","comment":" Get a list of all `Face`s in a given Delaunay triangulation. Complexity:\nO(n).\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> List.List (DelaunayTriangulation2d.Face vertex units coordinates)"},{"name":"fromPoints","comment":" Construct a Delaunay triangulation from an array of points. The points must\nall be distinct; if any two points are equal, you will get an `Err\nCoincidentVertices`.\n\nNote that if all points are collinear, then the resulting triangulation will\nbe empty (have no faces).\n\n","type":"Array.Array (Point2d.Point2d units coordinates) -> Result.Result (DelaunayTriangulation2d.Error (Point2d.Point2d units coordinates)) (DelaunayTriangulation2d.DelaunayTriangulation2d (Point2d.Point2d units coordinates) units coordinates)"},{"name":"fromVerticesBy","comment":" Construct a Delaunay triangulation from an array of vertices of arbitrary\ntype, by supplying a function that returns the position of each vertex as a\n`Point2d`. For example, if you had\n\n types alias Vertex =\n { position = Point2d Meters WorldCoordinates\n , color = String\n }\n\nand\n\n vertices : Array Vertex\n vertices =\n ...\n\nthen you would use\n\n DelaunayTriangulation2d.fromVerticesBy .position\n vertices\n\nThe vertices must all be distinct; if any two have the same position, you will\nget an `Err CoincidentVertices`.\n\nNote that if all vertices are collinear, then the resulting triangulation will\nbe empty (have no faces).\n\n","type":"(vertex -> Point2d.Point2d units coordinates) -> Array.Array vertex -> Result.Result (DelaunayTriangulation2d.Error vertex) (DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates)"},{"name":"insertPoint","comment":" Add a new point into an existing Delaunay triangulation. It must not be\nequal to any existing point; if it is, you will get an `Err CoincidentVertices`.\n","type":"Point2d.Point2d units coordinates -> DelaunayTriangulation2d.DelaunayTriangulation2d (Point2d.Point2d units coordinates) units coordinates -> Result.Result (DelaunayTriangulation2d.Error (Point2d.Point2d units coordinates)) (DelaunayTriangulation2d.DelaunayTriangulation2d (Point2d.Point2d units coordinates) units coordinates)"},{"name":"insertVertexBy","comment":" Add a new vertex into an existing Delaunay triangulation, by supplying a\nfunction to get the position of the vertex. The vertex must not have the same\nposition as any existing vertex; if it is, you will get an `Err\nCoincidentVertices`.\n","type":"(vertex -> Point2d.Point2d units coordinates) -> vertex -> DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> Result.Result (DelaunayTriangulation2d.Error vertex) (DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates)"},{"name":"toMesh","comment":" Convert a Delaunay triangulation to a [`TriangularMesh`](https://package.elm-lang.org/packages/ianmackenzie/elm-triangular-mesh/latest/TriangularMesh#TriangularMesh).\nComplexity: O(n).\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> TriangularMesh.TriangularMesh vertex"},{"name":"triangles","comment":" Get all triangles in a given Delaunay triangulation;\n\n DelaunayTriangulation2d.triangles triangulation\n\nis equivalent to\n\n DelaunayTriangulation2d.faces triangulation\n |> List.map .triangle\n\nbut somewhat more efficient. Complexity: O(n).\n\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> List.List (Triangle2d.Triangle2d units coordinates)"},{"name":"vertices","comment":" Get the vertices of a Delaunay triangulation. If the triangulation was\nconstructed by calling `fromPoints` or `fromVerticesBy`, then the returned\nvertex array will simply be the array that was passed in. If any vertices were\nadded using `insertPoint` or `insertVertexBy`, then they will be appended to\nthe end of the array. This is a simple accessor, so complexity is O(1).\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> Array.Array vertex"}],"binops":[]},{"name":"Direction2d","comment":" A `Direction2d` represents a direction like 'up' or 'north' or 'forwards'.\nThey are represented using X and Y components, and can be converted to vectors\nif necessary, but should be thought of as conceptually different. Directions\nhave several uses, such as:\n\n - Constructing a vector from a length and direction\n - Determining the component of a vector in a particular direction (for\n example, finding the component of velocity in the up direction to get\n vertical speed)\n - Determining the (signed) angle between two directions\n - Defining the orientation of an axis or reference frame\n\n@docs Direction2d\n\n\n# Constants\n\n@docs x, y, positiveX, negativeX, positiveY, negativeY\n\n\n# Literals\n\n@docs degrees, radians\n\n\n# Constructors\n\n@docs from, perpendicularTo, orthonormalize, orthogonalize\n\n\n# Conversions\n\n@docs fromAngle, toAngle, toVector\n\n\n# Properties\n\n@docs components, xComponent, yComponent, componentIn, angleFrom\n\n\n# Comparison\n\n@docs equalWithin\n\n\n# Transformations\n\n@docs reverse, rotateClockwise, rotateCounterclockwise, rotateBy, mirrorAcross\n\n\n# Coordinate conversions\n\nLike other transformations, coordinate transformations of directions depend only\non the orientations of the relevant frames, not the positions of their origin\npoints.\n\nFor the examples, assume the following frames have been defined:\n\n upsideDownFrame =\n Frame2d.atOrigin |> Frame2d.reverseY\n\n rotatedFrame =\n Frame2d.atOrigin |> Frame2d.rotateBy (Angle.degrees 30)\n\n@docs relativeTo, placeIn\n\n\n# Random generation\n\n@docs random\n\n\n# Advanced\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Direction2d","comment":" ","args":["coordinates"],"type":"Geometry.Types.Direction2d coordinates"}],"values":[{"name":"angleFrom","comment":" Find the counterclockwise angle from the first direction to the\nsecond. The result will be in the range -180 to 180 degrees.\n\n referenceDirection =\n Direction2d.degrees 30\n\n Direction2d.angleFrom referenceDirection Direction2d.y\n --> Angle.degrees 60\n\n Direction2d.angleFrom referenceDirection Direction2d.x\n --> Angle.degrees -30\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates -> Angle.Angle"},{"name":"componentIn","comment":" Find the component of one direction in another direction. This is equal to\nthe cosine of the angle between the directions, or equivalently the dot product\nof the two directions converted to unit vectors.\n\n direction =\n Direction2d.degrees 60\n\n Direction2d.componentIn Direction2d.x direction\n --> 0.5\n\n Direction2d.componentIn direction direction\n --> 1\n\n Direction2d.componentIn Direction2d.x Direction2d.y\n --> 0\n\nThis is more general and flexible than using `xComponent` or `yComponent`, both\nof which can be expressed in terms of `componentIn`; for example,\n\n Direction2d.xComponent direction\n\nis equivalent to\n\n Direction2d.componentIn Direction2d.x direction\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates -> Basics.Float"},{"name":"components","comment":" Get the X and Y components of a direction as a tuple.\n\n Direction2d.components (Direction2d.degrees 135)\n --> ( -0.7071, 0.7071 )\n\n","type":"Direction2d.Direction2d coordinates -> ( Basics.Float, Basics.Float )"},{"name":"degrees","comment":" Construct a direction from a number of degrees, given counterclockwise from\nthe positive X axis:\n\n Direction2d.degrees 0\n --> Direction2d.positiveX\n\n Direction2d.degrees 90\n --> Direction2d.positiveY\n\nThis is a convenient shorthand for using `Direction2d.fromAngle` and\n`Angle.degrees` if you want to construct a direction at a fixed angle in\ndegrees.\n\n","type":"Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"equalWithin","comment":" Compare two directions within an angular tolerance. Returns true if the\nabsolute value of the angle between the two given directions is less than the\ngiven tolerance.\n\n firstDirection =\n Direction2d.degrees 45\n\n secondDirection =\n Direction2d.degrees 47\n\n Direction2d.equalWithin (Angle.degrees 5)\n firstDirection\n secondDirection\n --> True\n\n Direction2d.equalWithin (Angle.degrees 1)\n firstDirection\n secondDirection\n --> False\n\n","type":"Angle.Angle -> Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates -> Basics.Bool"},{"name":"from","comment":" Attempt to construct the direction from the first given point to the second.\nIf the two points are coincident, returns `Nothing`.\n\n point =\n Point2d.meters 1 1\n\n Direction2d.from Point2d.origin point\n --> Just (Direction2d.degrees 45)\n\n Direction2d.from point Point2d.origin\n --> Just (Direction2d.degrees -135)\n\n Direction2d.from point point\n --> Nothing\n\n","type":"Geometry.Types.Point2d units coordinates -> Geometry.Types.Point2d units coordinates -> Maybe.Maybe (Direction2d.Direction2d coordinates)"},{"name":"fromAngle","comment":" Construct a direction from an [Angle](https://package.elm-lang.org/packages/ianmackenzie/elm-units/latest/Angle)\ngiven counterclockwise from the positive X direction.\n\n Direction2d.fromAngle (Angle.degrees 90)\n --> Direction2d.y\n\n","type":"Angle.Angle -> Direction2d.Direction2d coordinates"},{"name":"mirrorAcross","comment":" Mirror a direction across a particular axis. Note that only the direction of\nthe axis affects the result, since directions are position-independent.\n\n slopedAxis =\n Axis2d.through\n (Point2d.meters 100 200)\n (Direction2d.degrees 45)\n\n Direction2d.mirrorAcross slopedAxis Direction2d.x\n --> Direction2d.y\n\n Direction2d.mirrorAcross slopedAxis Direction2d.y\n --> Direction2d.x\n\n","type":"Geometry.Types.Axis2d units coordinates -> Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"negativeX","comment":" The negative X direction.\n","type":"Direction2d.Direction2d coordinates"},{"name":"negativeY","comment":" The negative Y direction.\n","type":"Direction2d.Direction2d coordinates"},{"name":"orthogonalize","comment":" Attempt to form a pair of perpendicular directions from the two given\ndirections;\n\n Direction2d.orthogonalize xDirection yDirection\n\nis equivalent to\n\n Direction2d.orthonormalize\n (Direction2d.toVector xDirection)\n (Direction2d.toVector yDirection)\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates -> Maybe.Maybe ( Direction2d.Direction2d coordinates, Direction2d.Direction2d coordinates )"},{"name":"orthonormalize","comment":" Attempt to form a pair of perpendicular directions from the two given\nvectors by performing [Gram-Schmidt normalization](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process):\n\n - The first returned direction will be equal to the direction of the first\n given vector\n - The second returned direction will be as close as possible to the second\n given vector while being perpendicular to the first returned direction\n\nIf either of the given vectors are zero, or if the two vectors are parallel,\nreturns `Nothing`.\n\n Direction2d.orthonormalize\n (Vector2d.meters 3 3)\n (Vector2d.meters 0 -2)\n --> Just\n --> ( Direction2d.degrees 45\n --> , Direction2d.degrees -45\n --> )\n\n Direction2d.orthonormalize\n (Vector2d.meters 3 3)\n (Vector2d.meters -2 -2)\n --> Nothing\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Maybe.Maybe ( Direction2d.Direction2d coordinates, Direction2d.Direction2d coordinates )"},{"name":"perpendicularTo","comment":" Construct a direction perpendicular to the given direction, by rotating the\ngiven direction 90 degrees counterclockwise. Synonym for\n`rotateCounterclockwise`.\n\n Direction2d.perpendicularTo Direction2d.x\n --> Direction2d.y\n\n Direction2d.perpendicularTo Direction2d.y\n --> Direction2d.negativeX\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"placeIn","comment":" Take a direction defined in local coordinates relative to a given reference\nframe, and return that direction expressed in global coordinates.\n\n Direction2d.placeIn upsideDownFrame Direction2d.y\n --> Direction2d.negativeY\n\n Direction2d.placeIn rotatedFrame Direction2d.x\n --> Direction2d.degrees 30\n\n Direction2d.placeIn rotatedFrame Direction2d.y\n --> Direction2d.degrees 120\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Direction2d.Direction2d localCoordinates -> Direction2d.Direction2d globalCoordinates"},{"name":"positiveX","comment":" The positive X direction.\n","type":"Direction2d.Direction2d coordinates"},{"name":"positiveY","comment":" The positive Y direction.\n","type":"Direction2d.Direction2d coordinates"},{"name":"radians","comment":" Construct a direction from a number of radians, given counterclockwise from\nthe positive X axis:\n\n Direction2d.radians pi\n --> Direction2d.negativeX\n\n Direction2d.radians (-pi / 2)\n --> Direction2d.negativeY\n\n","type":"Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"random","comment":" A [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor 2D directions.\n","type":"Random.Generator (Direction2d.Direction2d coordinates)"},{"name":"relativeTo","comment":" Take a direction defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n\n Direction2d.relativeTo upsideDownFrame Direction2d.y\n --> Direction2d.negativeY\n\n Direction2d.relativeTo rotatedFrame Direction2d.x\n --> Direction2d.degrees -30\n\n Direction2d.relativeTo rotatedFrame Direction2d.y\n --> Direction2d.degrees 60\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Direction2d.Direction2d globalCoordinates -> Direction2d.Direction2d localCoordinates"},{"name":"reverse","comment":" Reverse a direction.\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"rotateBy","comment":" Rotate a direction counterclockwise by a given angle.\n\n Direction2d.rotateBy (Angle.degrees 180) Direction2d.x\n --> Direction2d.negativeX\n\n","type":"Angle.Angle -> Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"rotateClockwise","comment":" Rotate a direction by 90 degrees clockwise.\n\n Direction2d.rotateClockwise Direction2d.x\n --> Direction2d.negativeY\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"rotateCounterclockwise","comment":" Rotate a direction by 90 degrees counterclockwise.\n\n Direction2d.rotateClockwise Direction2d.x\n --> Direction2d.y\n\n","type":"Direction2d.Direction2d coordinates -> Direction2d.Direction2d coordinates"},{"name":"toAngle","comment":" Convert a direction to a polar angle (the counterclockwise angle from the\npositive X direction). The result will be in the range -180 to 180 degrees.\n\n Direction2d.toAngle Direction2d.negativeY\n --> Angle.degrees -90\n\n","type":"Direction2d.Direction2d coordinates -> Angle.Angle"},{"name":"toVector","comment":" Convert a direction to a unitless vector of length 1.\n\n Direction2d.toVector Direction2d.x\n --> Vector2d.unitless 1 0\n\n","type":"Direction2d.Direction2d coordinates -> Vector2d.Vector2d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a direction directly from its X and Y components. Note that **you\nmust ensure that the sum of the squares of the given components is exactly\none**:\n\n Direction2d.unsafe { x = 1, y = 0 }\n\n Direction2d.unsafe { x = 0, y = -1 }\n\n Direction2d.unsafe { x = 0.6, y = 0.8 }\n\nare all valid but\n\n Direction2d.unsafe { x = 2, y = 0 }\n\n Direction2d.unsafe { x = 1, y = 1 }\n\nare not. Instead of using `Direction2d.unsafe`, it may be easier to use\nconstructors like [`degrees`](#degrees) or [`fromAngle`](#fromAngle) (which will\nalways result in a valid direction) or start with existing directions and\ntransform them as necessary.\n\n","type":"{ x : Basics.Float, y : Basics.Float } -> Direction2d.Direction2d coordinates"},{"name":"unwrap","comment":" Extract the X and Y components of a direction as a record.\n","type":"Direction2d.Direction2d coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"x","comment":" Synonym for `Direction2d.positiveX`.\n","type":"Direction2d.Direction2d coordinates"},{"name":"xComponent","comment":" Get the X component of a direction.\n\n Direction2d.xComponent Direction2d.x\n --> 1\n\n Direction2d.xComponent Direction2d.y\n --> 0\n\n","type":"Direction2d.Direction2d coordinates -> Basics.Float"},{"name":"y","comment":" Synonym for `Direction2d.positiveY`.\n","type":"Direction2d.Direction2d coordinates"},{"name":"yComponent","comment":" Get the Y component of a direction.\n\n Direction2d.yComponent Direction2d.x\n --> 0\n\n Direction2d.yComponent Direction2d.y\n --> 1\n\n","type":"Direction2d.Direction2d coordinates -> Basics.Float"}],"binops":[]},{"name":"Direction3d","comment":" A `Direction3d` represents a direction like 'up' or 'north' or 'forwards'.\nThey are represented using X, Y and Z components, and can be converted to\nvectors if necessary, but should be thought of as conceptually different.\nDirections have several uses, such as:\n\n - Constructing a vector from a length and direction\n - Determining the component of a vector in a particular direction (for\n example, finding the component of velocity in the up direction to get\n vertical speed)\n - Determining the angle between two directions\n - Defining the orientation of an axis, plane or reference frame\n\n@docs Direction3d\n\n\n# Constants\n\n@docs x, y, z, positiveX, negativeX, positiveY, negativeY, positiveZ, negativeZ\n\n\n# Constructors\n\n@docs from\n\n\n## In a plane\n\n@docs xy, yx, yz, zy, zx, xz, on\n\n\n## From azimuth and elevation\n\n@docs xyZ, yzX, zxY, fromAzimuthInAndElevationFrom\n\n\n## Perpendicular directions\n\n@docs perpendicularTo, perpendicularBasis, orthonormalize, orthogonalize\n\n\n# Conversion\n\n@docs toVector\n\n\n# Properties\n\n@docs components, xComponent, yComponent, zComponent, componentIn, angleFrom, azimuthIn, elevationFrom\n\n\n# Comparison\n\n@docs equalWithin\n\n\n# Transformations\n\n@docs reverse, rotateAround, mirrorAcross, projectOnto\n\n\n# Coordinate conversions\n\nLike other transformations, coordinate transformations of directions depend only\non the orientations of the relevant frames, not their positions.\n\nFor the examples, assume the following definition of a local coordinate frame,\none that is rotated 30 degrees counterclockwise around the Z axis from the\nglobal XYZ frame:\n\n rotatedFrame =\n Frame3d.atOrigin\n |> Frame3d.rotateAround Axis3d.z (Angle.degrees 30)\n\n@docs relativeTo, placeIn, projectInto\n\n\n# Random generation\n\n@docs random\n\n\n# Advanced\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Direction3d","comment":" ","args":["coordinates"],"type":"Geometry.Types.Direction3d coordinates"}],"values":[{"name":"angleFrom","comment":" Find the angle from one direction to another. The result will be in the\nrange 0 to 180 degrees\n\n Direction3d.angleFrom Direction3d.x Direction3d.x\n --> Angle.degrees 0\n\n Direction3d.angleFrom Direction3d.x Direction3d.z\n --> Angle.degrees 90\n\n Direction3d.angleFrom\n Direction3d.y\n Direction3d.negativeY\n --> Angle.degrees 180\n\n","type":"Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates -> Angle.Angle"},{"name":"azimuthIn","comment":" Get the azimuth of a direction in a given sketch plane (the angle of that\ndirection projected into the sketch plane), measured from its X axis towards its\nY axis (counterclockwise around the sketch plane's normal axis). The result will\nbe in the range -180 degrees to 180 degrees.\n\n Direction3d.x\n |> Direction3d.azimuthIn SketchPlane3d.xy\n --> Angle.degrees 0\n\n Direction3d.y\n |> Direction3d.azimuthIn SketchPlane3d.xy\n --> Angle.degrees 90\n\n Direction3d.negativeY\n |> Direction3d.azimuthIn SketchPlane3d.xy\n --> Angle.degrees -90\n\n Direction3d.negativeX\n |> Direction3d.azimuthIn SketchPlane3d.xy\n --> Angle.degrees 180\n\nVertical directions are considered to have an azimuth of zero:\n\n Direction3d.z |> Direction3d.azimuthIn SketchPlane3d.xy\n --> Angle.degrees 0\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Direction3d.Direction3d coordinates3d -> Angle.Angle"},{"name":"componentIn","comment":" Find the component of one direction in another direction. This is equal to\nthe cosine of the angle between the directions, or equivalently the dot product\nof the two directions converted to unit vectors.\n\n direction =\n Direction3d.xz (Angle.degrees 60)\n\n Direction3d.componentIn Direction3d.x direction\n --> 0.5\n\n Direction3d.componentIn Direction3d.z direction\n --> 0.866\n\n Direction3d.componentIn direction direction\n --> 1\n\n direction\n |> Direction3d.componentIn\n (Direction3d.reverse direction)\n --> -1\n\nThis is more general and flexible than using `xComponent`, `yComponent` or\n`zComponent`, all of which can be expressed in terms of `componentIn`; for\nexample,\n\n Direction3d.zComponent direction\n\nis equivalent to\n\n Direction3d.componentIn Direction3d.z direction\n\n","type":"Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates -> Basics.Float"},{"name":"components","comment":" Get the X, Y and Z components of a direction as a tuple.\n\n Direction3d.yz (Angle.degrees 135)\n |> Direction3d.components\n --> ( 0, -0.7071, 0.7071 )\n\n","type":"Direction3d.Direction3d coordinates -> ( Basics.Float, Basics.Float, Basics.Float )"},{"name":"elevationFrom","comment":" Get the elevation angle of a direction from a given sketch plane (the angle\nbetween the direction and the sketch plane, in the direction of the sketch\nplane's normal). Directions in (coplanar with) the sketch plane have an\nelevation angle of zero. The result will be in the range -90 degrees to 90\ndegrees.\n\n Direction3d.x\n |> Direction3d.elevationFrom SketchPlane3d.xy\n --> Angle.degrees 0\n\n Direction3d.y\n |> Direction3d.elevationFrom SketchPlane3d.xy\n --> Angle.degrees 0\n\n Direction3d.z\n |> Direction3d.elevationFrom SketchPlane3d.xy\n --> Angle.degrees 90\n\n Direction3d.negativeZ\n |> Direction3d.elevationFrom SketchPlane3d.xy\n --> Angle.degrees -90\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d defines -> Direction3d.Direction3d coordinates3d -> Angle.Angle"},{"name":"equalWithin","comment":" Compare two directions within an angular tolerance. Returns true if the\nangle between the two given directions is less than the given tolerance.\n\n rotatedDirection =\n Direction3d.x\n |> Direction3d.rotateAround Axis3d.z\n (Angle.degrees 2)\n\n Direction3d.equalWithin (Angle.degrees 5)\n Direction3d.x\n rotatedDirection\n --> True\n\n Direction3d.equalWithin (Angle.degrees 1)\n Direction3d.x\n rotatedDirection\n --> False\n\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates -> Basics.Bool"},{"name":"from","comment":" Attempt to construct the direction from the first given point to the second.\nIf the two points are coincident, returns `Nothing`.\n\n point =\n Point3d.meters 1 0 1\n\n Direction3d.from Point3d.origin point\n --> Just (Direction3d.xz (Angle.degrees 45))\n\n Direction3d.from point Point3d.origin\n --> Just (Direction3d.xz (Angle.degrees -135))\n\n Direction3d.from point point\n --> Nothing\n\n","type":"Geometry.Types.Point3d units coordinates -> Geometry.Types.Point3d units coordinates -> Maybe.Maybe (Direction3d.Direction3d coordinates)"},{"name":"fromAzimuthInAndElevationFrom","comment":" Construct a direction given:\n\n - Its azimuth angle within a given sketch plane, from that sketch plane's\n positive X direction towards its positive Y diretion\n - Its elevation angle out of that sketch plane, in the sketch plane's norma\n direction (the cross product of its X and Y directions)\n\nThis is a generalized version of `Direction3d.xyZ`, `Direction3d.yzX` and\n`Direction3d.zxY`; for example,\n\n Direction3d.xyZ azimuth elevation\n\nis equivalent to\n\n Direction3d.fromAzimuthInAndElevationFrom\n SketchPlane3d.xy\n azimuth\n elevation\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d defines -> Angle.Angle -> Angle.Angle -> Direction3d.Direction3d coordinates3d"},{"name":"mirrorAcross","comment":" Mirror a direction across a plane.\n\n direction =\n Direction3d.xyZ (Angle.degrees 30)\n (Angle.degrees 60)\n\n Direction3d.mirrorAcross Plane3d.xy direction\n --> Direction3d.xyZ (Angle.degrees 30)\n --> (Angle.degrees -60)\n\nNote that only the normal direction of the plane affects the result, not the\nposition of its origin point, since directions are position-independent:\n\n Direction3d.mirrorAcross Plane3d.yz direction\n --> Direction3d.xyZ (Angle.degrees 150)\n --> (Angle.degrees 60)\n\n offsetPlane =\n Plane3d.offsetBy 10 Plane3d.yz\n\n Direction3d.mirrorAcross offsetPlane direction\n --> Direction3d.xyZ (Angle.degrees 150)\n --> (Angle.degrees 60)\n\n","type":"Geometry.Types.Plane3d units coordinates -> Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates"},{"name":"negativeX","comment":" The negative X direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"negativeY","comment":" The negative Y direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"negativeZ","comment":" The negative Z direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"on","comment":" Construct a 3D direction lying _on_ a sketch plane by providing a 2D\ndirection specified in XY coordinates _within_ the sketch plane. This is a\ngeneralized version of `Direction3d.xy`, `Direction3d.yz` etc.; for example,\n\n Direction3d.xy (Angle.degrees 45)\n\nis equivalent to\n\n Direction3d.on SketchPlane3d.xy (Direction2d.degrees 45)\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Direction2d.Direction2d coordinates2d -> Direction3d.Direction3d coordinates3d"},{"name":"orthogonalize","comment":" Attempt to form a set of three mutually perpendicular directions from the\nthree given directions;\n\n Direction3d.orthogonalize\n xDirection\n yDirection\n zDirection\n\nis equivalent to\n\n Direction3d.orthonormalize\n (Direction3d.toVector xDirection)\n (Direction3d.toVector yDirection)\n (Direction3d.toVector zDirection)\n\n","type":"Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates -> Maybe.Maybe ( Direction3d.Direction3d coordinates, Direction3d.Direction3d coordinates, Direction3d.Direction3d coordinates )"},{"name":"orthonormalize","comment":" Attempt to form a set of three mutually perpendicular directions from the\nthree given vectors by performing [Gram-Schmidt normalization](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process):\n\n - The first returned direction will be equal to the direction of the first\n given vector\n - The second returned direction will be as close as possible to the second\n given vector while being perpendicular to the first returned direction\n - The third returned direction will be as close as possible to the third given\n vector while being perpendicular to the first and second returned directions\n\nIf any of the given vectors are zero, any two of them are parallel, or the three\nare coplanar, returns `Nothing`.\n\n Direction3d.orthonormalize\n (Vector3d.meters 3 3 0)\n (Vector3d.meters 0 2 0)\n (Vector3d.meters 1 2 3)\n --> Just\n --> ( Direction3d.xy (Angle.degrees 45)\n --> , Direction3d.xy (Angle.degrees 135)\n --> , Direction3d.z\n --> )\n\n -- Three vectors in the XY plane:\n Direction3d.orthonormalize\n (Vector3d.meters 2 0 0)\n (Vector3d.meters 3 1 0)\n (Vector3d.meters 4 2 0)\n --> Nothing\n\n","type":"Vector3d.Vector3d units1 coordinates -> Vector3d.Vector3d units2 coordinates -> Vector3d.Vector3d units3 coordinates -> Maybe.Maybe ( Direction3d.Direction3d coordinates, Direction3d.Direction3d coordinates, Direction3d.Direction3d coordinates )"},{"name":"perpendicularBasis","comment":" Construct a pair of directions that are perpendicular to each other and both\nperpendicular to the given direction.\n\nThe given direction and the two returned directions will form a\n[right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nsystem (that is, a right-handed `Frame3d` could be constructed by using the\ngiven direction as the X direction and the two returned directions as the Y and\nZ directions, or the given direction as the Z direction and the two returned\ndirections as the X and Y directions).\n\n Direction3d.perpendicularBasis Direction3d.x\n --> ( Direction3d.negativeZ\n --> , Direction3d.positiveY\n --> )\n\n Direction3d.perpendicularBasis Direction3d.y\n --> ( Direction3d.positiveZ\n --> , Direction3d.positiveX\n --> )\n\n","type":"Direction3d.Direction3d coordinates -> ( Direction3d.Direction3d coordinates, Direction3d.Direction3d coordinates )"},{"name":"perpendicularTo","comment":" Construct an arbitrary direction perpendicular to the given direction. The\nexact resulting direction is not specified, but it is guaranteed to be\nperpendicular to the given direction.\n\n Direction3d.perpendicularTo Direction3d.x\n --> Direction3d.negativeZ\n\n Direction3d.perpendicularTo Direction3d.y\n --> Direction3d.positiveZ\n\n direction =\n Direction3d.xz (Angle.degrees 60)\n\n Direction3d.perpendicularTo direction\n --> Direction3d.xz (Angle.degrees -30)\n\n","type":"Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates"},{"name":"placeIn","comment":" Take a direction defined in local coordinates relative to a given reference\nframe, and return that direction expressed in global coordinates.\n\n Direction3d.placeIn rotatedFrame Direction3d.x\n --> Direction3d.xy (Angle.degrees 30)\n\n Direction3d.placeIn rotatedFrame Direction3d.y\n --> Direction3d.xy (Angle.degrees 120)\n\n Direction3d.placeIn rotatedFrame Direction3d.z\n --> Direction3d.z\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Direction3d.Direction3d localCoordinates -> Direction3d.Direction3d globalCoordinates"},{"name":"positiveX","comment":" The positive X direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"positiveY","comment":" The positive Y direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"positiveZ","comment":" The positive Z direction.\n","type":"Direction3d.Direction3d coordinates"},{"name":"projectInto","comment":" Project a direction into a given sketch plane. Conceptually, this finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the direction onto the plane, re-normalizes it to have unit length, and then\nexpresses the projected direction in 2D sketch coordinates.\n\nThis is only possible if the direction is not perpendicular to the sketch\nplane; if it is perpendicular, `Nothing` is returned.\n\n direction =\n Direction3d.xy (Angle.degrees -60)\n\n Direction3d.projectInto SketchPlane3d.xy direction\n --> Just (Direction2d.degrees -60)\n\n Direction3d.projectInto SketchPlane3d.xz direction\n --> Just Direction2d.x\n\n Direction3d.projectInto SketchPlane3d.yz direction\n --> Just Direction2d.negativeX\n\n Direction3d.projectInto SketchPlane3d.xy Direction3d.z\n --> Nothing\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Direction3d.Direction3d coordinates3d -> Maybe.Maybe (Direction2d.Direction2d coordinates2d)"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a direction onto a plane (renormalized to have unit length). If the given\ndirection is exactly perpendicular to the given plane, returns `Nothing`.\n\n direction =\n Direction3d.xyZ (Angle.degrees -60)\n (Angle.degrees 0)\n\n Direction3d.projectOnto Plane3d.xy direction\n --> Just direction\n\n Direction3d.projectOnto Plane3d.xz direction\n --> Just Direction3d.x\n\n Direction3d.projectOnto Plane3d.yz direction\n --> Just Direction3d.negativeY\n\n Direction3d.projectOnto Plane3d.xy Direction3d.z\n --> Nothing\n\n","type":"Geometry.Types.Plane3d units coordinates -> Direction3d.Direction3d coordinates -> Maybe.Maybe (Direction3d.Direction3d coordinates)"},{"name":"random","comment":" A [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor 3D directions.\n","type":"Random.Generator (Direction3d.Direction3d coordinates)"},{"name":"relativeTo","comment":" Take a direction defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n\n Direction3d.relativeTo rotatedFrame Direction3d.x\n --> Direction3d.xy (Angle.degrees -30)\n\n Direction3d.relativeTo rotatedFrame Direction3d.y\n --> Direction3d.xy (Angle.degrees 60)\n\n Direction3d.relativeTo rotatedFrame Direction3d.z\n --> Direction3d.z\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Direction3d.Direction3d globalCoordinates -> Direction3d.Direction3d localCoordinates"},{"name":"reverse","comment":" Reverse a direction.\n","type":"Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates"},{"name":"rotateAround","comment":" Rotate a direction around an axis by a given angle.\n\n Direction3d.y\n |> Direction3d.rotateAround Axis3d.x\n (Angle.degrees 90)\n --> Direction3d.z\n\nNote that only the direction of the axis affects the result, not the position of\nits origin point, since directions are position-independent:\n\n offsetAxis =\n Axis3d.withDirection Direction3d.z\n (Point3d.meters 100 200 300)\n\n Direction3d.x\n |> Direction3d.rotateAround offsetAxis\n (Angle.degrees 90)\n --> Direction3d.y\n\n","type":"Geometry.Types.Axis3d units coordinates -> Angle.Angle -> Direction3d.Direction3d coordinates -> Direction3d.Direction3d coordinates"},{"name":"toVector","comment":" Convert a direction to a unitless vector of length 1.\n\n Direction3d.toVector Direction3d.y\n --> Vector3d.unitless 0 1 0\n\n","type":"Direction3d.Direction3d coordinates -> Vector3d.Vector3d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a direction directly from its X, Y and Z components. Note that\n**you must ensure that the sum of the squares of the given components is exactly\none**:\n\n Direction3d.unsafe { x = 1, y = 0, z = 0 }\n\n Direction3d.unsafe { x = 0, y = -1, z = 0 }\n\n Direction3d.unsafe { x = 0.6, y = 0, z = 0.8 }\n\nare all valid but\n\n Direction3d.unsafe { x = 2, y = 0, z = 0 }\n\n Direction3d.unsafe { x = 1, y = 1, z = 1 }\n\nare not. Instead of using `Direction3d.unsafe`, it may be easier to use\nconstructors like `Direction3d.on` or `Direction3d.xyZ` (which will always\nresult in a valid direction), or start with existing directions and transform\nthem as necessary.\n\n","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Direction3d.Direction3d coordinates"},{"name":"unwrap","comment":" Extract the X, Y and Z components of a direction as a record.\n","type":"Direction3d.Direction3d coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"x","comment":" Synonym for `Direction3d.positiveX`.\n","type":"Direction3d.Direction3d coordinates"},{"name":"xComponent","comment":" Get the X component of a direction.\n\n Direction3d.xComponent Direction3d.x\n --> 1\n\n Direction3d.xComponent Direction3d.y\n --> 0\n\n","type":"Direction3d.Direction3d coordinates -> Basics.Float"},{"name":"xy","comment":" Construct a direction in the XY plane given an angle measured from\npositive X towards positive Y:\n\n Direction3d.xy (Angle.degrees 0)\n --> Direction3d.positiveX\n\n Direction3d.xy (Angle.degrees 90)\n --> Direction3d.positiveY\n\n Direction3d.xy (Angle.degrees 180)\n --> Direction3d.negativeX\n\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"xyZ","comment":" Construct a direction given:\n\n - Its azimuth angle _in_ the XY plane, from positive X towards positive Y\n - Its elevation angle _from_ the XY plane towards positive Z\n\nSee\n[here](http://www.ece.northwestern.edu/local-apps/matlabhelp/techdoc/visualize/chview3.html)\nfor an illustration of these two angles (except that this function measures\nazimuth from positive X towards positive Y, not negative Y towards positive\nX). Note that `Direction3d.xyZ` is a generalized version of `Direction3d.xy`;\n\n Direction3d.xy angle\n\nis equivalent to\n\n Direction3d.xyZ angle (Angle.degrees 0)\n\n","type":"Angle.Angle -> Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"xz","comment":" Construct a direction in the XZ plane given an angle measured from\npositive X towards positive Z.\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"y","comment":" Synonym for `Direction3d.positiveY`.\n","type":"Direction3d.Direction3d coordinates"},{"name":"yComponent","comment":" Get the Y component of a direction.\n\n Direction3d.yComponent Direction3d.y\n --> 1\n\n Direction3d.yComponent Direction3d.z\n --> 0\n\n","type":"Direction3d.Direction3d coordinates -> Basics.Float"},{"name":"yx","comment":" Construct a direction in the XY plane given an angle measured from\npositive Y towards positive X:\n\n Direction3d.yx (Angle.degrees 0)\n --> Direction3d.positiveY\n\n Direction3d.yx (Angle.degrees 90)\n --> Direction3d.positiveX\n\n Direction3d.yx (Angle.degrees -90)\n --> Direction3d.negativeX\n\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"yz","comment":" Construct a direction in the YZ plane given an angle measured from\npositive Y towards positive Z.\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"yzX","comment":" Construct a direction given:\n\n - Its azimuth angle in the YZ plane, from positive Y towards positive Z\n - Its elevation angle from the YZ plane towards positive X\n\nThis is generally not as useful as `Direction3d.xyZ` or `Direction3d.zxY`.\n\n","type":"Angle.Angle -> Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"z","comment":" Synonym for `Direction3d.positiveZ`.\n","type":"Direction3d.Direction3d coordinates"},{"name":"zComponent","comment":" Get the Z component of a direction.\n\n Direction3d.zComponent Direction3d.z\n --> 1\n\n Direction3d.zComponent Direction3d.x\n --> 0\n\n","type":"Direction3d.Direction3d coordinates -> Basics.Float"},{"name":"zx","comment":" Construct a direction in the XZ plane given an angle measured from\npositive Z towards positive X.\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"zxY","comment":" Construct a direction given:\n\n - Its azimuth angle in the ZX plane, from positive Z towards positive X\n - Its elevation angle from the ZX plane towards positive Y\n\nThis may be useful if you like to use positive Y as your global up vector.\n\n","type":"Angle.Angle -> Angle.Angle -> Direction3d.Direction3d coordinates"},{"name":"zy","comment":" Construct a direction in the YZ plane given an angle measured from\npositive Z towards positive Y.\n","type":"Angle.Angle -> Direction3d.Direction3d coordinates"}],"binops":[]},{"name":"Ellipse2d","comment":" An [ellipse](https://en.wikipedia.org/wiki/Ellipse) is defined by a center\npoint, X and Y radius, and X and Y axes (which will always be perpendicular to\neach other). Ellipses are symmetric about their X and Y axes. This module\nincludes functionality for\n\n - Constructing ellipses\n - Scaling, rotating and translating ellipses\n - Converting ellipses between different coordinate systems\n\n@docs Ellipse2d\n\n\n# Constructors\n\n@docs with\n\n\n# Properties\n\n@docs centerPoint, axes, xAxis, yAxis, xDirection, yDirection, xRadius, yRadius, area\n\n\n# Conversion\n\n@docs toEllipticalArc\n\n\n# Bounds\n\n@docs boundingBox, signedDistanceAlong\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Ellipse2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Ellipse2d units coordinates"}],"values":[{"name":"area","comment":" Get the area of an ellipse.\n\n Ellipse2d.area exampleEllipse\n --> Area.squareMeters 47.1239\n\n","type":"Ellipse2d.Ellipse2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert an ellipse from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Ellipse2d.Ellipse2d units1 coordinates -> Ellipse2d.Ellipse2d units2 coordinates"},{"name":"at_","comment":" Convert an ellipse from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Ellipse2d.Ellipse2d units1 coordinates -> Ellipse2d.Ellipse2d units2 coordinates"},{"name":"axes","comment":" Get the X and Y axes of an ellipse as a `Frame2d`.\n\n Ellipse2d.axes exampleEllipse\n --> Frame2d.withXDirection (Direction2d.degrees 30)\n --> (Point2d.meters 10 10)\n\n","type":"Ellipse2d.Ellipse2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given ellipse.\n","type":"Ellipse2d.Ellipse2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centerPoint","comment":" Get the center point of an ellipse.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an ellipse across a given axis. Note that if the axes of the original\nellipse form a [right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nframe, then the axes of the mirrored ellipse will form a left-handed frame (and\nvice versa).\n","type":"Axis2d.Axis2d units coordinates -> Ellipse2d.Ellipse2d units coordinates -> Ellipse2d.Ellipse2d units coordinates"},{"name":"placeIn","comment":" Take an ellipse considered to be defined in local coordinates relative to a\ngiven reference frame, and return that circle expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Ellipse2d.Ellipse2d units localCoordinates -> Ellipse2d.Ellipse2d units globalCoordinates"},{"name":"relativeTo","comment":" Take an ellipse defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Ellipse2d.Ellipse2d units globalCoordinates -> Ellipse2d.Ellipse2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate an ellipse around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Ellipse2d.Ellipse2d units coordinates -> Ellipse2d.Ellipse2d units coordinates"},{"name":"scaleAbout","comment":" Scale an ellipse about a given point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Ellipse2d.Ellipse2d units coordinates -> Ellipse2d.Ellipse2d units coordinates"},{"name":"signedDistanceAlong","comment":" Project an ellipse onto an axis, returning the range of projected distances\nalong that axis.\n","type":"Axis2d.Axis2d units coordinates -> Ellipse2d.Ellipse2d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"toEllipticalArc","comment":" Convert an ellipse to a 360 degree elliptical arc.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Geometry.Types.EllipticalArc2d units coordinates"},{"name":"translateBy","comment":" Translate an ellipse by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Ellipse2d.Ellipse2d units coordinates -> Ellipse2d.Ellipse2d units coordinates"},{"name":"translateIn","comment":" Translate an ellipse in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Ellipse2d.Ellipse2d units coordinates -> Ellipse2d.Ellipse2d units coordinates"},{"name":"with","comment":" Construct an ellipse from its center point, X direction, and X and Y radii.\nIf you pass a negative radius, the absolute value will be used.\n\n exampleEllipse =\n Ellipse2d.with\n { centerPoint = Point2d.meters 10 10\n , xDirection = Direction2d.degrees 30\n , xRadius = Length.meters 5\n , yRadius = Length.meters 3\n }\n\n","type":"{ centerPoint : Point2d.Point2d units coordinates, xDirection : Direction2d.Direction2d coordinates, xRadius : Quantity.Quantity Basics.Float units, yRadius : Quantity.Quantity Basics.Float units } -> Ellipse2d.Ellipse2d units coordinates"},{"name":"xAxis","comment":" Get the X axis of an ellipse.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"xDirection","comment":" Get the direction of the ellipse's X axis.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Direction2d.Direction2d coordinates"},{"name":"xRadius","comment":" Get the radius of an ellipse along its X axis. This may be either the\nminimum or maximum radius.\n\n Ellipse2d.xRadius exampleEllipse\n --> Length.meters 5\n\n","type":"Ellipse2d.Ellipse2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yAxis","comment":" Get the Y axis of an ellipse.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"yDirection","comment":" Get the direction of an ellipse's Y axis.\n","type":"Ellipse2d.Ellipse2d units coordinates -> Direction2d.Direction2d coordinates"},{"name":"yRadius","comment":" Get the radius of an ellipse along its Y axis. This may be either the\nminimum or maximum radius.\n\n Ellipse2d.yRadius exampleEllipse\n --> Length.meters 3\n\n","type":"Ellipse2d.Ellipse2d units coordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"Ellipse3d","comment":" An `Ellipse3d` is an `Ellipse2d` in 3D space. This module contains\nfunctionality for:\n\n - Constructing ellipses\n - Scaling, rotating and translating ellipses\n - Converting ellipses between different coordinate systems\n\n@docs Ellipse3d\n\n\n# Constructors\n\n@docs on\n\n\n# Properties\n\n@docs centerPoint, axes, xAxis, yAxis, xDirection, yDirection, xRadius, yRadius, area\n\n\n# Conversion\n\n@docs toEllipticalArc\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Ellipse3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Ellipse3d units coordinates"}],"values":[{"name":"area","comment":" Get the area of an ellipse.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert an ellipse from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Ellipse3d.Ellipse3d units1 coordinates -> Ellipse3d.Ellipse3d units2 coordinates"},{"name":"at_","comment":" Convert an ellipse from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Ellipse3d.Ellipse3d units1 coordinates -> Ellipse3d.Ellipse3d units2 coordinates"},{"name":"axes","comment":" Get the X and Y axes of an ellipse as a `SketchPlane3d`.\n","type":"Ellipse3d.Ellipse3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"centerPoint","comment":" Get the center point of an ellipse.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an ellipse across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Ellipse3d.Ellipse3d units coordinates -> Ellipse3d.Ellipse3d units coordinates"},{"name":"on","comment":" Construct a 3D ellipse by placing a 2D ellipse on a sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates { defines : coordinates2d } -> Ellipse2d.Ellipse2d units coordinates2d -> Ellipse3d.Ellipse3d units coordinates"},{"name":"placeIn","comment":" Take an ellipse considered to be defined in local coordinates relative to a\ngiven reference frame, and return that circle expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Ellipse3d.Ellipse3d units localCoordinates -> Ellipse3d.Ellipse3d units globalCoordinates"},{"name":"relativeTo","comment":" Take an ellipse defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Ellipse3d.Ellipse3d units globalCoordinates -> Ellipse3d.Ellipse3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate an ellipse around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Ellipse3d.Ellipse3d units coordinates -> Ellipse3d.Ellipse3d units coordinates"},{"name":"scaleAbout","comment":" Scale an ellipse about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Ellipse3d.Ellipse3d units coordinates -> Ellipse3d.Ellipse3d units coordinates"},{"name":"toEllipticalArc","comment":" Convert an ellipse to a 360 degree elliptical arc.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Geometry.Types.EllipticalArc3d units coordinates"},{"name":"translateBy","comment":" Translate an ellipse by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Ellipse3d.Ellipse3d units coordinates -> Ellipse3d.Ellipse3d units coordinates"},{"name":"translateIn","comment":" Translate an ellipse in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Ellipse3d.Ellipse3d units coordinates -> Ellipse3d.Ellipse3d units coordinates"},{"name":"xAxis","comment":" Get the X axis of an ellipse.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"xDirection","comment":" Get the direction of the ellipse's X axis.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"xRadius","comment":" Get the radius of an ellipse along its X axis. This may be either the\nminimum or maximum radius.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yAxis","comment":" Get the Y axis of an ellipse.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"yDirection","comment":" Get the direction of an ellipse's Y axis.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"yRadius","comment":" Get the radius of an ellipse along its Y axis. This may be either the\nminimum or maximum radius.\n","type":"Ellipse3d.Ellipse3d units coordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"EllipticalArc2d","comment":" An `EllipticalArc2d` is a section of an `Ellipse2d` with a start and end\npoint. This module includes functionality for\n\n - Constructing an elliptical arc from its center or end points\n - Scaling, rotating, translating and mirroring elliptical arcs\n - Evaluating points and derivative vectors along elliptical arcs\n - Forming arc length parameterizations of elliptical arcs\n\nThe `startAngle` and `sweptAngle` values referred to below are not actually\nproper angles but instead refer to values of the [ellipse parameter](https://en.wikipedia.org/wiki/Ellipse#Parametric_representation).\nHowever, in simple cases you don't need to worry about the difference - if\n`startAngle` and `sweptAngle` are both multiples of 90 degrees, then you can\ntreat them as actual angles and everything will behave as you expect.\n\n@docs EllipticalArc2d\n\n\n# Constructors\n\n@docs with, fromEndpoints\n\n\n# Properties\n\n@docs startAngle, sweptAngle, startPoint, endPoint\n\nAll remaining properties of elliptical arcs are actually just [properties of the\nunderlying ellipse](Ellipse2d#properties).\n\n@docs centerPoint, axes, xAxis, yAxis, xDirection, yDirection, xRadius, yRadius\n\n\n# Bounds\n\n@docs boundingBox, signedDistanceAlong\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, midpoint, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `EllipticalArc2d`. If you need to do something fancy, you can extract\nthese two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, maxSecondDerivativeMagnitude, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" An elliptical arc that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"EllipticalArc2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.EllipticalArc2d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate an elliptical arc as a polyline, within a given tolerance. Every\npoint on the returned polyline will be within the given tolerance of the\nelliptical arc.\n","type":"Quantity.Quantity Basics.Float units -> EllipticalArc2d.EllipticalArc2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of an elliptical arc, to within the tolerance\ngiven when calling `arcLengthParameterized`.\n","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given elliptical arc, with a\ngiven accuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> EllipticalArc2d.Nondegenerate units coordinates -> EllipticalArc2d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert an elliptical arc from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> EllipticalArc2d.EllipticalArc2d units1 coordinates -> EllipticalArc2d.EllipticalArc2d units2 coordinates"},{"name":"at_","comment":" Convert an elliptical arc from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> EllipticalArc2d.EllipticalArc2d units1 coordinates -> EllipticalArc2d.EllipticalArc2d units2 coordinates"},{"name":"axes","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"boundingBox","comment":" Get the bounding box of an elliptical arc.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centerPoint","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"endPoint","comment":" Get the end point of an elliptical arc.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of an elliptical arc at a given parameter value.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"fromArcLengthParameterized","comment":" ","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"fromEndpoints","comment":" Attempt to construct an elliptical arc from its endpoints, X direction, and\nX and Y radii. For any given valid set of these inputs, there are four possible\nsolutions, so you also need to specify which of the four solutions you want -\nwhether the swept angle of the arc should be less than or greater than 180\ndegrees, and whether the swept angle should be positive (counterclockwise) or\nnegative (clockwise).\n\nThis function will return `Nothing` if no solution can found. Typically this\nmeans that the two endpoints are too far apart, but could also mean that one of\nthe specified radii was negative or zero, or the two given points were\ncoincident.\n\nThe behavior of this function is very close to [the SVG spec](https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes),\nbut when 'out of range' parameters are given this function will simply return\n`Nothing` instead of attempting to degrade gracefully (for example, by\nincreasing X and Y radius slightly if the given endpoints are slightly too far\napart). Note that this means this function is dangerous to use for 180 degree\narcs, since then slight numerical roundoff can mean the difference between a\nsolution being found and not - for 180 degree arcs it is safer to use\n`EllipticalArc2d.with` instead.\n\n","type":"{ startPoint : Point2d.Point2d units coordinates, endPoint : Point2d.Point2d units coordinates, xRadius : Quantity.Quantity Basics.Float units, yRadius : Quantity.Quantity Basics.Float units, xDirection : Direction2d.Direction2d coordinates, sweptAngle : SweptAngle.SweptAngle } -> Maybe.Maybe (EllipticalArc2d.EllipticalArc2d units coordinates)"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate elliptical arc back to a general `EllipticalArc2d`.\n","type":"EllipticalArc2d.Nondegenerate units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"maxSecondDerivativeMagnitude","comment":" Find a conservative upper bound on the magnitude of the second derivative of\nan elliptical arc. This can be useful when determining error bounds for various\nkinds of linear approximations.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midpoint","comment":" Get the midpoint of an elliptical arc. Note that this is the point half way along the\nelliptical arc by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an elliptical arc across a given axis.\n","type":"Axis2d.Axis2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate elliptical arc from a general\n`EllipticalArc2d`. If the arc is in fact degenerate (consists of a single\npoint), returns an `Err` with that point.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Result.Result (Point2d.Point2d units coordinates) (EllipticalArc2d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate an elliptical\narc to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> EllipticalArc2d.EllipticalArc2d units coordinats -> Basics.Int"},{"name":"placeIn","comment":" Take an elliptical arc considered to be defined in local coordinates\nrelative to a given reference frame, and return that arc expressed in global\ncoordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> EllipticalArc2d.EllipticalArc2d units localCoordinates -> EllipticalArc2d.EllipticalArc2d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along an elliptical arc at a given arc length.\n","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates"},{"name":"pointOn","comment":" Get the point along an elliptical arc at a given parameter value.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"relativeTo","comment":" Take an elliptical arc defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> EllipticalArc2d.EllipticalArc2d units globalCoordinates -> EllipticalArc2d.EllipticalArc2d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an elliptical arc, so that the start point becomes\nthe end point and vice versa. Does not change the shape of the arc or any\nproperties of the underlying ellipse.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"rotateAround","comment":" Rotate an elliptical arc around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate elliptical arc\nat a given parameter value.\n","type":"EllipticalArc2d.Nondegenerate units coordinates -> Basics.Float -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along an elliptical arc at a given arc\nlength.\n","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"scaleAbout","comment":" Scale an elliptical arc about a given point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"segments","comment":" Approximate an elliptical arc by a given number of line segments. Note that\nthe number of points in the polyline will be one more than the number of\nsegments.\n","type":"Basics.Int -> EllipticalArc2d.EllipticalArc2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"signedDistanceAlong","comment":" Project an elliptical arc onto an axis, returning the range of projected\ndistances along that axis.\n","type":"Axis2d.Axis2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"startAngle","comment":" The start angle of an elliptical arc is the value of the [ellipse parameter](https://en.wikipedia.org/wiki/Ellipse#Parametric_representation)\nat the start point of the arc.\n\n EllipticalArc2d.startAngle exampleArc\n --> Angle.degrees 0\n\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Angle.Angle"},{"name":"startPoint","comment":" Get the start point of an elliptical arc.\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"sweptAngle","comment":" The swept angle of an elliptical arc is the difference between values of the\n[ellipse parameter](https://en.wikipedia.org/wiki/Ellipse#Parametric_representation)\nfrom the start point to the end point of the arc.\n\n EllipticalArc2d.sweptAngle exampleArc\n --> Angle.degrees 90\n\n","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Angle.Angle"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate elliptical arc at a given\nparameter value.\n","type":"EllipticalArc2d.Nondegenerate units coordinates -> Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along an elliptical arc at a given arc length.\n","type":"EllipticalArc2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction2d.Direction2d coordinates"},{"name":"translateBy","comment":" Translate an elliptical arc by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"translateIn","comment":" Translate an elliptical arc in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> EllipticalArc2d.EllipticalArc2d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"with","comment":" Construct an elliptical arc from its center point, X direction, X and Y\nradii, start angle and swept angle. If you pass a negative radius, the absolute\nvalue will be used.\n\nFor example, to construct a simple 90 degree elliptical arc, you might use\n\n exampleArc =\n EllipticalArc2d.with\n { centerPoint = Point2d.origin\n , xDirection = Direction2d.x\n , xRadius = Length.meters 2\n , yRadius = Length.meters 1\n , startAngle = Angle.degrees 0\n , sweptAngle = Angle.degrees 90\n }\n\n![90 degree elliptical arc](https://ianmackenzie.github.io/elm-geometry/1.0.0/EllipticalArc2d/with1.svg)\n\nTo make an inclined 180 degree elliptical arc, you might use\n\n EllipticalArc2d.with\n { centerPoint = Point2d.origin\n , xDirection = Direction2d.degrees 30\n , xRadius = Length.meters 2\n , yRadius = Length.meters 1\n , startAngle = Angle.degrees -90\n , sweptAngle = Angle.degrees 180\n }\n\n![180 degree inclined elliptical arc](https://ianmackenzie.github.io/elm-geometry/1.0.0/EllipticalArc2d/with2.svg)\n\n","type":"{ centerPoint : Point2d.Point2d units coordinates, xDirection : Direction2d.Direction2d coordinates, xRadius : Quantity.Quantity Basics.Float units, yRadius : Quantity.Quantity Basics.Float units, startAngle : Angle.Angle, sweptAngle : Angle.Angle } -> EllipticalArc2d.EllipticalArc2d units coordinates"},{"name":"xAxis","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"xDirection","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Direction2d.Direction2d coordinates"},{"name":"xRadius","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yAxis","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"yDirection","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Direction2d.Direction2d coordinates"},{"name":"yRadius","comment":" ","type":"EllipticalArc2d.EllipticalArc2d units coordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"EllipticalArc3d","comment":" An `EllipticalArc3d` is a section of an `Ellipse3d` with a start and end\npoint, or equivalently a 3D version of an `EllipticalArc2d`. This module\nincludes functionality for\n\n - Constructing an elliptical arc from its center or end points\n - Scaling, rotating, translating and mirroring elliptical arcs\n - Evaluating points and derivative vectors along elliptical arcs\n - Forming arc length parameterizations of elliptical arcs\n\n@docs EllipticalArc3d\n\n\n# Constructors\n\n@docs on\n\n\n# Properties\n\n@docs startAngle, sweptAngle, startPoint, endPoint\n\nAll remaining properties of elliptical arcs are actually just [properties of the\nunderlying ellipse](Ellipse3d#properties).\n\n@docs centerPoint, axes, xAxis, yAxis, xDirection, yDirection, xRadius, yRadius\n\n\n# Bounds\n\n@docs boundingBox, signedDistanceAlong\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, projectInto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, midpoint, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `EllipticalArc3d`. If you need to do something fancy, you can extract\nthese two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, maxSecondDerivativeMagnitude, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" An elliptical arc that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"EllipticalArc3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.EllipticalArc3d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate an elliptical arc as a polyline, within a given tolerance. Every\npoint on the returned polyline will be within the given tolerance of the\nelliptical arc.\n","type":"Quantity.Quantity Basics.Float units -> EllipticalArc3d.EllipticalArc3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of an elliptical arc, to within the tolerance\ngiven when calling `arcLengthParameterized`.\n","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given elliptical arc, with a\ngiven accuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> EllipticalArc3d.Nondegenerate units coordinates -> EllipticalArc3d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert an elliptical arc from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> EllipticalArc3d.EllipticalArc3d units1 coordinates -> EllipticalArc3d.EllipticalArc3d units2 coordinates"},{"name":"at_","comment":" Convert an elliptical arc from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> EllipticalArc3d.EllipticalArc3d units1 coordinates -> EllipticalArc3d.EllipticalArc3d units2 coordinates"},{"name":"axes","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"boundingBox","comment":" Get the bounding box of an elliptical arc.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinatets"},{"name":"centerPoint","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"endPoint","comment":" Get the end point of an elliptical arc.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of an elliptical arc at a given parameter value.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"fromArcLengthParameterized","comment":" ","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate elliptical arc back to a general `EllipticalArc3d`.\n","type":"EllipticalArc3d.Nondegenerate units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"maxSecondDerivativeMagnitude","comment":" Find a conservative upper bound on the magnitude of the second derivative of\nan elliptical arc. This can be useful when determining error bounds for various\nkinds of linear approximations.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"midpoint","comment":" Get the midpoint of an elliptical arc. Note that this is the point half way along the\nelliptical arc by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror an elliptical arc across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate elliptical arc from a general\n`EllipticalArc3d`. If the arc is in fact degenerate (consists of a single\npoint), returns an `Err` with that point.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Result.Result (Point3d.Point3d units coordinates) (EllipticalArc3d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate an elliptical\narc to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> EllipticalArc3d.EllipticalArc3d units coordinats -> Basics.Int"},{"name":"on","comment":" Construct a 3D elliptical arc by placing a 2D elliptical arc on a sketch\nplane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates { defines : coordinates2d } -> EllipticalArc2d.EllipticalArc2d units coordinates2d -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"placeIn","comment":" Take an elliptical arc considered to be defined in local coordinates\nrelative to a given reference frame, and return that arc expressed in global\ncoordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> EllipticalArc3d.EllipticalArc3d units localCoordinates -> EllipticalArc3d.EllipticalArc3d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along an elliptical arc at a given arc length.\n","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"pointOn","comment":" Get the point along an elliptical arc at a given parameter value.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"projectInto","comment":" Project a 3D elliptical arc into a sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates { defines : coordinates2d } -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc2d.EllipticalArc2d units coordinates2d"},{"name":"projectOnto","comment":" Project an elliptical arc onto a plane.\n","type":"Plane3d.Plane3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"relativeTo","comment":" Take an elliptical arc defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> EllipticalArc3d.EllipticalArc3d units globalCoordinates -> EllipticalArc3d.EllipticalArc3d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of an elliptical arc, so that the start point becomes\nthe end point and vice versa. Does not change the shape of the arc or any\nproperties of the underlying ellipse.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"rotateAround","comment":" Rotate an elliptical arc around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate elliptical arc\nat a given parameter value.\n","type":"EllipticalArc3d.Nondegenerate units coordinates -> Basics.Float -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along an elliptical arc at a given arc\nlength.\n","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"scaleAbout","comment":" Scale an elliptical arc about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"segments","comment":" Approximate an elliptical arc by a given number of line segments. Note that\nthe number of points in the polyline will be one more than the number of\nsegments.\n","type":"Basics.Int -> EllipticalArc3d.EllipticalArc3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"signedDistanceAlong","comment":" Project an elliptical arc onto an axis, returning the range of projected\ndistances along that axis.\n","type":"Axis3d.Axis3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"startAngle","comment":" The start angle of an elliptical arc is the value of the [ellipse parameter](https://en.wikipedia.org/wiki/Ellipse#Parametric_representation)\nat the start point of the arc.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Angle.Angle"},{"name":"startPoint","comment":" Get the start point of an elliptical arc.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"sweptAngle","comment":" The swept angle of an elliptical arc is the difference between values of the\n[ellipse parameter](https://en.wikipedia.org/wiki/Ellipse#Parametric_representation)\nfrom the start point to the end point of the arc.\n","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Angle.Angle"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate elliptical arc at a given\nparameter value.\n","type":"EllipticalArc3d.Nondegenerate units coordinates -> Basics.Float -> Direction3d.Direction3d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along an elliptical arc at a given arc length.\n","type":"EllipticalArc3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction3d.Direction3d coordinates"},{"name":"translateBy","comment":" Translate an elliptical arc by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"translateIn","comment":" Translate an elliptical arc in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> EllipticalArc3d.EllipticalArc3d units coordinates -> EllipticalArc3d.EllipticalArc3d units coordinates"},{"name":"xAxis","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"xDirection","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"xRadius","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yAxis","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"yDirection","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"yRadius","comment":" ","type":"EllipticalArc3d.EllipticalArc3d units coordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"Frame2d","comment":" A `Frame2d` has an origin point and a pair of X and Y directions (which are\nalways perpendicular to each other). It can be thought of as:\n\n - A local coordinate system: Most geometric types have associated `relativeTo`\n and `placeIn` functions that convert values of that type from global\n coordinates to local coordinates in a particular frame, and vice versa.\n - A pair of X and Y axes: It is often convenient to (for example) mirror\n across the X axis of a frame, or project onto its Y axis. Frames can\n also themselves be translated, rotated and mirrored!\n - A combined 2D position and orientation: For example, a `Frame2d` could be\n used to define the position and orientation of a spaceship in a 2D game.\n Movement of the ship would then be done by translating and rotating the\n frame.\n\n@docs Frame2d\n\n\n# Constants\n\n@docs atOrigin\n\n\n# Constructors\n\n@docs atPoint, withAngle, withXDirection, withYDirection, fromXAxis, fromYAxis, copy, unsafe\n\n\n# Properties\n\n@docs originPoint, xDirection, yDirection, isRightHanded, xAxis, yAxis\n\n\n# Transformations\n\n@docs reverseX, reverseY, moveTo, rotateBy, rotateAround, translateBy, translateIn, translateAlongOwn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Frame2d","comment":" The type parameters of a `Frame2d` indicate what units and coordinate\nsystems it's defined in, and what coordinate system (if any) it itself defines.\nA concrete `Frame2d` type might look like\n\n type alias Frame =\n Frame2d Meters World { defines : Local }\n\nwhich can be read as \"a `Frame2d` defined in meters in world coordinates, which\nitself defines local coordinates\". For frames that don't define a local\ncoordinate system, you could use\n\n type alias Frame =\n Frame2d Meters World {}\n\nMany functions in this module don't care about the third type argument (whether\nit's a record with a `defines` field like in the first example, an empty record\nlike in the second example, or even something else entirely) but functions like\n`placeIn` and `relativeTo` expect the `{ defines : localCoordinates }` pattern.\n\n","args":["units","coordinates","defines"],"type":"Geometry.Types.Frame2d units coordinates defines"}],"values":[{"name":"at","comment":" Convert a frame from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Frame2d.Frame2d units1 coordinates defines -> Frame2d.Frame2d units2 coordinates defines"},{"name":"atOrigin","comment":" The global XY frame, centered at the origin.\n\n Frame2d.originPoint Frame2d.atOrigin\n --> Point2d.origin\n\n Frame2d.xDirection Frame2d.atOrigin\n --> Direction2d.x\n\n Frame2d.yDirection Frame2d.atOrigin\n --> Direction2d.y\n\n","type":"Frame2d.Frame2d units coordinates defines"},{"name":"atPoint","comment":" Construct a frame aligned with the global XY frame but with the given origin\npoint.\n\n frame =\n Frame2d.atPoint (Point2d.meters 2 3)\n\n Frame2d.originPoint frame\n --> Point2d.meters 2 3\n\n Frame2d.xDirection frame\n --> Direction2d.x\n\n Frame2d.yDirection frame\n --> Direction2d.y\n\n","type":"Point2d.Point2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"at_","comment":" Convert a frame from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Frame2d.Frame2d units1 coordinates defines -> Frame2d.Frame2d units2 coordinates defines"},{"name":"copy","comment":" Create a 'fresh copy' of a frame: one with the same origin point and X/Y\ndirections, but that can be used to define a different local coordinate system.\nSometimes useful in generic/library code. Despite the name, this is efficient:\nit really just returns the value you passed in, but with a different type.\n","type":"Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"fromXAxis","comment":" Construct a `Frame2d` given its X axis;\n\n Frame2d.fromXAxis axis\n\nis equivalent to\n\n Frame2d.withXDirection (Axis2d.direction axis)\n (Axis2d.originPoint axis)\n\n","type":"Axis2d.Axis2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"fromYAxis","comment":" Construct a `Frame2d` given its Y axis;\n\n Frame2d.fromYAxis axis\n\nis equivalent to\n\n Frame2d.withYDirection (Axis2d.direction axis)\n (Axis2d.originPoint axis)\n\n","type":"Axis2d.Axis2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"isRightHanded","comment":" Check if a frame is [right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness).\n\n Frame2d.isRightHanded Frame2d.atOrigin\n --> True\n\n Frame2d.isRightHanded\n (Frame2d.reverseX Frame2d.atOrigin)\n --> False\n\nAll predefined frames are right-handed, and most operations on frames preserve\nhandedness, so about the only ways to end up with a left-handed frame are by\nconstructing one explicitly with `unsafe` or by mirroring a right-handed frame.\n\n","type":"Frame2d.Frame2d units coordinates defines -> Basics.Bool"},{"name":"mirrorAcross","comment":" Mirror a frame across an axis.\n\n frame =\n Frame2d.atPoint (Point2d.meters 2 3)\n\n mirroredFrame =\n Frame2d.mirrorAcross Axis2d.x frame\n\n Frame2d.originPoint mirroredFrame\n --> Point2d.meters 2 -3\n\n Frame2d.xDirection mirroredFrame\n --> Direction2d.x\n\n Frame2d.yDirection mirroredFrame\n --> Direction2d.negativeY\n\nNote that this will switch the [handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n\n","type":"Axis2d.Axis2d units coordinates -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"moveTo","comment":" Move a frame so that it has the given origin point.\n\n point =\n Point2d.meters 1 1\n\n Frame2d.atOrigin |> Frame2d.moveTo point\n --> Frame2d.atPoint point\n\n","type":"Point2d.Point2d units coordinates -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"originPoint","comment":" Get the origin point of a given frame.\n","type":"Frame2d.Frame2d units coordinates defines -> Point2d.Point2d units coordinates"},{"name":"placeIn","comment":" Take one frame defined in global coordinates and a second frame defined\nin local coordinates relative to the first frame, and return the second frame\nexpressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Frame2d.Frame2d units localCoordinates defines -> Frame2d.Frame2d units globalCoordinates defines"},{"name":"relativeTo","comment":" Take two frames defined in global coordinates, and return the second one\nexpressed in local coordinates relative to the first.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Frame2d.Frame2d units globalCoordinates defines -> Frame2d.Frame2d units localCoordinates defines"},{"name":"reverseX","comment":" Reverse the X direction of a frame, leaving its Y direction and origin point\nthe same. Note that this will switch the\n[handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n","type":"Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"reverseY","comment":" Reverse the Y direction of a frame, leaving its X direction and origin point\nthe same. Note that this will switch the\n[handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n","type":"Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"rotateAround","comment":" Rotate a frame counterclockwise around a given point by a given angle. The\nframe's origin point will be rotated around the given point by the given angle,\nand its X and Y basis directions will be rotated by the given angle.\n\n rotatedFrame =\n Frame2d.atPoint (Point2d.meters 1 1)\n |> Frame2d.rotateAround Point2d.origin\n (Angle.degrees 45)\n\n Frame2d.originPoint rotatedFrame\n --> Point2d.meters 0 1.4142\n\n Frame2d.xDirection rotatedFrame\n --> Direction2d.degrees 45\n\n Frame2d.yDirection rotatedFrame\n --> Direction2d.degrees 135\n\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"rotateBy","comment":" Rotate a frame counterclockwise by a given angle around the frame's own\norigin point. The resulting frame will have the same origin point, and its X and\nY directions will be rotated by the given angle.\n\n rotatedFrame =\n Frame2d.atOrigin\n |> Frame2d.rotateBy (Angle.degrees 30)\n\n Frame2d.xDirection rotatedFrame\n --> Direction2d.degrees 30\n\n Frame2d.yDirection rotatedFrame\n --> Direction2d.degrees 120\n\n","type":"Angle.Angle -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"translateAlongOwn","comment":" Translate a frame along one of its own axes by a given distance.\n\nThe first argument is a function that returns the axis to translate along, given\nthe current frame. The majority of the time this argument will be either\n`Frame2d.xAxis` or `Frame2d.yAxis`. The second argument is the distance to\ntranslate along the given axis.\n\nThis function is convenient when constructing frames via a series of\ntransformations. For example,\n\n frame =\n Frame2d.atPoint (Point2d.meters 2 0)\n |> Frame2d.rotateBy (Angle.degrees 45)\n |> Frame2d.translateAlongOwn Frame2d.xAxis\n (Length.meters 2)\n\nmeans \"construct a frame at the point (2, 0), rotate it around its own origin\npoint by 45 degrees, then translate it along its own X axis by 2 meters\",\nresulting in\n\n Frame2d.originPoint frame\n --> Point2d.meters 3.4142 1.4142\n\n Frame2d.xDirection frame\n --> Direction2d.degrees 45\n\n Frame2d.yDirection frame\n --> Direction2d.degrees 135\n\n","type":"(Frame2d.Frame2d units coordinates defines1 -> Axis2d.Axis2d units coordinates) -> Quantity.Quantity Basics.Float units -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"translateBy","comment":" Translate a frame by a given displacement.\n\n frame =\n Frame2d.atPoint (Point2d.meters 2 3)\n\n displacement =\n Vector2d.meters 1 1\n\n Frame2d.translateBy displacement frame\n --> Frame2d.atPoint (Point2d.meters 3 4)\n\n","type":"Vector2d.Vector2d units coordinates -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"translateIn","comment":" Translate a frame in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Frame2d.Frame2d units coordinates defines1 -> Frame2d.Frame2d units coordinates defines2"},{"name":"unsafe","comment":" Construct a frame directly from its origin point and X and Y directions:\n\n frame =\n Frame2d.unsafe\n { originPoint = Point2d.meters 2 3\n , xDirection = Direction2d.degrees 45\n , yDirection = Direction2d.degrees 135\n }\n\nIn this case **you must be careful to ensure that the X and Y directions are\nperpendicular**. To construct pairs of perpendicular directions,\n[`Direction2d.orthonormalize`](Direction2d#orthonormalize) or\n[`Direction2d.orthogonalize`](Direction2d#orthogonalize) may be useful.\n\n","type":"{ originPoint : Point2d.Point2d units coordinates, xDirection : Direction2d.Direction2d coordinates, yDirection : Direction2d.Direction2d coordinates } -> Frame2d.Frame2d units coordinates defines"},{"name":"withAngle","comment":" Construct a frame with the given angle and origin point. The angle is\nthe amount the returned frame will be rotated relative to the global XY frame,\nor equivalently the angle of the frame's X direction;\n\n Frame2d.withAngle angle point\n\nis equivalent to\n\n Frame2d.withXDirection\n (Direction2d.fromAngle givenAngle)\n point\n\n","type":"Angle.Angle -> Point2d.Point2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"withXDirection","comment":" Construct a frame with the given X axis direction, having the given origin\npoint. The Y axis direction will be constructed by rotating the given X\ndirection 90 degrees counterclockwise:\n\n frame =\n Frame2d.withXDirection (Direction2d.degrees 30)\n (Point2d.meters 2 3)\n\n Frame2d.yDirection frame\n --> Direction2d.degrees 120\n\n","type":"Direction2d.Direction2d coordinates -> Point2d.Point2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"withYDirection","comment":" Construct a frame with the given Y axis direction, having the given origin\npoint. The X axis direction will be constructed by rotating the given Y\ndirection 90 degrees clockwise:\n\n frame =\n Frame2d.withYDirection (Direction2d.degrees 30)\n (Point2d.meters 2 3)\n\n Frame2d.xDirection frame\n --> Direction2d.degrees -60\n\n","type":"Direction2d.Direction2d coordinates -> Point2d.Point2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"xAxis","comment":" Get the X axis of a given frame (the axis formed from the frame's origin\npoint and X direction).\n","type":"Frame2d.Frame2d units coordinates defines -> Axis2d.Axis2d units coordinates"},{"name":"xDirection","comment":" Get the X direction of a given frame.\n","type":"Frame2d.Frame2d units coordinates defines -> Direction2d.Direction2d coordinates"},{"name":"yAxis","comment":" Get the Y axis of a given frame (the axis formed from the frame's origin\npoint and Y direction).\n","type":"Frame2d.Frame2d units coordinates defines -> Axis2d.Axis2d units coordinates"},{"name":"yDirection","comment":" Get the Y direction of a given frame.\n","type":"Frame2d.Frame2d units coordinates defines -> Direction2d.Direction2d coordinates"}],"binops":[]},{"name":"Frame3d","comment":" A `Frame3d` has an origin point and a set of X, Y and Z directions (which\nare always perpendicular to each other). It can be thought of as:\n\n - A local coordinate system: Most geometric types have associated `relativeTo`\n and `placeIn` functions that convert values of that type from global\n coordinates to local coordinates in a particular frame, and vice versa.\n - A set of axes and planes: It is often convenient to (for example) rotate\n around the Z axis of a frame, or mirror across its XY plane. Frames can\n also themselves be translated, rotated and mirrored!\n - A combined 3D position and orientation: For example, a `Frame3d` could be\n used to define the position and orientation of a spaceship in a 3D game.\n Movement of the ship would then be done by translating and rotating the\n frame.\n\n@docs Frame3d\n\n\n# Constants\n\n@docs atOrigin\n\n\n# Constructors\n\nThe `withXDirection`, `withYDirection` and `withZDirection` functions all\nconstruct a new `Frame3d` with the given axis direction, having the given origin\npoint. The other two directions will be chosen arbitrarily. This can be useful\nwhen constructing 'scratch' frames where (for example) you want a particular Z\ndirection but the specific X/Y directions are unimportant:\n\n zDirection =\n Direction3d.xz (Angle.degrees 60)\n\n frame =\n Frame3d.withZDirection zDirection Point3d.origin\n\n Frame3d.zDirection frame\n --> Direction3d.xz (Angle.degrees 60)\n\n Frame3d.originPoint frame\n --> Point3d.origin\n\n Frame3d.xDirection frame\n --> Direction3d.xz (Angle.degrees -30)\n\n Frame3d.yDirection frame\n --> Direction3d.y\n\nNo guarantees are given about the other two directions other than that the three\ndirections will be mutually perpendicular, and will be oriented so that the\nresulting frame is [right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness).\n\n@docs withXDirection, withYDirection, withZDirection, atPoint, copy, unsafe\n\n\n## From axes\n\n@docs fromXAxis, fromYAxis, fromZAxis\n\n\n# Properties\n\n@docs originPoint, xDirection, yDirection, zDirection, isRightHanded\n\n\n## Axes\n\n@docs xAxis, yAxis, zAxis\n\n\n## Planes\n\nThe following functions all return planes with the same origin point as the\ngiven frame, but with varying normal directions. In each case the normal\ndirection of the resulting plane is given by the cross product of the two\nindicated basis directions (assuming a right-handed frame); for example,\n\n Frame3d.xyPlane Frame3d.atOrigin\n --> Plane3d.through Point3d.origin\n --> Direction3d.positiveZ\n\nsince the cross product of the X and Y basis directions of a frame is equal to\nits Z basis direction. And since reversing the order of arguments in a cross\nproduct reverses the sign of the result,\n\n Frame3d.yxPlane Frame3d.atOrigin\n --> Plane3d.through Point3d.origin\n --> Direction3d.negativeZ\n\n@docs xyPlane, yxPlane, yzPlane, zyPlane, zxPlane, xzPlane\n\n\n## Sketch planes\n\nThese functions all form a `SketchPlane3d` from two axes of the given frame. The\nX and Y axes of the sketch plane will correspond to the two indicated axes. For\nexample,\n\n yzSketchPlane =\n Frame3d.yzSketchPlane Frame3d.atOrigin\n\n SketchPlane3d.originPoint yzSketchPlane\n --> Point3d.origin\n\n SketchPlane3d.xDirection yzSketchPlane\n --> Direction3d.y\n\n SketchPlane3d.yDirection yzSketchPlane\n --> Direction3d.z\n\nNote that this can be confusing - for example, a local X coordinate in the above\nsketch plane corresponds to a global Y coordinate, and a local Y coordinate\ncorresponds to a global Z coordinate!\n\n@docs xySketchPlane, yxSketchPlane, yzSketchPlane, zySketchPlane, zxSketchPlane, xzSketchPlane\n\n\n# Transformations\n\n@docs reverseX, reverseY, reverseZ, moveTo, rotateAround, rotateAroundOwn, translateBy, translateIn, translateAlongOwn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Frame3d","comment":" The type parameters of a `Frame3d` indicate what units and coordinate\nsystems it's defined in, and what coordinate system (if any) it itself defines.\nA concrete `Frame3d` type might look like\n\n type alias Frame =\n Frame3d Meters World { defines : Local }\n\nwhich can be read as \"a `Frame3d` defined in meters in world coordinates, which\nitself defines local coordinates\". For frames that don't define a local\ncoordinate system, you could use\n\n type alias Frame =\n Frame3d Meters World {}\n\nMany functions in this module don't care about the third type argument (whether\nit's a record with a `defines` field like in the first example, an empty record\nlike in the second example, or even something else entirely) but functions like\n`placeIn` and `relativeTo` expect the `{ defines : localCoordinates }` pattern.\n\n","args":["units","coordinates","defines"],"type":"Geometry.Types.Frame3d units coordinates defines"}],"values":[{"name":"at","comment":" Convert a frame from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Frame3d.Frame3d units1 coordinates defines -> Frame3d.Frame3d units2 coordinates defines"},{"name":"atOrigin","comment":" The global XYZ frame, centered at the origin.\n\n Frame3d.originPoint Frame3d.atOrigin\n --> Point3d.origin\n\n Frame3d.xDirection Frame3d.atOrigin\n --> Direction3d.x\n\n Frame3d.yDirection Frame3d.atOrigin\n --> Direction3d.y\n\n Frame3d.zDirection Frame3d.atOrigin\n --> Direction3d.z\n\n","type":"Frame3d.Frame3d units coordinates defines"},{"name":"atPoint","comment":" Construct a frame aligned with the global XYZ frame but with the given\norigin point.\n\n frame =\n Frame3d.atPoint\n (Point3d.meters 2 1 3)\n\n Frame3d.originPoint frame\n --> Point3d.meters 2 1 3\n\n Frame3d.xDirection frame\n --> Direction3d.x\n\n Frame3d.yDirection frame\n --> Direction3d.y\n\n Frame3d.zDirection frame\n --> Direction3d.z\n\n","type":"Point3d.Point3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"at_","comment":" Convert a frame from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Frame3d.Frame3d units1 coordinates defines -> Frame3d.Frame3d units2 coordinates defines"},{"name":"copy","comment":" Create a 'fresh copy' of a frame: one with the same origin point and X/Y/Z\ndirections, but that can be used to define a different local coordinate system.\nSometimes useful in generic/library code. Despite the name, this is efficient:\nit really just returns the value you passed in, but with a different type.\n","type":"Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"fromXAxis","comment":" Construct a `Frame3d` with the given X axis. Perpendicular Y and Z\ndirections will be chosen arbitrarily.\n","type":"Axis3d.Axis3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"fromYAxis","comment":" Construct a `Frame3d` with the given Y axis. Perpendicular X and Z\ndirections will be chosen arbitrarily.\n","type":"Axis3d.Axis3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"fromZAxis","comment":" Construct a `Frame3d` with the given Z axis. Perpendicular X and Y\ndirections will be chosen arbitrarily.\n","type":"Axis3d.Axis3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"isRightHanded","comment":" Check if a frame is [right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness).\n\n Frame3d.isRightHanded Frame3d.atOrigin\n --> True\n\n Frame3d.isRightHanded\n (Frame3d.reverseZ Frame3d.atOrigin)\n --> False\n\nAll predefined frames are right-handed, and most operations on frames preserve\nhandedness, so about the only ways to end up with a left-handed frame are by\nconstructing one explicitly with `unsafe` or by mirroring a right-handed frame.\n\n","type":"Frame3d.Frame3d units coordinates defines -> Basics.Bool"},{"name":"mirrorAcross","comment":" Mirror a frame across a plane.\n\n frame =\n Frame3d.atPoint (Point3d.meters 2 1 3)\n\n mirroredFrame =\n Frame3d.mirrorAcross Plane3d.xy frame\n\n Frame3d.originPoint mirroredFrame\n --> Point3d.meters 2 1 -3\n\n Frame3d.xDirection mirroredFrame\n --> Direction3d.x\n\n Frame3d.yDirection mirroredFrame\n --> Direction3d.y\n\n Frame3d.zDirection mirroredFrame\n --> Direction3d.negativeZ\n\nNote that this will switch the [handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n\n","type":"Plane3d.Plane3d units coordinates -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"moveTo","comment":" Move a frame so that it has the given origin point but unchanged\norientation.\n\n point =\n Point3d.meters 2 1 3\n\n Frame3d.atOrigin |> Frame3d.moveTo point\n --> Frame3d.atPoint point\n\n","type":"Point3d.Point3d units coordinates -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"originPoint","comment":" Get the origin point of a given frame.\n","type":"Frame3d.Frame3d units coordinates defines -> Point3d.Point3d units coordinates"},{"name":"placeIn","comment":" Take one frame defined in global coordinates and a second frame defined\nin local coordinates relative to the first frame, and return the second frame\nexpressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Frame3d.Frame3d units localCoordinates defines -> Frame3d.Frame3d units globalCoordinates defines"},{"name":"relativeTo","comment":" Take two frames defined in global coordinates, and return the second one\nexpressed in local coordinates relative to the first.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Frame3d.Frame3d units globalCoordinates defines -> Frame3d.Frame3d units localCoordinates defines"},{"name":"reverseX","comment":" Reverse the X direction of a frame. Note that this will switch the\n[handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n","type":"Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"reverseY","comment":" Reverse the Y direction of a frame. Note that this will switch the\n[handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n","type":"Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"reverseZ","comment":" Reverse the Z direction of a frame. Note that this will switch the\n[handedness](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\nof the frame.\n","type":"Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"rotateAround","comment":" Rotate a frame around an axis by a given angle. The frame's origin point and\nbasis directions will all be rotated around the given axis.\n\n frame =\n Frame3d.atPoint (Point3d.meters 2 1 3)\n\n rotatedFrame =\n frame\n |> Frame3d.rotateAround Axis3d.z\n (Angle.degrees 90)\n\n Frame3d.originPoint rotatedFrame\n --> Point3d.meters -1 2 3\n\n Frame3d.xDirection rotatedFrame\n --> Direction3d.y\n\n Frame3d.yDirection rotatedFrame\n --> Direction3d.negativeX\n\n Frame3d.zDirection rotatedFrame\n --> Direction3d.z\n\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"rotateAroundOwn","comment":" Rotate a frame around one of its own axes by a given angle.\n\nThe first argument is a function that returns the axis to rotate around, given\nthe current frame. The majority of the time this will be either `Frame3d.xAxis`,\n`Frame3d.yAxis` or `Frame3d.zAxis`. Compare the following to the above example\nfor `rotateAround`:\n\n frame =\n Frame3d.atPoint (Point3d.meters 2 1 3)\n\n rotatedFrame =\n frame\n |> Frame3d.rotateAroundOwn Frame3d.zAxis\n (Angle.degrees 90)\n\n Frame3d.originPoint rotatedFrame\n --> Point3d.meters 2 1 3\n\n Frame3d.xDirection rotatedFrame\n --> Direction3d.y\n\n Frame3d.yDirection rotatedFrame\n --> Direction3d.negativeX\n\n Frame3d.zDirection rotatedFrame\n --> Direction3d.z\n\nSince the rotation is done around the frame's own Z axis (which passes through\nthe frame's origin point), the origin point remains the same after rotation.\n\nIn this example the frame's Z axis has the same orientation as the global Z axis\nso the frame's basis directions are rotated the same way, but in more complex\nexamples involving rotated frames a rotation around (for example) the frame's\nown Z axis may be completely different from a rotation around the global Z axis.\n\n","type":"(Frame3d.Frame3d units coordinates defines1 -> Axis3d.Axis3d units coordinates) -> Angle.Angle -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"translateAlongOwn","comment":" Translate a frame along one of its own axes by a given distance.\n\nThe first argument is a function that returns the axis to translate along, given\nthe current frame. The majority of the time this will be either `Frame3d.xAxis`,\n`Frame3d.yAxis` or `Frame3d.zAxis`.\n\nThis function is convenient when constructing frames via a series of\ntransformations. For example,\n\n point =\n Point3d.meters 2 0 0\n\n frame =\n Frame3d.atPoint point\n |> Frame3d.rotateAroundOwn Frame3d.zAxis\n (Angle.degrees 45)\n |> Frame3d.translateAlongOwn Frame3d.xAxis\n (Length.meters 2)\n\nmeans \"construct a frame at the point (2, 0, 0), rotate it around its own Z axis\ncounterclockwise by 45 degrees, then translate it along its own (rotated) X axis\nby 2 meters\", resulting in\n\n Frame3d.originPoint frame\n --> Point3d.meters 3.4142 1.4142 0\n\n Frame3d.xDirection frame\n --> Direction3d.xy (Angle.degrees 45)\n\n Frame3d.yDirection frame\n --> Direction3d.xy (Angle.degrees 135)\n\n Frame3d.zDirection frame\n --> Direction3d.z\n\n","type":"(Frame3d.Frame3d units coordinates defines1 -> Axis3d.Axis3d units coordinates) -> Quantity.Quantity Basics.Float units -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"translateBy","comment":" Translate a frame by a given displacement.\n\n frame =\n Frame3d.atPoint (Point3d.meters 2 1 3)\n\n displacement =\n Vector3d.meters 1 1 1\n\n Frame3d.translateBy displacement frame\n --> Frame3d.atPoint (Point3d.meters 3 2 4)\n\n","type":"Vector3d.Vector3d units coordinates -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"translateIn","comment":" Translate a frame in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Frame3d.Frame3d units coordinates defines1 -> Frame3d.Frame3d units coordinates defines2"},{"name":"unsafe","comment":" Construct a frame directly from its origin point and X, Y and Z directions:\n\n frame =\n Frame3d.unsafe\n { originPoint = Point3d.meters 2 1 3\n , xDirection =\n Direction3d.unsafe\n { x = 0.8, y = 0.6, z = 0 }\n , yDirection =\n Direction3d.unsafe\n { x = -0.6, y = 0.8, z = 0 }\n , zDirection =\n Direction3d.unsafe\n { x = 0, y = 0, z = 1 }\n }\n\nIn this case **you must be careful to ensure that the X, Y and Z directions are\nperpendicular**. (You will likely also want to make sure that they form a\n[right-handed](https://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness)\ncoordinate system.) To construct sets of mutually perpendicular directions,\n[`Direction3d.orthonormalize`](Direction3d#orthonormalize),\n[`Direction3d.orthogonalize`](Direction3d#orthogonalize), or\n[`Direction3d.perpendicularBasis`](Direction3d#perpendicularBasis) may be\nuseful.\n\n","type":"{ originPoint : Point3d.Point3d units coordinates, xDirection : Direction3d.Direction3d coordinates, yDirection : Direction3d.Direction3d coordinates, zDirection : Direction3d.Direction3d coordinates } -> Frame3d.Frame3d units coordinates defines"},{"name":"withXDirection","comment":" Construct a frame with the given origin point and X direction.\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"withYDirection","comment":" Construct a frame with the given origin point and Y direction.\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"withZDirection","comment":" Construct a frame with the given origin point and Z direction.\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Frame3d.Frame3d units coordinates defines"},{"name":"xAxis","comment":" Get the X axis of a given frame (the axis formed from the frame's origin\npoint and X direction).\n","type":"Frame3d.Frame3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"xDirection","comment":" Get the X direction of a given frame.\n","type":"Frame3d.Frame3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"xyPlane","comment":" Get a plane with normal direction equal to the frame's positive Z direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"xySketchPlane","comment":" Form a sketch plane from the given frame's X and Y axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"},{"name":"xzPlane","comment":" Get a plane with normal direction equal to the frame's negative Y direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"xzSketchPlane","comment":" Form a sketch plane from the given frame's X and Z axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"},{"name":"yAxis","comment":" Get the Y axis of a given frame (the axis formed from the frame's origin\npoint and Y direction).\n","type":"Frame3d.Frame3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"yDirection","comment":" Get the Y direction of a given frame.\n","type":"Frame3d.Frame3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"yxPlane","comment":" Get a plane with normal direction equal to the frame's negative Z direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"yxSketchPlane","comment":" Form a sketch plane from the given frame's Y and X axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"},{"name":"yzPlane","comment":" Get a plane with normal direction equal to the frame's positive X direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"yzSketchPlane","comment":" Form a sketch plane from the given frame's Y and Z axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"},{"name":"zAxis","comment":" Get the Z axis of a given frame (the axis formed from the frame's origin\npoint and Z direction).\n","type":"Frame3d.Frame3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"zDirection","comment":" Get the Z direction of a given frame.\n","type":"Frame3d.Frame3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"zxPlane","comment":" Get a plane with normal direction equal to the frame's positive Y direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"zxSketchPlane","comment":" Form a sketch plane from the given frame's Z and X axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"},{"name":"zyPlane","comment":" Get a plane with normal direction equal to the frame's negative X direction.\n","type":"Frame3d.Frame3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"zySketchPlane","comment":" Form a sketch plane from the given frame's Z and Y axes.\n","type":"Frame3d.Frame3d units coordinates defines3d -> SketchPlane3d.SketchPlane3d units coordinates defines2d"}],"binops":[]},{"name":"LineSegment2d","comment":" A `LineSegment2d` is a line between two points in 2D. This module contains\nfunctionality such as:\n\n - Interpolating within a line segment or measuring its length\n - Scaling, rotating, translating, mirroring or projecting a line segment\n - Converting a line segment between local and global coordinates in different\n reference frames\n\n@docs LineSegment2d\n\n\n# Constructors\n\n@docs fromEndpoints, from, fromPointAndVector, along\n\n\n# Properties\n\n@docs startPoint, endPoint, endpoints, midpoint, length, direction, perpendicularDirection, vector, boundingBox\n\n\n# Interpolation\n\n@docs interpolate\n\n\n# Intersection\n\n@docs intersectionPoint, intersectionWithAxis\n\n\n# Measurement\n\n@docs signedDistanceAlong, signedDistanceFrom\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, mapEndpoints\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"LineSegment2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.LineSegment2d units coordinates"}],"values":[{"name":"along","comment":" Construct a line segment lying on the given axis, with its endpoints at the\ngiven distances from the axis' origin point.\n\n LineSegment2d.along Axis2d.x\n (Length.meters 3)\n (Length.meters 5)\n --> LineSegment2d.fromEndpoints\n --> ( Point2d.meters 3 0\n --> , Point2d.meters 5 0\n --> )\n\n","type":"Axis2d.Axis2d units coordinates -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> LineSegment2d.LineSegment2d units coordinates"},{"name":"at","comment":" Convert a line segment from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> LineSegment2d.LineSegment2d units1 coordinates -> LineSegment2d.LineSegment2d units2 coordinates"},{"name":"at_","comment":" Convert a line segment from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> LineSegment2d.LineSegment2d units1 coordinates -> LineSegment2d.LineSegment2d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given line segment.\n\n LineSegment2d.boundingBox exampleLineSegment\n --> BoundingBox2d.from\n --> (Point2d.meters 1 2)\n --> (Point2d.meters 3 4)\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"direction","comment":" Get the direction from a line segment's start point to its end point. If the\nline segment has zero length (the start and end points are the same), returns\n`Nothing`.\n\n LineSegment2d.direction exampleLineSegment\n --> Just (Direction2d.degrees 45)\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Maybe.Maybe (Direction2d.Direction2d coordinates)"},{"name":"endPoint","comment":" Get the end point of a line segment.\n","type":"LineSegment2d.LineSegment2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"endpoints","comment":" Get the endpoints of a line segment as a tuple.\n\n ( p1, p2 ) =\n LineSegment2d.endpoints lineSegment\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> ( Point2d.Point2d units coordinates, Point2d.Point2d units coordinates )"},{"name":"from","comment":" Construct a line segment from the first point to the second;\n\n LineSegment2d.from firstPoint secondPoint\n\nis equivalent to\n\n LineSegment2d.fromEndpoints ( firstPoint, secondPoint )\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"fromEndpoints","comment":" Construct a line segment from its two endpoints:\n\n exampleLineSegment =\n LineSegment2d.fromEndpoints\n ( Point2d.meters 1 2\n , Point2d.meters 3 4\n )\n\n","type":"( Point2d.Point2d units coordinates, Point2d.Point2d units coordinates ) -> LineSegment2d.LineSegment2d units coordinates"},{"name":"fromPointAndVector","comment":" Construct a line segment given its start point and the vector from its\nstart point to its end point;\n\n LineSegment2d.fromPointAndVector point vector\n\nis equivalent to\n\n LineSegment2d.fromEndpoints\n ( point\n , point |> Point2d.translateBy vector\n )\n\n","type":"Point2d.Point2d units coordinates -> Vector2d.Vector2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"interpolate","comment":" Interpolate a line segment between its start and end points; a value of 0.0\ncorresponds to the start point of the line segment, a value of 0.5 corresponds\nto its midpoint and a value of 1.0 corresponds to its end point. Values less\nthan 0.0 or greater than 1.0 can be used to extrapolate.\n\n LineSegment2d.interpolate exampleLineSegment 0.25\n --> Point2d.meters 1.5 2.5\n\n LineSegment2d.interpolate exampleLineSegment 1.5\n --> Point2d.meters 4 5\n\nIf you just need to interpolate between two points, you don't have to construct\na line segment first - you can use [`Point2d.interpolateFrom`](Point2d#interpolateFrom)\ndirectly.\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"intersectionPoint","comment":" Attempt to find the unique intersection point of two line segments. If there\nis no such point (the two line segments do not touch, or they overlap), returns\n`Nothing`.\n\n -- 4 corners of a square\n\n a =\n Point2d.meters 0 0\n\n b =\n Point2d.meters 1 0\n\n c =\n Point2d.meters 1 1\n\n d =\n Point2d.meters 0 1\n\n -- definition of some segments with those points\n\n ab =\n LineSegment2d.from a b\n ...\n\n -- searching for intersections\n\n LineSegment2d.intersectionPoint ab bc\n --> Just (Point2d.meters 1 0)\n -- corner point b\n\n LineSegment2d.intersectionPoint ac bd\n --> Just (Point2d.meters 0.5 0.5)\n -- diagonal crossing at square center\n\n LineSegment2d.intersectionPoint ab cd\n --> Nothing -- parallel lines\n\n LineSegment2d.intersectionPoint ab ab\n --> Nothing -- collinear lines\n\nNote that if the endpoint of one line segment lies on the other line segment,\nnumerical roundoff means that the intersection may or may not be found. If two\nsegments have a shared endpoint (the two segments meet in something like a 'V',\nwhere the end point of one segment is the start point of the next), that point\nis guaranteed to be returned as the intersection point, but if two segments meet\nin a 'T' shape the intersection point may or may not be found.\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"intersectionWithAxis","comment":" Attempt to find the unique intersection point of a line segment with an\naxis. If there is no such point (the line segment does not touch the axis, or\nlies perfectly along it), returns `Nothing`.\n\n lineSegment =\n LineSegment2d.fromEndpoints\n ( Point2d.meters 1 -1\n , Point2d.meters 4 1\n )\n\n LineSegment2d.intersectionWithAxis Axis2d.x lineSegment\n --> Just (Point2d.meters 2.5 0)\n\n LineSegment2d.intersectionWithAxis Axis2d.y lineSegment\n --> Nothing\n\n","type":"Axis2d.Axis2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"length","comment":" Get the length of a line segment.\n\n LineSegment2d.length exampleLineSegment\n --> Length.meters 2.8284\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mapEndpoints","comment":" Transform the start and end points of a line segment by a given function\nand create a new line segment from the resulting points. Most other\ntransformation functions can be defined in terms of `mapEndpoints`; for example,\n\n LineSegment2d.projectOnto axis\n\nis equivalent to\n\n LineSegment2d.mapEndpoints (Point2d.projectOnto axis)\n\n","type":"(Point2d.Point2d unitsA coordinatesA -> Point2d.Point2d unitsB coordinatesB) -> LineSegment2d.LineSegment2d unitsA coordinatesA -> LineSegment2d.LineSegment2d unitsB coordinatesB"},{"name":"midpoint","comment":" Get the midpoint of a line segment.\n\n LineSegment2d.midpoint exampleLineSegment\n --> Point2d.meters 2 3\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a line segment across an axis. Note that the endpoints of a mirrored\nsegment are equal to the mirrored endpoints of the original segment, but as a\nresult the normal direction of a mirrored segment is the _opposite_ of the\nmirrored normal direction of the original segment (since the normal direction is\nalways considered to be 'to the left' of the line segment).\n","type":"Axis2d.Axis2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"perpendicularDirection","comment":" Get the direction perpendicular to a line segment, pointing to the left. If\nthe line segment has zero length, returns `Nothing`.\n\n LineSegment2d.perpendicularDirection exampleLineSegment\n --> Just (Direction2d.degrees 135)\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Maybe.Maybe (Direction2d.Direction2d coordinates)"},{"name":"placeIn","comment":" Take a line segment considered to be defined in local coordinates relative\nto a given reference frame, and return that line segment expressed in global\ncoordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> LineSegment2d.LineSegment2d units localCoordinates -> LineSegment2d.LineSegment2d units globalCoordinates"},{"name":"projectOnto","comment":" Project a line segment onto an axis.\n","type":"Axis2d.Axis2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"relativeTo","comment":" Take a line segment defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> LineSegment2d.LineSegment2d units globalCoordinates -> LineSegment2d.LineSegment2d units localCoordinates"},{"name":"reverse","comment":" Reverse a line segment, swapping its start and end points.\n","type":"LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"rotateAround","comment":" Rotate a line segment counterclockwise around a given center point by a\ngiven angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"scaleAbout","comment":" Scale a line segment about the given center point by the given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"signedDistanceAlong","comment":" Measure the distance of a line segment along an axis. This is the range of distances\nalong the axis resulting from projecting the line segment perpendicularly onto the axis.\n\nNote that reversing the line segment will _not_ affect the result.\n\n","type":"Axis2d.Axis2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"signedDistanceFrom","comment":" Measure the distance of a line segment from an axis. If the returned interval:\n\n - is entirely positive, then the line segment is to the left of the axis\n - is entirely negative, then the line segment is to the right of the axis\n - contains zero, then the line segment crosses the axis\n\nNote that reversing the line segment will _not_ affect the result.\n\n","type":"Axis2d.Axis2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"startPoint","comment":" Get the start point of a line segment.\n","type":"LineSegment2d.LineSegment2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"translateBy","comment":" Translate a line segment by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"translateIn","comment":" Translate a line segment in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> LineSegment2d.LineSegment2d units coordinates -> LineSegment2d.LineSegment2d units coordinates"},{"name":"vector","comment":" Get the vector from a given line segment's start point to its end point.\n\n LineSegment2d.vector exampleLineSegment\n --> Vector2d.meters 2 2\n\n","type":"LineSegment2d.LineSegment2d units coordinates -> Vector2d.Vector2d units coordinates"}],"binops":[]},{"name":"LineSegment3d","comment":" A `LineSegment3d` is a line between two points in 3D. This module contains\nfunctionality such as:\n\n - Interpolating within a line segment or measuring its length\n - Scaling, rotating, translating, mirroring or projecting a line segment\n - Converting a line segment between local and global coordinates in different\n reference frames\n\n@docs LineSegment3d\n\n\n# Constructors\n\n@docs fromEndpoints, from, fromPointAndVector, along, on\n\n\n# Properties\n\n@docs startPoint, endPoint, endpoints, midpoint, length, direction, perpendicularDirection, vector, boundingBox\n\n\n# Interpolation\n\n@docs interpolate\n\n\n# Intersection\n\n@docs intersectionWithPlane\n\n\n# Measurement\n\n@docs signedDistanceAlong, signedDistanceFrom\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, mapEndpoints\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n","unions":[],"aliases":[{"name":"LineSegment3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.LineSegment3d units coordinates"}],"values":[{"name":"along","comment":" Construct a line segment lying on the given axis, with its endpoints at the\ngiven distances from the axis' origin point.\n\n LineSegment3d.along Axis3d.x\n (Length.meters 3)\n (Length.meters 5)\n --> LineSegment3d.fromEndpoints\n --> ( Point3d.meters 3 0 0\n --> , Point3d.meters 5 0 0\n --> )\n\n","type":"Axis3d.Axis3d units coordinates -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> LineSegment3d.LineSegment3d units coordinates"},{"name":"at","comment":" Convert a line segment from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> LineSegment3d.LineSegment3d units1 coordinates -> LineSegment3d.LineSegment3d units2 coordinates"},{"name":"at_","comment":" Convert a line segment from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> LineSegment3d.LineSegment3d units1 coordinates -> LineSegment3d.LineSegment3d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a line segment.\n\n LineSegment3d.boundingBox exampleLineSegment\n --> BoundingBox3d.from\n --> (Point3d.meters 1 2 3)\n --> (Point3d.meters 4 5 6)\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"direction","comment":" Get the direction from a line segment's start point to its end point. If the\nline segment has zero length (the start and end points are the same), returns\n`Nothing`.\n\n LineSegment3d.direction exampleLineSegment\n --> Just <|\n --> Direction3d.xyZ (Angle.degrees 45)\n --> (Angle.degrees 35.26)\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Maybe.Maybe (Direction3d.Direction3d coordinates)"},{"name":"endPoint","comment":" Get the end point of a line segment.\n","type":"LineSegment3d.LineSegment3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"endpoints","comment":" Get the endpoints of a line segment as a tuple.\n\n ( p1, p2 ) =\n LineSegment3d.endpoints lineSegment\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> ( Point3d.Point3d units coordinates, Point3d.Point3d units coordinates )"},{"name":"from","comment":" Construct a line segment from the first point to the second;\n\n LineSegment3d.from firstPoint secondPoint\n\nis equivalent to\n\n LineSegment3d.fromEndpoints ( firstPoint, secondPoint )\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"fromEndpoints","comment":" Construct a line segment from its two endpoints:\n\n exampleLineSegment =\n LineSegment3d.fromEndpoints\n ( Point3d.meters 1 2 3\n , Point3d.meters 4 5 6\n )\n\n","type":"( Point3d.Point3d units coordinates, Point3d.Point3d units coordinates ) -> LineSegment3d.LineSegment3d units coordinates"},{"name":"fromPointAndVector","comment":" Construct a line segment given its start point and the vector from its\nstart point to its end point;\n\n LineSegment3d.fromPointAndVector point vector\n\nis equivalent to\n\n LineSegment3d.fromEndpoints\n ( point\n , point |> Point3d.translateBy vector\n )\n\n","type":"Point3d.Point3d units coordinates -> Vector3d.Vector3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"interpolate","comment":" Interpolate a line segment between its start and end points; a value of 0.0\ncorresponds to the start point of the line segment, a value of 0.5 corresponds\nto its midpoint and a value of 1.0 corresponds to its end point. Values less\nthan 0.0 or greater than 1.0 can be used to extrapolate.\n\n LineSegment3d.interpolate exampleLineSegment (1 / 3)\n --> Point3d.meters 2 4 5\n\n LineSegment3d.interpolate exampleLineSegment (-1 / 3)\n --> Point3d.meters 0 1 2\n\nIf you just need to interpolate between two points, you don't have to construct\na line segment first - you can use [`Point3d.interpolateFrom`](Point3d#interpolateFrom)\ndirectly.\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"intersectionWithPlane","comment":" Try to find the unique intersection point of a line segment with a plane. If\nthe line segment does not intersect the plane, or if it is coplanar with it\n(lying perfectly in the plane), returns `Nothing`.\n","type":"Plane3d.Plane3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> Maybe.Maybe (Point3d.Point3d units coordinates)"},{"name":"length","comment":" Get the length of a line segment.\n\n LineSegment3d.length exampleLineSegment\n --> Length.meters 5.1962\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mapEndpoints","comment":" Transform the start and end points of a line segment by a given function\nand create a new line segment from the resulting points. Most other\ntransformation functions can be defined in terms of `mapEndpoints`; for example,\n\n LineSegment3d.projectOnto plane\n\nis equivalent to\n\n LineSegment3d.mapEndpoints (Point3d.projectOnto plane)\n\n","type":"(Point3d.Point3d units1 coordinates1 -> Point3d.Point3d units2 coordinates2) -> LineSegment3d.LineSegment3d units1 coordinates1 -> LineSegment3d.LineSegment3d units2 coordinates2"},{"name":"midpoint","comment":" Get the midpoint of a line segment.\n\n LineSegment3d.midpoint exampleLineSegment\n --> Point3d.meters 2.5 3.5 4.5\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a line segment across a plane.\n","type":"Plane3d.Plane3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"on","comment":" Construct a 3D line segment lying _on_ a sketch plane by providing a 2D line\nsegment specified in XY coordinates _within_ the sketch plane.\n\n LineSegment3d.on SketchPlane3d.yz <|\n LineSegment2d.fromEndpoints\n ( Point2d.meters 1 2\n , Point2d.meters 3 4\n )\n --> LineSegment3d.fromEndpoints\n --> ( Point3d.meters 0 1 2\n --> , Point3d.meters 0 3 4\n --> )\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> LineSegment2d.LineSegment2d units coordinates2d -> LineSegment3d.LineSegment3d units coordinates3d"},{"name":"perpendicularDirection","comment":" Get an arbitrary direction perpendicular to a line segment. If the line\nsegment has zero length, returns `Nothing`.\n\n LineSegment3d.perpendicularDirection exampleLineSegment\n --> Just (Direction3d.yz (Angle.degrees 135))\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Maybe.Maybe (Direction3d.Direction3d coordinates)"},{"name":"placeIn","comment":" Take a line segment considered to be defined in local coordinates relative\nto a given reference frame, and return that line segment expressed in global\ncoordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> LineSegment3d.LineSegment3d units localCoordinates -> LineSegment3d.LineSegment3d units globalCoordinates"},{"name":"projectInto","comment":" Project a line segment into a given sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> LineSegment3d.LineSegment3d units coordinates3d -> LineSegment2d.LineSegment2d units coordinates2d"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a line segment onto a plane.\n","type":"Plane3d.Plane3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"relativeTo","comment":" Take a line segment defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> LineSegment3d.LineSegment3d units globalCoordinates -> LineSegment3d.LineSegment3d units localCoordinates"},{"name":"reverse","comment":" Reverse a line segment, swapping its start and end points.\n","type":"LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"rotateAround","comment":" Rotate a line segment around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"scaleAbout","comment":" Scale a line segment about the given center point by the given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"signedDistanceAlong","comment":" Measure the distance of a line segment along an axis. This is the range of distances\nalong the axis resulting from projecting the line segment perpendicularly onto the axis.\n\nNote that reversing the line segment will _not_ affect the result.\n\n","type":"Axis3d.Axis3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"signedDistanceFrom","comment":" Measure the distance of a line segment from a plane. If the returned interval:\n\n - is entirely positive, then the line segment is above the plane\n - is entirely negative, then the line segment is below the plane\n - contains zero, then the line segment crosses the plane\n\nNote that reversing the line segment will _not_ affect the result.\n\n","type":"Plane3d.Plane3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> Quantity.Interval.Interval Basics.Float units"},{"name":"startPoint","comment":" Get the start point of a line segment.\n","type":"LineSegment3d.LineSegment3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"translateBy","comment":" Translate a line segment by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"translateIn","comment":" Translate a line segment in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> LineSegment3d.LineSegment3d units coordinates -> LineSegment3d.LineSegment3d units coordinates"},{"name":"vector","comment":" Get the vector from a line segment's start point to its end point.\n\n LineSegment3d.vector exampleLineSegment\n --> Vector3d.meters 2 2 2\n\n","type":"LineSegment3d.LineSegment3d units coordinates -> Vector3d.Vector3d units coordinates"}],"binops":[]},{"name":"Plane3d","comment":" A `Plane3d` is an infinite flat plane in 3D. It is defined by an origin\npoint and normal direction and is useful for several operations including:\n\n - Mirroring across the plane\n - Projecting onto the plane\n - Measuring distance from the plane\n\n@docs Plane3d\n\n\n# Constants\n\n@docs xy, yz, zx\n\n\n# Constructors\n\n@docs through, withNormalDirection, throughPoints\n\n\n# Properties\n\n@docs originPoint, normalDirection, normalAxis\n\n\n# Transformations\n\n@docs offsetBy, flip, reverseNormal, rotateAround, translateBy, translateIn, moveTo, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Plane3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Plane3d units coordinates"}],"values":[{"name":"at","comment":" Convert a plane from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Plane3d.Plane3d units1 coordinates -> Plane3d.Plane3d units2 coordinates"},{"name":"at_","comment":" Convert a plane from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Plane3d.Plane3d units1 coordinates -> Plane3d.Plane3d units2 coordinates"},{"name":"flip","comment":" Reverse a plane's normal direction while leaving its origin point unchanged.\n","type":"Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror one plane across another. The plane to mirror across is given first\nand the plane to mirror is given second.\n\n plane =\n Plane3d.withNormalDirection Direction3d.z\n (Point3d.meters 1 2 3)\n\n Plane3d.mirrorAcross Plane3d.xy plane\n --> Plane3d.withNormalDirection Direction3d.negativeZ\n --> (Point3d.meters 1 2 -3)\n\n","type":"Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"moveTo","comment":" Move a plane so that it has the given origin point but unchanged normal\ndirection.\n","type":"Point3d.Point3d units coordinates -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"normalAxis","comment":" Construct an axis from the origin point and normal direction of a plane.\n\n Plane3d.normalAxis Plane3d.zx\n --> Axis3d.y\n\n","type":"Plane3d.Plane3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"normalDirection","comment":" Get the normal direction of a plane.\n","type":"Plane3d.Plane3d units coordinates -> Direction3d.Direction3d coordinates"},{"name":"offsetBy","comment":" Shift a plane in its own normal direction by the given (signed) distance.\n\n Plane3d.offsetBy (Length.meters 1) Plane3d.zx\n --> Plane3d.withNormalDirection Direction3d.y\n --> (Point3d.meters 0 1 0)\n\n Plane3d.offsetBy (Length.meters -2) Plane3d.xy\n --> Plane3d.withNormalDirection Direction3d.z\n --> (Point3d.meters 0 0 -2)\n\n","type":"Quantity.Quantity Basics.Float units -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"originPoint","comment":" Get the origin point of a plane.\n","type":"Plane3d.Plane3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"placeIn","comment":" Take a plane defined in local coordinates relative to a given reference\nframe, and return that plane expressed in global coordinates.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Plane3d.Plane3d units localCoordinates -> Plane3d.Plane3d units globalCoordinates"},{"name":"relativeTo","comment":" Take a plane defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Plane3d.Plane3d units globalCoordinates -> Plane3d.Plane3d units localCoordinates"},{"name":"reverseNormal","comment":" Alias for `flip`, for consistency with [`Frame3d.reverseX`](Frame3d#reverseX)\netc.\n","type":"Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"rotateAround","comment":" Rotate a plane around an axis by a given angle.\n\n Plane3d.xy\n |> Plane3d.rotateAround Axis3d.y (Angle.degrees 90)\n --> Plane3d.yz\n\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"through","comment":" Construct a plane through the given point, with the given normal direction.\n\n xyPlane =\n Plane3d.through Point3d.origin Direction3d.z\n\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> Plane3d.Plane3d units coordinates"},{"name":"throughPoints","comment":" Attempt to construct a plane passing through the three given points. The\norigin point of the resulting plane will be equal to the first given point, and\nthe normal direction will be such that the three given points are in\ncounterclockwise order around it according to the right-hand rule. If the three\ngiven points are collinear, returns `Nothing`.\n\n Plane3d.throughPoints\n (Point3d.meters 2 0 0)\n (Point3d.meters 3 0 0)\n (Point3d.meters 4 1 1)\n --> Just <|\n --> Plane3d.through (Point3d.meters 2 0 0)\n --> (Direction3d.yz (Angle.degrees 135))\n\n Plane3d.throughPoints\n (Point3d.meters 2 0 0)\n (Point3d.meters 3 0 0)\n (Point3d.meters 4 0 0)\n --> Nothing\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Plane3d.Plane3d units coordinates)"},{"name":"translateBy","comment":" Translate a plane by a given displacement. Applies the given displacement to\nthe plane's origin point and leaves its normal direction unchanged.\n","type":"Vector3d.Vector3d units coordinates -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"translateIn","comment":" Translate a plane in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Plane3d.Plane3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"withNormalDirection","comment":" Construct a plane with the given normal direction, through the given point.\nFlipped version of `through`.\n\n plane =\n Plane3d.withNormalDirection Direction3d.y\n (Point3d.meters 2 1 3)\n\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> Plane3d.Plane3d units coordinates"},{"name":"xy","comment":" The global XY plane, centered at the origin with a normal in the positive Z\ndirection.\n\n Plane3d.xy\n --> Plane3d.through Point3d.origin Direction3d.z\n\n","type":"Plane3d.Plane3d units coordinates"},{"name":"yz","comment":" The global YZ plane, centered at the origin with a normal in the positive X\ndirection.\n\n Plane3d.yz\n --> Plane3d.through Point3d.origin Direction3d.x\n\n","type":"Plane3d.Plane3d units coordinates"},{"name":"zx","comment":" The global ZX plane, centered at the origin with a normal in the positive Y\ndirection.\n\n Plane3d.zx\n --> Plane3d.through Point3d.origin Direction3d.y\n\n","type":"Plane3d.Plane3d units coordinates"}],"binops":[]},{"name":"Point2d","comment":" A `Point2d` represents a position in 2D space and is defined by its X and Y\ncoordinates. This module contains a variety of point-related functionality, such\nas\n\n - Measuring distance between points\n - Scaling, rotating, translating, mirroring and projecting points\n - Converting points between different coordinate systems\n\nPoints are distinct from vectors but interact with them in well-defined ways;\nyou can translate a point by a vector to result in a new point, or you can\ncompute the vector from one point to another, but you cannot 'add' two points\nlike you can add two vectors.\n\n@docs Point2d\n\n\n# Constants\n\n@docs origin\n\n\n# Literals\n\n@docs unitless\n\nThe remaining functions all construct a `Point2d` from X and Y coordinates given\nin specific units. Functions like `Point2d.xy` are more useful in generic code,\nbut these functions are useful for quickly creating hardcoded constant values,\ne.g.\n\n point =\n Point2d.meters 2 3\n\n@docs meters, pixels, millimeters, centimeters, inches, feet\n\n\n# Constructors\n\n@docs xy, xyIn, rTheta, rThetaIn, midpoint, interpolateFrom, along, circumcenter\n\n\n# Interop\n\nThese functions are useful for interoperability with other Elm code that uses\nplain `Float` tuples or records to represent points.\n\n@docs fromTuple, toTuple, fromRecord, toRecord\n\n\n## Zero-copy conversions\n\nThese functions allow zero-overhead conversion of points to and from records\nwith `x` and `y` `Float` fields, useful for efficient interop with other code\nthat represents points as plain records.\n\n@docs fromMeters, toMeters, fromPixels, toPixels, fromUnitless, toUnitless\n\n\n# Properties\n\n@docs coordinates, xCoordinate, yCoordinate, coordinatesIn, xCoordinateIn, yCoordinateIn\n\n\n# Comparison\n\n@docs equalWithin, lexicographicComparison\n\n\n# Measurement\n\n@docs distanceFrom, signedDistanceAlong, signedDistanceFrom\n\n\n# Transformations\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Centroid calculation\n\n@docs centroid, centroidOf, centroid3, centroidN\n\n\n# Advanced\n\nThese functions are unsafe because they require you to track units manually. In\ngeneral you should prefer other functions instead, but these functions may be\nuseful when writing generic/library code.\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Point2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Point2d units coordinates"}],"values":[{"name":"along","comment":" Construct a point along an axis at a particular distance from the axis'\norigin point.\n\n Point2d.along Axis2d.y (Length.meters 3)\n --> Point2d.meters 0 3\n\nPositive and negative distances will be interpreted relative to the direction of\nthe axis:\n\n horizontalAxis =\n Axis2d.withDirection Direction2d.negativeX\n (Point2d.meters 1 1)\n\n Point2d.along horizontalAxis (Length.meters 3)\n --> Point2d.meters -2 1\n\n Point2d.along horizontalAxis (Length.meters -3)\n --> Point2d.meters 4 1\n\n","type":"Geometry.Types.Axis2d units coordinates -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates"},{"name":"at","comment":" Convert a point from one units type to another, by providing a conversion factor given as a\nrate of change of destination units with respect to source units.\n\n worldPoint =\n Point2d.meters 2 3\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 100 |> Quantity.per (Length.meters 1)\n\n worldPoint |> Point2d.at resolution\n --> Point2d.pixels 200 300\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate destinationUnits sourceUnits) -> Point2d.Point2d sourceUnits coordinates -> Point2d.Point2d destinationUnits coordinates"},{"name":"at_","comment":" Convert a point from one units type to another, by providing an 'inverse' conversion factor\ngiven as a rate of change of source units with respect to destination units.\n\n screenPoint =\n Point2d.pixels 200 300\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 50 |> Quantity.per (Length.meters 1)\n\n screenPoint |> Point2d.at_ resolution\n --> Point2d.meters 4 6\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate sourceUnits destinationUnits) -> Point2d.Point2d sourceUnits coordinates -> Point2d.Point2d destinationUnits coordinates"},{"name":"centimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Length.Meters coordinates"},{"name":"centroid","comment":" Find the centroid (average) of one or more points, by passing the first\npoint and then all remaining points. This allows this function to return a\n`Point2d` instead of a `Maybe Point2d`. You would generally use `centroid`\nwithin a `case` expression:\n\n case points of\n [] ->\n -- some default behavior\n\n first :: rest ->\n let\n centroid =\n Point2d.centroid first rest\n in\n ...\n\nAlternatively, you can use [`centroidN`](#centroidN) instead.\n\n","type":"Point2d.Point2d units coordinates -> List.List (Point2d.Point2d units coordinates) -> Point2d.Point2d units coordinates"},{"name":"centroid3","comment":" Find the centroid of three points;\n\n Point2d.centroid3d p1 p2 p3\n\nis equivalent to\n\n Point2d.centroid p1 [ p2, p3 ]\n\nbut is more efficient.\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"centroidN","comment":" Find the centroid of a list of _N_ points. If the list is empty, returns\n`Nothing`. If you know you have at least one point, you can use\n[`centroid`](#centroid) instead to avoid the `Maybe`.\n","type":"List.List (Point2d.Point2d units coordinates) -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"centroidOf","comment":" Like `centroid`, but lets you work with any kind of data as long as a point\ncan be extracted/constructed from it. For example, to get the centroid of a\nbunch of vertices:\n\n type alias Vertex =\n { position : Point2d Meters World\n , color : Color\n , id : Int\n }\n\n vertexCentroid =\n Point2d.centroidOf .position\n firstVertex\n [ secondVertex\n , thirdVertex\n ]\n\n","type":"(a -> Point2d.Point2d units coordinates) -> a -> List.List a -> Point2d.Point2d units coordinates"},{"name":"circumcenter","comment":" Attempt to find the circumcenter of three points; this is the center of the\ncircle that passes through all three points. If the three given points are\ncollinear, returns `Nothing`.\n\n Point2d.circumcenter\n Point2d.origin\n (Point2d.meters 1 0)\n (Point2d.meters 0 1)\n --> Just (Point2d.meters 0.5 0.5)\n\n -- Ambiguous\n Point2d.circumCenter\n Point2d.origin\n Point2d.origin\n (Point2d.meters 1 0)\n --> Nothing\n\n -- Impossible\n Point2d.circumCenter\n Point2d.origin\n (Point2d.meters 2 0)\n (Point2d.meters 4 0)\n --> Nothing\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"coordinates","comment":" Get the X and Y coordinates of a point as a tuple.\n\n Point2d.coordinates (Point2d.meters 2 3)\n --> ( Length.meters 2, Length.meters 3 )\n\n","type":"Point2d.Point2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"coordinatesIn","comment":" Get the X and Y coordinates of a point relative to a given frame, as a\ntuple; these are the coordinates the point would have as viewed by an observer\nin that frame.\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Point2d.Point2d units globalCoordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"distanceFrom","comment":" Find the distance from the first point to the second.\n\n Point2d.distanceFrom\n (Point2d.meters 2 3)\n (Point2d.meters 5 7)\n --> Length.meters 5\n\nPartial application can be useful:\n\n points =\n [ Point2d.meters 3 4\n , Point2d.meters 10 0\n , Point2d.meters -1 2\n ]\n\n points\n |> Quantity.sortBy\n (Point2d.distanceFrom Point2d.origin)\n --> [ Point2d.meters -1 2\n --> , Point2d.meters 3 4\n --> , Point2d.meters 10 0\n --> ]\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"equalWithin","comment":" Compare two points within a tolerance. Returns true if the distance\nbetween the two given points is less than the given tolerance.\n\n firstPoint =\n Point2d.meters 1 2\n\n secondPoint =\n Point2d.meters 0.9999 2.0002\n\n Point2d.equalWithin (Length.millimeters 1)\n firstPoint\n secondPoint\n --> True\n\n Point2d.equalWithin (Length.microns 1)\n firstPoint\n secondPoint\n --> False\n\n","type":"Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Basics.Bool"},{"name":"feet","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Length.Meters coordinates"},{"name":"fromMeters","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Point2d.Point2d Length.Meters coordinates"},{"name":"fromPixels","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Point2d.Point2d Pixels.Pixels coordinates"},{"name":"fromRecord","comment":" Construct a `Point2d` from a record with `Float` fields, by specifying what units those fields\nare in.\n\n Point2d.fromRecord Length.inches { x = 24, y = 36 }\n --> Point2d.inches 24 36\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> { x : Basics.Float, y : Basics.Float } -> Point2d.Point2d units coordinates"},{"name":"fromTuple","comment":" Construct a `Point2d` from a tuple of `Float` values, by specifying what\nunits those values are in.\n\n Point2d.fromTuple Length.meters ( 2, 3 )\n --> Point2d.meters 2 3\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> ( Basics.Float, Basics.Float ) -> Point2d.Point2d units coordinates"},{"name":"fromUnitless","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Point2d.Point2d Quantity.Unitless coordinates"},{"name":"inches","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Length.Meters coordinates"},{"name":"interpolateFrom","comment":" Construct a point by interpolating from the first given point to the second,\nbased on a parameter that ranges from zero to one.\n\n startPoint =\n Point2d.origin\n\n endPoint =\n Point2d.meters 8 12\n\n Point2d.interpolateFrom startPoint endPoint 0.25\n --> Point2d.meters 2 3\n\nPartial application may be useful:\n\n interpolatedPoint : Float -> Point2d\n interpolatedPoint =\n Point2d.interpolateFrom startPoint endPoint\n\n List.map interpolatedPoint [ 0, 0.5, 1 ]\n --> [ Point2d.meters 0 0\n --> , Point2d.meters 4 6\n --> , Point2d.meters 8 12\n --> ]\n\nYou can pass values less than zero or greater than one to extrapolate:\n\n interpolatedPoint -0.5\n --> Point2d.meters -4 -6\n\n interpolatedPoint 1.25\n --> Point2d.meters 10 15\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"lexicographicComparison","comment":" Compare two `Point2d` values lexicographically: first by X coordinate, then\nby Y. Can be used to provide a sort order for `Point2d` values.\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Basics.Order"},{"name":"meters","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Length.Meters coordinates"},{"name":"midpoint","comment":" Construct a point halfway between two other points.\n\n Point2d.midpoint\n (Point2d.meters 1 1)\n (Point2d.meters 3 7)\n --> Point2d.meters 2 4\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"millimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Length.Meters coordinates"},{"name":"mirrorAcross","comment":" Mirror a point across an axis. The result will be the same distance from the\naxis but on the opposite side.\n\n point =\n Point2d.meters 2 3\n\n Point2d.mirrorAcross Axis2d.x point\n --> Point2d.meters 2 -3\n\n Point2d.mirrorAcross Axis2d.y point\n --> Point2d.meters -2 3\n\n","type":"Geometry.Types.Axis2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"origin","comment":" The point with coordinates (0, 0).\n","type":"Point2d.Point2d units coordinates"},{"name":"pixels","comment":" ","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Pixels.Pixels coordinates"},{"name":"placeIn","comment":" Take a point defined in local coordinates relative to a given reference\nframe, and return that point expressed in global coordinates.\n\n localFrame =\n Frame2d.atPoint (Point2d.meters 1 2)\n\n Point2d.placeIn localFrame (Point2d.meters 3 3)\n --> Point2d.meters 4 5\n\n Point2d.placeIn localFrame (Point2d.meters 0 1)\n --> Point2d.meters 1 1\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Point2d.Point2d units localCoordinates -> Point2d.Point2d units globalCoordinates"},{"name":"projectOnto","comment":" Project a point perpendicularly onto an axis.\n\n point =\n Point2d.meters 2 3\n\n Point2d.projectOnto Axis2d.x point\n --> Point2d.meters 2 0\n\n Point2d.projectOnto Axis2d.y point\n --> Point2d.meters 0 3\n\nThe axis does not have to pass through the origin:\n\n offsetYAxis =\n Axis2d.withDirection Direction2d.y\n (Point2d.meters 1 0)\n\n Point2d.projectOnto offsetYAxis point\n --> Point2d.meters 1 3\n\n","type":"Geometry.Types.Axis2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"rTheta","comment":" Construct a point from a radius and angle. Radius is measured from the\norigin and angle is measured counterclockwise from the positive X direction.\n\n Point2d.rTheta (Length.meters 2) (Angle.degrees 135)\n --> Point2d.meters -1.4142 1.4142\n\n","type":"Quantity.Quantity Basics.Float units -> Angle.Angle -> Point2d.Point2d units coordinates"},{"name":"rThetaIn","comment":" Construct a point given its local polar coordinates within a particular\nframe:\n\n localFrame =\n Frame2d.atPoint (Point2d.meters 2 1)\n\n Point2d.rThetaIn localFrame\n (Length.meters 2)\n (Angle.degrees 45)\n --> Point2d.meters 3.4142 2.4142\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Angle.Angle -> Point2d.Point2d units globalCoordinates"},{"name":"relativeTo","comment":" Take a point defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n\n localFrame =\n Frame2d.atPoint (Point2d.meters 1 2)\n\n Point2d.relativeTo localFrame (Point2d.meters 4 5)\n --> Point2d.meters 3 3\n\n Point2d.relativeTo localFrame (Point2d.meters 1 1)\n --> Point2d.meters 0 -1\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Point2d.Point2d units globalCoordinates -> Point2d.Point2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate around a given center point counterclockwise by a given angle. The\npoint to rotate around is given first and the point to rotate is given last.\n\n centerPoint =\n Point2d.meters 2 0\n\n angle =\n Angle.degrees 45\n\n point =\n Point2d.meters 3 0\n\n Point2d.rotateAround centerPoint angle point\n --> Point2d.meters 2.7071 0.7071\n\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"scaleAbout","comment":" Perform a uniform scaling about the given center point. The center point is\ngiven first and the point to transform is given last. Points will contract or\nexpand about the center point by the given scale. Scaling by a factor of 1 is a\nno-op, and scaling by a factor of 0 collapses all points to the center point.\n\n centerPoint =\n Point2d.meters 1 1\n\n point =\n Point2d.meters 2 3\n\n Point2d.scaleAbout centerPoint 3 point\n --> Point2d.meters 4 7\n\n Point2d.scaleAbout centerPoint 0.5 point\n --> Point2d.meters 1.5 2\n\nAvoid scaling by a negative scaling factor - while this may sometimes do what\nyou want it is confusing and error prone. Try a combination of mirror and/or\nrotation operations instead.\n\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"signedDistanceAlong","comment":" Determine how far along an axis a particular point lies. Conceptually, the\npoint is projected perpendicularly onto the axis, and then the distance of this\nprojected point from the axis' origin point is measured. The result will be\npositive if the projected point is ahead the axis' origin point and negative if\nit is behind, with 'ahead' and 'behind' defined by the direction of the axis.\n\n axis =\n Axis2d.withDirection Direction2d.x\n (Point2d.meters 1 2)\n\n point =\n Point2d.meters 3 3\n\n Point2d.signedDistanceAlong axis point\n --> Length.meters 2\n\n Point2d.signedDistanceAlong axis Point2d.origin\n --> Length.meters -1\n\n","type":"Geometry.Types.Axis2d units coordinates -> Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"signedDistanceFrom","comment":" Find the perpendicular distance of a point from an axis. The result\nwill be positive if the point is to the left of the axis and negative if it is\nto the right, with the forwards direction defined by the direction of the axis.\n\n -- A horizontal axis through a point with a Y\n -- coordinate of 2 is effectively the line Y=2\n axis =\n Axis2d.withDirection Direction2d.x\n (Point2d.meters 1 2)\n\n point =\n Point2d.meters 3 3\n\n -- Since the axis is in the positive X direction,\n -- points above the axis are to the left (positive)\n Point2d.signedDistanceFrom axis point\n --> Length.meters 1\n\n -- and points below are to the right (negative)\n Point2d.signedDistanceFrom axis Point2d.origin\n --> Length.meters -2\n\nThis means that reversing an axis will also flip the sign of the result of this\nfunction:\n\n -- Reversing an axis reverses its direction\n reversedAxis =\n Axis2d.reverse axis\n\n Point2d.signedDistanceFrom reversedAxis point\n --> Length.meters -1\n\n Point2d.signedDistanceFrom reversedAxis Point2d.origin\n --> Length.meters 2\n\n","type":"Geometry.Types.Axis2d units coordinates -> Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"toMeters","comment":" ","type":"Point2d.Point2d Length.Meters coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toPixels","comment":" ","type":"Point2d.Point2d Pixels.Pixels coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toRecord","comment":" Convert a `Point2d` to a record with `Float` fields, by specifying what units you want the\nresult to be in.\n\n point =\n Point2d.meters 2 3\n\n Point2d.toRecord Length.inCentimeters point\n --> { x = 200, y = 300 }\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Point2d.Point2d units coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toTuple","comment":" Convert a `Point2d` to a tuple of `Float` values, by specifying what units you want the result\nto be in.\n\n point =\n Point2d.feet 2 3\n\n Point2d.toTuple Length.inInches point\n --> ( 24, 36 )\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Point2d.Point2d units coordinates -> ( Basics.Float, Basics.Float )"},{"name":"toUnitless","comment":" ","type":"Point2d.Point2d Quantity.Unitless coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"translateBy","comment":" Translate a point by a given displacement.\n\n point =\n Point2d.meters 3 4\n\n displacement =\n Vector2d.meters 1 2\n\n Point2d.translateBy displacement point\n --> Point2d.meters 4 6\n\nIn more mathematical terms, this is 'point plus vector'. For 'point minus point'\n(giving the vector from one point to another), there is [`Vector2d.from`](Vector2d#from).\n\n","type":"Vector2d.Vector2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"translateIn","comment":" Translate a point in a given direction by a given distance.\n\n point =\n Point2d.meters 3 4\n\n point\n |> Point2d.translateIn Direction2d.x\n (Length.meters 2)\n --> Point2d.meters 5 4\n\n point\n |> Point2d.translateIn Direction2d.y\n (Length.meters 2)\n --> Point2d.meters 3 6\n\n angledDirection =\n Direction2d.degrees 45\n\n point\n |> Point2d.translateIn angledDirection\n (Length.meters 1)\n --> Point2d.meters 3.7071 4.7071\n\nThe distance can be negative:\n\n point\n |> Point2d.translateIn Direction2d.x\n (Length.meters -2)\n --> Point2d.meters 1 4\n\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"unitless","comment":" Construct a unitless `Point2d` value from its X and Y coordinates. See also\n[`fromUnitless`](#fromUnitless).\n","type":"Basics.Float -> Basics.Float -> Point2d.Point2d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a point from its raw X and Y coordinates as `Float` values. The\nvalues must be in whatever units the resulting point is considered to use\n(usually meters or pixels). You should generally use something safer such as\n[`meters`](#meters), [`fromPixels`](#fromPixels), [`xy`](#xy),\n[`fromRecord`](#fromRecord) etc.\n","type":"{ x : Basics.Float, y : Basics.Float } -> Point2d.Point2d units coordinates"},{"name":"unwrap","comment":" Extract a point's raw X and Y coordinates as `Float` values. These values\nwill be in whatever units the point has (usually meters or pixels). You should\ngenerally use something safer such as [`toMeters`](#toMeters),\n[`toRecord`](#toRecord), [`xCoordinate`](#xCoordinate) etc.\n","type":"Point2d.Point2d units coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"xCoordinate","comment":" Get the X coordinate of a point.\n\n Point2d.xCoordinate (Point2d.meters 2 3)\n --> Length.meters 2\n\n","type":"Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"xCoordinateIn","comment":" Find the X coordinate of a point relative to a given frame.\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Point2d.Point2d units globalCoordinates -> Quantity.Quantity Basics.Float units"},{"name":"xy","comment":" Construct a point from its X and Y coordinates.\n\n point =\n Point2d.xy (Length.meters 2) (Length.meters 3)\n\n","type":"Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates"},{"name":"xyIn","comment":" Construct a point given its local coordinates within a particular frame:\n\n rotatedFrame =\n Frame2d.atOrigin\n |> Frame2d.rotateBy (Angle.degrees 45)\n\n Point2d.xyIn rotatedFrame\n (Length.meters 2)\n (Length.meters 0)\n --> Point2d.meters 1.4142 1.4142\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units globalCoordinates"},{"name":"yCoordinate","comment":" Get the Y coordinate of a point.\n\n Point2d.yCoordinate (Point2d.meters 2 3)\n --> Length.meters 3\n\n","type":"Point2d.Point2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yCoordinateIn","comment":" Find the Y coordinate of a point relative to a given frame.\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Point2d.Point2d units globalCoordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"Point3d","comment":" A `Point3d` represents a position in 3D space and is defined by its X, Y and\nZ coordinates. This module contains a variety of point-related functionality,\nsuch as\n\n - Measuring distance between points, or the distance of a point from an axis\n or a plane\n - Scaling, rotating, translating, mirroring and projecting points\n - Converting points between different coordinate systems\n\nPoints are distinct from vectors but interact with them in well-defined ways;\nyou can translate a point by a vector to result in a new point, or you can\ncompute the vector from one point to another, but you cannot 'add' two points\nlike you can add two vectors.\n\n@docs Point3d\n\n\n# Constants\n\n@docs origin\n\n\n# Literals\n\n@docs unitless\n\nThe remaining functions all construct a `Point3d` from X, Y and Z coordinates\ngiven in specific units. Functions like `Point3d.xyz` are more useful in generic\ncode, but these functions are useful for quickly creating hardcoded constant\nvalues, e.g.\n\n point =\n Point3d.meters 2 3 1\n\n@docs meters, pixels, millimeters, centimeters, inches, feet\n\n\n# Constructors\n\n@docs xyz, xyzIn, midpoint, interpolateFrom, along, on, xyOn, rThetaOn, circumcenter\n\n\n# Interop\n\nThese functions are useful for interoperability with other Elm code that uses\nplain `Float` tuples or records to represent points.\n\n@docs fromTuple, toTuple, fromRecord, toRecord\n\n\n## Zero-copy conversions\n\nThese functions allow zero-overhead conversion of points to and from records\nwith `x`, `y` and `z` `Float` fields, useful for efficient interop with other\ncode that represents points as plain records.\n\n@docs fromMeters, toMeters, fromPixels, toPixels, fromUnitless, toUnitless\n\n\n# Properties\n\n@docs coordinates, xCoordinate, yCoordinate, zCoordinate, coordinatesIn, xCoordinateIn, yCoordinateIn, zCoordinateIn\n\n\n# Comparison\n\n@docs equalWithin, lexicographicComparison\n\n\n# Measurement\n\n@docs distanceFrom, signedDistanceAlong, distanceFromAxis, signedDistanceFrom\n\n\n# Transformations\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, projectOntoAxis\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n\n# Centroid calculation\n\n@docs centroid, centroidOf, centroid3, centroidN\n\n\n# Advanced\n\nThese functions are unsafe because they require you to track units manually. In\ngeneral you should prefer other functions instead, but these functions may be\nuseful when writing generic/library code.\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Point3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Point3d units coordinates"}],"values":[{"name":"along","comment":" Construct a point along an axis at a particular distance from the axis'\norigin point.\n\n Point3d.along Axis3d.z (Length.meters 2)\n --> Point3d.meters 0 0 2\n\nPositive and negative distances are interpreted relative to the direction of the\naxis:\n\n horizontalAxis =\n Axis3d.withDirection Direction3d.negativeX\n (Point3d.meters 1 1 1)\n\n Point3d.along horizontalAxis (Length.meters 3)\n --> Point3d.meters -2 1 1\n\n Point3d.along horizontalAxis (Length.meters -3)\n --> Point3d.meters 4 1 1\n\n","type":"Geometry.Types.Axis3d units coordinates -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"at","comment":" Convert a point from one units type to another, by providing a conversion factor given as a\nrate of change of destination units with respect to source units.\n\n worldPoint =\n Point3d.meters 2 3 1\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 100 |> Quantity.per (Length.meters 1)\n\n worldPoint |> Point3d.at resolution\n --> Point3d.pixels 200 300 100\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate destinationUnits sourceUnits) -> Point3d.Point3d sourceUnits coordinates -> Point3d.Point3d destinationUnits coordinates"},{"name":"at_","comment":" Convert a point from one units type to another, by providing an 'inverse' conversion factor\ngiven as a rate of change of source units with respect to destination units.\n\n screenPoint =\n Point3d.pixels 200 300 100\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 50 |> Quantity.per (Length.meters 1)\n\n screenPoint |> Point3d.at_ resolution\n --> Point3d.meters 4 6 2\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate sourceUnits destinationUnits) -> Point3d.Point3d sourceUnits coordinates -> Point3d.Point3d destinationUnits coordinates"},{"name":"centimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Length.Meters coordinates"},{"name":"centroid","comment":" Find the centroid (average) of one or more points, by passing the first\npoint and then all remaining points. This allows this function to return a\n`Point3d` instead of a `Maybe Point3d`. You would generally use `centroid`\nwithin a `case` expression:\n\n case points of\n [] ->\n -- some default behavior\n\n first :: rest ->\n let\n centroid =\n Point3d.centroid first rest\n in\n ...\n\nAlternatively, you can use [`centroidN`](#centroidN) instead.\n\n","type":"Point3d.Point3d units coordinates -> List.List (Point3d.Point3d units coordinates) -> Point3d.Point3d units coordinates"},{"name":"centroid3","comment":" Find the centroid of three points;\n\n Point3d.centroid3 p1 p2 p3\n\nis equivalent to\n\n Point3d.centroid p1 [ p2, p3 ]\n\nbut is more efficient.\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"centroidN","comment":" Find the centroid of a list of _N_ points. If the list is empty, returns\n`Nothing`. If you know you have at least one point, you can use\n[`centroid`](#centroid) instead to avoid the `Maybe`.\n","type":"List.List (Point3d.Point3d units coordinates) -> Maybe.Maybe (Point3d.Point3d units coordinates)"},{"name":"centroidOf","comment":" Like `centroid`, but lets you work with any kind of data as long as a point\ncan be extracted/constructed from it. For example, to get the centroid of a\nbunch of vertices:\n\n type alias Vertex =\n { position : Point3d Meters World\n , color : Color\n , id : Int\n }\n\n vertexCentroid =\n Point3d.centroidOf .position\n firstVertex\n [ secondVertex\n , thirdVertex\n ]\n\n","type":"(a -> Point3d.Point3d units coordinates) -> a -> List.List a -> Point3d.Point3d units coordinates"},{"name":"circumcenter","comment":" Attempt to find the circumcenter of three points; this is the center of the\ncircle that passes through all three points. If the three given points are\ncollinear, returns `Nothing`.\n\n Point3d.circumcenter\n (Point3d.meters 1 0 0)\n (Point3d.meters 0 1 0)\n (Point3d.meters 0 0 1)\n --> Just (Point3d.meters 0.33 0.33 0.33)\n\n Point3d.circumcenter\n Point3d.origin\n (Point3d.meters 1 0 0)\n (Point3d.meters 2 0 0)\n --> Nothing\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Point3d.Point3d units coordinates)"},{"name":"coordinates","comment":" Get the X, Y and Z coordinates of a point as a tuple.\n\n Point3d.coordinates (Point3d.meters 2 3 1)\n --> ( Length.meters 2\n --> , Length.meters 3\n --> , Length.meters 1\n --> )\n\n","type":"Point3d.Point3d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"coordinatesIn","comment":" Get the X, Y and Z coordinates of a point relative to a given frame, as a\ntuple; these are the coordinates the point would have as viewed by an observer\nin that frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units globalCoordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"distanceFrom","comment":" Find the distance from the first point to the second.\n\n Point3d.distanceFrom\n (Point3d.meters 1 1 2)\n (Point3d.meters 2 3 4)\n --> Length.meters 3\n\nPartial application can be useful:\n\n points =\n [ Point3d.meters 3 4 5\n , Point3d.meters 10 10 10\n , Point3d.meters -1 2 -3\n ]\n\n points\n |> Quantity.sortBy\n (Point3d.distanceFrom Point3d.origin)\n --> [ Point3d.meters -1 2 -3\n --> , Point3d.meters 3 4 5\n --> , Point3d.meters 10 10 10\n --> ]\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"distanceFromAxis","comment":" Find the perpendicular (nearest) distance of a point from an axis.\n\n point =\n Point3d.meters -3 4 0\n\n Point3d.distanceFromAxis Axis3d.x point\n --> Length.meters 4\n\n Point3d.distanceFromAxis Axis3d.y point\n --> Length.meters 3\n\n Point3d.distanceFromAxis Axis3d.z point\n --> Length.meters 5\n\nNote that unlike in 2D, the result is always positive (unsigned) since there is\nno such thing as the left or right side of an axis in 3D.\n\n","type":"Geometry.Types.Axis3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"equalWithin","comment":" Compare two points within a tolerance. Returns true if the distance\nbetween the two given points is less than the given tolerance.\n\n firstPoint =\n Point3d.meters 2 1 3\n\n secondPoint =\n Point3d.meters 2.0002 0.9999 3.0001\n\n Point3d.equalWithin (Length.millimeters 1)\n firstPoint\n secondPoint\n --> True\n\n Point3d.equalWithin (Length.microns 1)\n firstPoint\n secondPoint\n --> False\n\n","type":"Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Basics.Bool"},{"name":"feet","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Length.Meters coordinates"},{"name":"fromMeters","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Point3d.Point3d Length.Meters coordinates"},{"name":"fromPixels","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Point3d.Point3d Pixels.Pixels coordinates"},{"name":"fromRecord","comment":" Construct a `Point3d` from a record with `Float` fields, by specifying what\nunits those fields are in.\n\n Point3d.fromRecord Length.inches\n { x = 24, y = 36, z = 12 }\n --> Point3d.feet 2 3 1\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> { x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Point3d.Point3d units coordinates"},{"name":"fromTuple","comment":" Construct a `Point3d` from a tuple of `Float` values, by specifying what units those values are\nin.\n\n Point3d.fromTuple Length.meters ( 2, 3, 1 )\n --> Point3d.meters 2 3 1\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> ( Basics.Float, Basics.Float, Basics.Float ) -> Point3d.Point3d units coordinates"},{"name":"fromUnitless","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Point3d.Point3d Quantity.Unitless coordinates"},{"name":"inches","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Length.Meters coordinates"},{"name":"interpolateFrom","comment":" Construct a point by interpolating from the first given point to the second,\nbased on a parameter that ranges from zero to one.\n\n startPoint =\n Point3d.meters 1 2 4\n\n endPoint =\n Point3d.meters 1 2 8\n\n Point3d.interpolateFrom startPoint endPoint 0.25\n --> Point3d.meters 1 2 5\n\nPartial application may be useful:\n\n interpolatedPoint : Float -> Point3d\n interpolatedPoint =\n Point3d.interpolateFrom startPoint endPoint\n\n List.map interpolatedPoint [ 0, 0.5, 1 ]\n --> [ Point3d.meters 1 2 4\n --> , Point3d.meters 1 2 6\n --> , Point3d.meters 1 2 8\n --> ]\n\nYou can pass values less than zero or greater than one to extrapolate:\n\n interpolatedPoint -0.5\n --> Point3d.meters 1 2 2\n\n interpolatedPoint 1.25\n --> Point3d.meters 1 2 9\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"lexicographicComparison","comment":" Compare two `Point3d` values lexicographically: first by X coordinate, then\nby Y, then by Z. Can be used to provide a sort order for `Point3d` values.\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Basics.Order"},{"name":"meters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Length.Meters coordinates"},{"name":"midpoint","comment":" Construct a point halfway between two other points.\n\n Point3d.midpoint\n (Point3d.meters 1 1 1)\n (Point3d.meters 3 7 9)\n --> Point3d.meters 2 4 5\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"millimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Length.Meters coordinates"},{"name":"mirrorAcross","comment":" Mirror a point across a plane. The result will be the same distance from the\nplane but on the opposite side.\n\n point =\n Point3d.meters 1 2 3\n\n -- Plane3d.xy is the plane Z=0\n Point3d.mirrorAcross Plane3d.xy point\n --> Point3d.meters 1 2 -3\n\n -- Plane3d.yz is the plane X=0\n Point3d.mirrorAcross Plane3d.yz point\n --> Point3d.meters -1 2 3\n\nThe plane does not have to pass through the origin:\n\n -- offsetPlane is the plane Z=1\n offsetPlane =\n Plane3d.offsetBy 1 Plane3d.xy\n\n -- The origin point is 1 unit below the offset\n -- plane, so its mirrored copy is one unit above\n Point3d.mirrorAcross offsetPlane Point3d.origin\n --> Point3d.meters 0 0 2\n\n","type":"Geometry.Types.Plane3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"on","comment":" Construct a 3D point lying _on_ a sketch plane by providing a 2D point\nspecified in XY coordinates _within_ the sketch plane.\n\n Point3d.on SketchPlane3d.xy (Point2d.meters 2 1)\n --> Point3d.meters 2 1 0\n\n Point3d.on SketchPlane3d.xz (Point2d.meters 2 1)\n --> Point3d.meters 2 0 1\n\nThe sketch plane can have any position and orientation:\n\n tiltedSketchPlane =\n SketchPlane3d.xy\n |> SketchPlane3d.rotateAround Axis3d.x\n (Angle.degrees 45)\n |> SketchPlane3d.moveTo\n (Point3d.meters 10 10 10)\n\n Point3d.on tiltedSketchPlane (Point2d.meters 2 1)\n --> Point3d.meters 12 10.7071 10.7071\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Point2d.Point2d units coordinates2d -> Point3d.Point3d units coordinates3d"},{"name":"origin","comment":" The point with coordinates (0, 0, 0).\n","type":"Point3d.Point3d units coordinates"},{"name":"pixels","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Pixels.Pixels coordinates"},{"name":"placeIn","comment":" Take a point defined in local coordinates relative to a given reference\nframe, and return that point expressed in global coordinates.\n\n localFrame =\n Frame3d.atPoint (Point3d.meters 1 2 3)\n\n Point3d.placeIn localFrame (Point3d.meters 3 3 3)\n --> Point3d.meters 4 5 6\n\n Point3d.placeIn localFrame (Point3d.meters 0 -1 -2)\n --> Point3d.meters 1 1 1\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units localCoordinates -> Point3d.Point3d units globalCoordinates"},{"name":"projectInto","comment":" Project a point into a given sketch plane. Conceptually, this finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the point onto the plane and then expresses the projected point in 2D sketch\ncoordinates.\n\n point =\n Point3d.meters 2 1 3\n\n Point3d.projectInto SketchPlane3d.xy point\n --> Point2d.meters 2 1\n\n Point3d.projectInto SketchPlane3d.yz point\n --> Point2d.meters 1 3\n\n Point3d.projectInto SketchPlane3d.zx point\n --> Point2d.meters 3 2\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Point3d.Point3d units coordinates3d -> Point2d.Point2d units coordinates2d"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a point onto a plane:\n\n point =\n Point3d.meters 1 2 3\n\n Point3d.projectOnto Plane3d.xy point\n --> Point3d.meters 1 2 0\n\n Point3d.projectOnto Plane3d.yz point\n --> Point3d.meters 0 2 3\n\nThe plane does not have to pass through the origin:\n\n offsetPlane =\n Plane3d.offsetBy 1 Plane3d.xy\n\n Point3d.projectOnto offsetPlane point\n --> Point3d.meters 1 2 1\n\n","type":"Geometry.Types.Plane3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"projectOntoAxis","comment":" Project a point perpendicularly onto an axis.\n\n point =\n Point3d.meters 1 2 3\n\n Point3d.projectOntoAxis Axis3d.x\n --> Point3d.meters 1 0 0\n\n verticalAxis =\n Axis3d.withDirection Direction3d.z\n (Point3d.meters 0 1 2)\n\n Point3d.projectOntoAxis verticalAxis\n --> Point3d.meters 0 1 3\n\n","type":"Geometry.Types.Axis3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"rThetaOn","comment":" Construct a 3D point lying on a sketch plane by providing its 2D polar\ncoordinates within that sketch plane:\n\n Point3d.rThetaOn SketchPlane3d.xy\n (Length.meters 2)\n (Angle.degrees 45)\n --> Point3d.meters 1.4142 1.4142 0\n\n Point3d.rThetaOn SketchPlane3d.yz\n (Length.meters 2)\n (Angle.degrees 30)\n --> Point3d.meters 0 1.732 1\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Quantity.Quantity Basics.Float units -> Angle.Angle -> Point3d.Point3d units coordinates"},{"name":"relativeTo","comment":" Take a point defined in global coordinates, and return it expressed in local\ncoordinates relative to a given reference frame.\n\n localFrame =\n Frame3d.atPoint (Point3d.meters 1 2 3)\n\n Point3d.relativeTo localFrame (Point3d.meters 4 5 6)\n --> Point3d.meters 3 3 3\n\n Point3d.relativeTo localFrame (Point3d.meters 1 1 1)\n --> Point3d.meters 0 -1 -2\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units globalCoordinates -> Point3d.Point3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a point around an axis by a given angle.\n\n axis =\n Axis3d.x\n\n angle =\n Angle.degrees 45\n\n point =\n Point3d.meters 3 1 0\n\n Point3d.rotateAround axis angle point\n --> Point3d.meters 3 0.7071 0.7071\n\nRotation direction is given by the right-hand rule, counterclockwise around the\ndirection of the axis.\n\n","type":"Geometry.Types.Axis3d units coordinates -> Angle.Angle -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"scaleAbout","comment":" Perform a uniform scaling about the given center point. The center point is\ngiven first and the point to transform is given last. Points will contract or\nexpand about the center point by the given scale. Scaling by a factor of 1 is a\nno-op, and scaling by a factor of 0 collapses all points to the center point.\n\n centerPoint =\n Point3d.meters 1 1 1\n\n point =\n Point3d.meters 1 2 3\n\n Point3d.scaleAbout centerPoint 3 point\n --> Point3d.meters 1 4 7\n\n Point3d.scaleAbout centerPoint 0.5 point\n --> Point3d.meters 1 1.5 2\n\nAvoid scaling by a negative scaling factor - while this may sometimes do what\nyou want it is confusing and error prone. Try a combination of mirror and/or\nrotation operations instead.\n\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"signedDistanceAlong","comment":" Determine how far along an axis a particular point lies. Conceptually, the\npoint is projected perpendicularly onto the axis, and then the distance of this\nprojected point from the axis' origin point is measured. The result will be\npositive if the projected point is ahead the axis' origin point and negative if\nit is behind, with 'ahead' and 'behind' defined by the direction of the axis.\n\n axis =\n Axis3d.withDirection Direction3d.x\n (Point3d.meters 1 0 0)\n\n Point3d.signedDistanceAlong axis (Point3d.meters 3 3 3)\n --> Length.meters 2\n\n Point3d.signedDistanceAlong axis Point3d.origin\n --> Length.meters -1\n\n","type":"Geometry.Types.Axis3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"signedDistanceFrom","comment":" Find the perpendicular distance of a point from a plane. The result will be\npositive if the point is 'above' the plane and negative if it is 'below', with\n'up' defined by the normal direction of the plane.\n\n plane =\n Plane3d.withNormalDirection Direction3d.y\n (Point3d.meters 1 2 3)\n\n Point3d.signedDistanceFrom plane (Point3d.meters 3 3 3)\n --> Length.meters 1\n\n Point3d.signedDistanceFrom plane Point3d.origin\n --> Length.meters -2\n\nThis means that flipping a plane (reversing its normal direction) will also flip\nthe sign of the result of this function:\n\n flippedPlane =\n Plane3d.reverseNormal plane\n\n Point3d.signedDistanceFrom flippedPlane point\n --> Length.meters -1\n\n Point3d.signedDistanceFrom flippedPlane Point3d.origin\n --> Length.meters 2\n\n","type":"Geometry.Types.Plane3d units coordinates -> Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"toMeters","comment":" ","type":"Point3d.Point3d Length.Meters coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toPixels","comment":" ","type":"Point3d.Point3d Pixels.Pixels coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toRecord","comment":" Convert a `Point3d` to a record with `Float` fields, by specifying what units you want the\nresult to be in.\n\n point =\n Point3d.meters 2 3 1\n\n Point3d.toRecord Length.inCentimeters point\n --> { x = 200, y = 300, z = 100 }\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Point3d.Point3d units coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toTuple","comment":" Convert a `Point3d` to a tuple of `Float` values, by specifying what units you want the result\nto be in.\n\n point =\n Point3d.feet 2 3 1\n\n Point3d.toTuple Length.inInches point\n --> ( 24, 36, 12 )\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Point3d.Point3d units coordinates -> ( Basics.Float, Basics.Float, Basics.Float )"},{"name":"toUnitless","comment":" ","type":"Point3d.Point3d Quantity.Unitless coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"translateBy","comment":" Translate a point by a given displacement.\n\n point =\n Point3d.meters 3 4 5\n\n displacement =\n Vector3d.meters 1 2 3\n\n Point3d.translateBy displacement point\n --> Point3d.meters 4 6 8\n\nIn more mathematical terms, this is 'point plus vector'. For 'point minus point'\n(giving the vector from one point to another), there is [`Vector3d.from`](Vector3d#from).\n\n","type":"Vector3d.Vector3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"translateIn","comment":" Translate a point in a given direction by a given distance.\n\n point =\n Point3d.meters 3 4 5\n\n point\n |> Point3d.translateIn Direction3d.x\n (Length.meters 2)\n --> Point3d.meters 5 4 5\n\n point\n |> Point3d.translateIn Direction3d.y\n (Length.meters 2)\n --> Point3d.meters 3 6 5\n\nThe distance can be negative:\n\n point\n |> Point3d.translateIn Direction3d.x\n (Length.meters -2)\n --> Point3d.meters 1 4 5\n\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"unitless","comment":" Construct a unitless `Point3d` value from its X, Y and Z coordinates. See\nalso [`fromUnitless`](#fromUnitless).\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Point3d.Point3d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a point from its raw X, Y and Z coordinates as `Float` values. The\nvalues must be in whatever units the resulting point is considered to use\n(usually meters or pixels). You should generally use something safer such as\n[`meters`](#meters), [`fromPixels`](#fromPixels), [`xyz`](#xyz),\n[`fromRecord`](#fromRecord) etc.\n","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Point3d.Point3d units coordinates"},{"name":"unwrap","comment":" Extract a point's raw X, Y and Z coordinates as `Float` values. These values\nwill be in whatever units the point has (usually meters or pixels). You should\ngenerally use something safer such as [`toMeters`](#toMeters),\n[`toRecord`](#toRecord), [`xCoordinate`](#xCoordinate) etc.\n","type":"Point3d.Point3d units coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"xCoordinate","comment":" Get the X coordinate of a point.\n\n Point3d.xCoordinate (Point3d.meters 2 1 3)\n --> Length.meters 2\n\n","type":"Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"xCoordinateIn","comment":" Find the X coordinate of a point relative to a given frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units globalCoordinates -> Quantity.Quantity Basics.Float units"},{"name":"xyOn","comment":" Construct a 3D point lying on a sketch plane by providing its 2D coordinates\nwithin that sketch plane:\n\n Point3d.xyOn SketchPlane3d.xy\n (Length.meters 2)\n (Length.meters 1)\n --> Point3d.meters 2 1 0\n\n Point3d.xyOn SketchPlane3d.xz\n (Length.meters 2)\n (Length.meters 1)\n --> Point3d.meters 2 0 1\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"xyz","comment":" Construct a point from its X, Y and Z coordinates.\n\n point =\n Point3d.xyz\n (Length.meters 2)\n (Length.meters 1)\n (Length.meters 3)\n\n","type":"Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"xyzIn","comment":" Construct a point given its local coordinates within a particular frame:\n\n frame =\n Frame3d.atPoint (Point3d.meters 1 1 1)\n\n Point3d.xyzIn frame\n (Length.meters 1)\n (Length.meters 2)\n (Length.meters 3)\n --> Point3d.meters 2 3 4\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units globalCoordinates"},{"name":"yCoordinate","comment":" Get the Y coordinate of a point.\n\n Point3d.yCoordinate (Point3d.meters 2 1 3)\n --> Length.meters 1\n\n","type":"Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"yCoordinateIn","comment":" Find the Y coordinate of a point relative to a given frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units globalCoordinates -> Quantity.Quantity Basics.Float units"},{"name":"zCoordinate","comment":" Get the Z coordinate of a point.\n\n Point3d.zCoordinate (Point3d.meters 2 1 3)\n --> Length.meters 3\n\n","type":"Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"zCoordinateIn","comment":" Find the Z coordinate of a point relative to a given frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Point3d.Point3d units globalCoordinates -> Quantity.Quantity Basics.Float units"}],"binops":[]},{"name":"Polygon2d","comment":" A `Polygon2d` represents a closed polygon in 2D, optionally with holes. It\nis defined by an outer loop of vertices and a list of inner loops defining any\nholes. This module contains a variety of polygon-related functionality, such as\n\n - Computing the perimeter and area of polygons\n - Scaling, rotating, translating and mirroring polygons\n - Converting polygons between different coordinate systems\n - Triangulating polygons\n\n@docs Polygon2d\n\n\n# Constructors\n\n@docs singleLoop, withHoles, convexHull\n\n\n# Properties\n\n@docs outerLoop, innerLoops, vertices, edges, perimeter, area, centroid, boundingBox\n\n\n# Queries\n\n@docs contains\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Triangulation\n\n@docs triangulate, triangulateWith, TriangulationRule, maxEdgeLength, edgeSubdivisions\n\n","unions":[{"name":"TriangulationRule","comment":" A `TriangulationRule` controls the polygon triangulation process and\ndetermines how large the faces/edges are in the resulting triangular mesh.\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"Polygon2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Polygon2d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a polygon. This value will never be negative.\n\n Polygon2d.area squareWithHole\n --> Area.squareMeters 8\n\n","type":"Polygon2d.Polygon2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a polygon from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Polygon2d.Polygon2d units1 coordinates -> Polygon2d.Polygon2d units2 coordinates"},{"name":"at_","comment":" Convert a polygon from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Polygon2d.Polygon2d units1 coordinates -> Polygon2d.Polygon2d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given polygon. Returns `Nothing`\nif the polygon has no vertices.\n\n Polygon2d.boundingBox rectangle\n --> Just <|\n --> BoundingBox2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 3 2)\n\n","type":"Polygon2d.Polygon2d units coordinates -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"centroid","comment":" Get the centroid of a polygon. Returns `Nothing` if the polygon has no\nvertices or zero area.\n","type":"Polygon2d.Polygon2d units coordinates -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"contains","comment":" Check if a polygon contains a given point.\n\nThis is an O(n) operation. The polygon can have holes and does not need to be convex.\n\n","type":"Point2d.Point2d units coordinates -> Polygon2d.Polygon2d units coordinates -> Basics.Bool"},{"name":"convexHull","comment":" Build the [convex hull](https://en.wikipedia.org/wiki/Convex_hull) of a list\nof points:\n\n![Convex hull of a set of points](https://ianmackenzie.github.io/elm-geometry/1.0.0/Polygon2d/convexHull.svg)\n\nThis is an O(n log n) operation.\n\n","type":"List.List (Point2d.Point2d units coordinates) -> Polygon2d.Polygon2d units coordinates"},{"name":"edgeSubdivisions","comment":" Provide a callback function that takes as input two points and returns the\nminimum number of subdivisions (how many individual edges) should be used along\na line between those two points. For example, `maxEdgeLength` is implemented\nroughly as:\n\n maxEdgeLength length =\n Polygon2d.edgeSubdivisions <|\n \\start end ->\n let\n distance =\n Point2d.distanceFrom start end\n in\n ceiling (Quantity.ratio distance length)\n\nThe actual number of subdivisions used may be higher; as of this writing the\ncurrent implementation will round the returned value up to a power of two.\n\n","type":"(Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Basics.Int) -> Polygon2d.TriangulationRule units coordinates"},{"name":"edges","comment":" Get all edges of a polygon. This will include both outer edges and inner\n(hole) edges.\n","type":"Polygon2d.Polygon2d units coordinates -> List.List (LineSegment2d.LineSegment2d units coordinates)"},{"name":"innerLoops","comment":" Get the holes (if any) of a polygon, each defined by a list of vertices.\nEach list of vertices will be in clockwise order.\n\n Polygon2d.innerLoops squareWithHole\n --> [ [ Point2d.meters 1 1\n --> , Point2d.meters 1 2\n --> , Point2d.meters 2 2\n --> , Point2d.meters 2 1\n --> ]\n --> ]\n\n","type":"Polygon2d.Polygon2d units coordinates -> List.List (List.List (Point2d.Point2d units coordinates))"},{"name":"maxEdgeLength","comment":" Ensure that no edge in a triangulation is longer than the given length.\n","type":"Quantity.Quantity Basics.Float units -> Polygon2d.TriangulationRule units coordinates"},{"name":"mirrorAcross","comment":" Mirror a polygon across the given axis. The order of the polygon's vertices\nwill be reversed so that the resulting polygon still has its outer vertices in\ncounterclockwise order and its inner vertices in clockwise order.\n","type":"Axis2d.Axis2d units coordinates -> Polygon2d.Polygon2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"outerLoop","comment":" Get the list of vertices definining the outer loop (border) of a polygon.\nThe vertices will be in counterclockwise order.\n\n Polygon2d.outerLoop squareWithHole\n --> [ Point2d.meters 0 0\n --> , Point2d.meters 3 0\n --> , Point2d.meters 3 3\n --> , Point2d.meters 0 3\n --> ]\n\n","type":"Polygon2d.Polygon2d units coordinates -> List.List (Point2d.Point2d units coordinates)"},{"name":"perimeter","comment":" Get the perimeter of a polygon (the sum of the lengths of its edges). This\nincludes the outer perimeter and the perimeter of any holes.\n\n Polygon2d.perimeter squareWithHole\n --> Length.meters 16\n\n","type":"Polygon2d.Polygon2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"placeIn","comment":" Take a polygon considered to be defined in local coordinates relative to a\ngiven reference frame, and return that polygon expressed in global coordinates.\nIf the given frame is left-handed, the order of the polygon's vertices will be\nreversed so that the resulting polygon still has its outer vertices in\ncounterclockwise order and its inner vertices in clockwise order.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Polygon2d.Polygon2d units localCoordinates -> Polygon2d.Polygon2d units globalCoordinates"},{"name":"relativeTo","comment":" Take a polygon defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame. If the given frame is\nleft-handed, the order of the polygon's vertices will be reversed so that the\nresulting polygon still has its outer vertices in counterclockwise order and its\ninner vertices in clockwise order.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Polygon2d.Polygon2d units globalCoordinates -> Polygon2d.Polygon2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a polygon around the given center point counterclockwise by the given\nangle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Polygon2d.Polygon2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"scaleAbout","comment":" Scale a polygon about a given center point by a given scale. If the given\nscale is negative, the order of the polygon's vertices will be reversed so that\nthe resulting polygon still has its outer vertices in counterclockwise order and\nits inner vertices in clockwise order.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Polygon2d.Polygon2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"singleLoop","comment":" Construct a polygon without holes from a list of its vertices:\n\n rectangle =\n Polygon2d.singleLoop\n [ Point2d.meters 1 1\n , Point2d.meters 3 1\n , Point2d.meters 3 2\n , Point2d.meters 1 2\n ]\n\nThe last vertex is implicitly considered to be connected back to the first\nvertex (you do not have to close the polygon explicitly). Vertices should\nideally be provided in counterclockwise order; if they are provided in clockwise\norder they will be reversed.\n\n","type":"List.List (Point2d.Point2d units coordinates) -> Polygon2d.Polygon2d units coordinates"},{"name":"translateBy","comment":" Translate a polygon by the given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Polygon2d.Polygon2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"translateIn","comment":" Translate a polygon in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Polygon2d.Polygon2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"triangulate","comment":" Triangulate a polygon. This uses the `TriangularMesh` data types from\n[`ianmackenzie/elm-triangular-mesh`](http://package.elm-lang.org/packages/ianmackenzie/elm-triangular-mesh/latest).\nTriangulation is useful for things like WebGL rendering; you can define a\npolygon just by specifying its outline (and holes, if it has any)\n\n![Polygon with hole](https://ianmackenzie.github.io/elm-geometry/1.0.0/Polygon2d/triangulate1.svg)\n\nthen use this function to turn that polygon into a list of triangles which you\ncan render using WebGL:\n\n![Polygon with hole](https://ianmackenzie.github.io/elm-geometry/1.0.0/Polygon2d/triangulate2.svg)\n\n","type":"Polygon2d.Polygon2d units coordinates -> TriangularMesh.TriangularMesh (Point2d.Point2d units coordinates)"},{"name":"triangulateWith","comment":" Triangulate a polygon with additional control over the size of the triangles\nin the end result. For example, to triangulate a given polygon while making sure\nthat every resulting triangle edge was no more than 10 centimeters long, you\ncould use:\n\n Polygon2d.triangulateWith\n (Polygon2d.maxEdgeLength (Length.centimeters 10))\n polygon\n\nNote that this means that existing polygon edges may be split into smaller ones,\nand new vertices will likely end up being added inside the polygon. Also note\nthat the resulting triangles may still be very thin; no particular attempt is\nmade to avoid large or small angles in triangles.\n\n","type":"Polygon2d.TriangulationRule units coordinates -> Polygon2d.Polygon2d units coordinates -> TriangularMesh.TriangularMesh (Point2d.Point2d units coordinates)"},{"name":"vertices","comment":" Get all vertices of a polygon; this will include vertices from the outer\nloop of the polygon and all inner loops. The order of the returned vertices is\nundefined.\n","type":"Polygon2d.Polygon2d units coordinates -> List.List (Point2d.Point2d units coordinates)"},{"name":"withHoles","comment":" Construct a polygon with holes from one outer loop and a list of inner\nloops. The loops must not touch or intersect each other.\n\n outerLoop =\n [ Point2d.meters 0 0\n , Point2d.meters 3 0\n , Point2d.meters 3 3\n , Point2d.meters 0 3\n ]\n\n innerLoop =\n [ Point2d.meters 1 1\n , Point2d.meters 1 2\n , Point2d.meters 2 2\n , Point2d.meters 2 1\n ]\n\n squareWithHole =\n Polygon2d.withHoles [ innerLoop ] outerLoop\n\nAs with `Polygon2d.singleLoop`, the last vertex of each loop is considered to be\nconnected back to the first. Vertices of the outer loop should ideally be\nprovided in counterclockwise order and vertices of the inner loops should\nideally be provided in clockwise order.\n\n","type":"List.List (List.List (Point2d.Point2d units coordinates)) -> List.List (Point2d.Point2d units coordinates) -> Polygon2d.Polygon2d units coordinates"}],"binops":[]},{"name":"Polyline2d","comment":" A `Polyline2d` represents a sequence of vertices in 2D connected by line\nsegments. This module contains a variety of polyline-related functionality, such\nas\n\n - Computing the length of polylines\n - Scaling, rotating, translating and mirroring polylines\n - Converting polylines between different coordinate systems\n\n@docs Polyline2d\n\n\n# Constructors\n\n@docs fromVertices\n\n\n# Properties\n\n@docs vertices, segments, length, boundingBox, centroid\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, mapVertices\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Polyline2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Polyline2d units coordinates"}],"values":[{"name":"at","comment":" Convert a polyline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Polyline2d.Polyline2d units1 coordinates -> Polyline2d.Polyline2d units2 coordinates"},{"name":"at_","comment":" Convert a polyline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Polyline2d.Polyline2d units1 coordinates -> Polyline2d.Polyline2d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given polyline. Returns `Nothing`\nif the polyline has no vertices.\n\n Polyline2d.boundingBox stepShape\n --> Just <|\n --> BoundingBox2d.from\n --> (Point2d.meters 0 0)\n --> (Point2d.meters 2 1)\n\n","type":"Polyline2d.Polyline2d units coordinates -> Maybe.Maybe (BoundingBox2d.BoundingBox2d units coordinates)"},{"name":"centroid","comment":" Find the centroid (center of mass) of a polyline. This is the\nlength-weighted average of the edges of the polyline, _not_ the centroid of its\nvertices. Returns `Nothing` if the polyline is empty (has no vertices).\n\n Polyline2d.centroid stepShape\n --> Just (Point2d.meters 1.0 0.5)\n\n","type":"Polyline2d.Polyline2d units coordinates -> Maybe.Maybe (Point2d.Point2d units coordinates)"},{"name":"fromVertices","comment":" Construct a polyline from a list of vertices:\n\n stepShape =\n Polyline2d.fromVertices\n [ Point2d.meters 0 0\n , Point2d.meters 1 0\n , Point2d.meters 1 1\n , Point2d.meters 2 1\n ]\n\n","type":"List.List (Point2d.Point2d units coordinates) -> Polyline2d.Polyline2d units coordinates"},{"name":"length","comment":" Get the overall length of a polyline (the sum of the lengths of its\nsegments).\n\n Polyline2d.length stepShape\n --> Length.meters 3\n\n","type":"Polyline2d.Polyline2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mapVertices","comment":" Transform each vertex of a polyline by the given function. All other\ntransformations can be defined in terms of `mapVertices`; for example,\n\n Polyline2d.mirrorAcross axis\n\nis equivalent to\n\n Polyline2d.mapVertices (Point2d.mirrorAcross axis)\n\n","type":"(Point2d.Point2d units1 coordinates1 -> Point2d.Point2d units2 coordinates2) -> Polyline2d.Polyline2d units1 coordinates1 -> Polyline2d.Polyline2d units2 coordinates2"},{"name":"mirrorAcross","comment":" Mirror a polyline across the given axis.\n","type":"Axis2d.Axis2d units coordinates -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"placeIn","comment":" Take a polyline considered to be defined in local coordinates relative\nto a given reference frame, and return that polyline expressed in global\ncoordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Polyline2d.Polyline2d units localCoordinates -> Polyline2d.Polyline2d units globalCoordinates"},{"name":"projectOnto","comment":" Project (flatten) a polyline onto the given axis.\n","type":"Axis2d.Axis2d units coordinates -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"relativeTo","comment":" Take a polyline defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Polyline2d.Polyline2d units globalCoordinates -> Polyline2d.Polyline2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a polyline around the given center point counterclockwise by the\ngiven angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"scaleAbout","comment":" Scale a polyline about a given center point by a given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"segments","comment":" Get the individual segments of a polyline.\n\n Polyline2d.segments stepShape\n --> [ LineSegment2d.from\n --> (Point2d.meters 0 0)\n --> (Point2d.meters 1 0)\n --> , LineSegment2d.from\n --> (Point2d.meters 1 0)\n --> (Point2d.meters 1 1)\n --> , LineSegment2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 2 1)\n --> ]\n\n","type":"Polyline2d.Polyline2d units coordinates -> List.List (LineSegment2d.LineSegment2d units coordinates)"},{"name":"translateBy","comment":" Translate a polyline by the given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"translateIn","comment":" Translate a polyline in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Polyline2d.Polyline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"vertices","comment":" Get the vertices of a polyline.\n","type":"Polyline2d.Polyline2d units coordinates -> List.List (Point2d.Point2d units coordinates)"}],"binops":[]},{"name":"Polyline3d","comment":" A `Polyline3d` represents a sequence of vertices in 3D connected by line\nsegments. This module contains a variety of polyline-related functionality, such\nas\n\n - Computing the length of polylines\n - Scaling, rotating, translating and mirroring polylines\n - Converting polylines between different coordinate systems\n\n@docs Polyline3d\n\n\n# Constructors\n\n@docs fromVertices, on\n\n\n# Properties\n\n@docs vertices, segments, length, boundingBox, centroid\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, mapVertices\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n","unions":[],"aliases":[{"name":"Polyline3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Polyline3d units coordinates"}],"values":[{"name":"at","comment":" Convert a polyline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Polyline3d.Polyline3d units1 coordinates -> Polyline3d.Polyline3d units2 coordinates"},{"name":"at_","comment":" Convert a polyline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Polyline3d.Polyline3d units1 coordinates -> Polyline3d.Polyline3d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given polyline. Returns `Nothing`\nif the polyline has no vertices.\n\n Polyline3d.boundingBox examplePolyline\n --> Just <|\n --> BoundingBox3d.from\n --> (Point3d.meters 0 0 0)\n --> (Point3d.meters 1 2 3)\n\n","type":"Polyline3d.Polyline3d units coordinates -> Maybe.Maybe (BoundingBox3d.BoundingBox3d units coordinates)"},{"name":"centroid","comment":" Find the centroid (center of mass) of a polyline. This is the\nlength-weighted average of the edges of the polyline, _not_ the centroid of its\nvertices. Returns `Nothing` if the polyline is empty (has no vertices).\n\n Polyline3d.centroid examplePolyline\n --> Just (Point3d.meters 0.9167 1.333 0.75)\n\n","type":"Polyline3d.Polyline3d units coordinates -> Maybe.Maybe (Point3d.Point3d units coordinates)"},{"name":"fromVertices","comment":" Construct a polyline from its vertices:\n\n examplePolyline =\n Polyline3d.fromVertices\n [ Point3d.meters 0 0 0\n , Point3d.meters 1 0 0\n , Point3d.meters 1 2 0\n , Point3d.meters 1 2 3\n ]\n\n","type":"List.List (Point3d.Point3d units coordinates) -> Polyline3d.Polyline3d units coordinates"},{"name":"length","comment":" Get the overall length of a polyline (the sum of the lengths of its\nsegments).\n\n Polyline3d.length examplePolyline\n --> Length.meters 6\n\n","type":"Polyline3d.Polyline3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mapVertices","comment":" Transform each vertex of a polyline by the given function. All other\ntransformations can be defined in terms of `mapVertices`; for example,\n\n Polyline3d.mirrorAcross plane\n\nis equivalent to\n\n Polyline3d.mapVertices (Point3d.mirrorAcross plane)\n\n","type":"(Point3d.Point3d units1 coordinates1 -> Point3d.Point3d units2 coordinates2) -> Polyline3d.Polyline3d units1 coordinates1 -> Polyline3d.Polyline3d units2 coordinates2"},{"name":"mirrorAcross","comment":" Mirror a polyline across the given plane.\n","type":"Plane3d.Plane3d units coordinates -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"on","comment":" Construct a 3D polyline lying _on_ a sketch plane by providing a 2D polyline\nspecified in XY coordinates _within_ the sketch plane.\n\n Polyline3d.on SketchPlane3d.yz <|\n Polyline2d.fromVertices\n [ Point2d.meters 0 0\n , Point2d.meters 1 0\n , Point2d.meters 1 1\n , Point2d.meters 2 1\n ]\n --> Polyline3d.fromVertices\n --> [ Point3d.meters 0 0 0\n --> , Point3d.meters 0 1 0\n --> , Point3d.meters 0 1 1\n --> , Point3d.meters 0 2 1\n --> ]\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Polyline2d.Polyline2d units coordinates2d -> Polyline3d.Polyline3d units coordinates3d"},{"name":"placeIn","comment":" Take a polyline considered to be defined in local coordinates relative\nto a given reference frame, and return that polyline expressed in global\ncoordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Polyline3d.Polyline3d units localCoordinates -> Polyline3d.Polyline3d units globalCoordinates"},{"name":"projectInto","comment":" Project a polyline into a given sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Polyline3d.Polyline3d units coordinates3d -> Polyline2d.Polyline2d units coordinates2d"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a polyline onto a plane. This will flatten the polyline.\n","type":"Plane3d.Plane3d units coordinates -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"relativeTo","comment":" Take a polyline defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Polyline3d.Polyline3d units globalCoordinates -> Polyline3d.Polyline3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a polyline around the given axis by the given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"scaleAbout","comment":" Scale a polyline about the given center point by the given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"segments","comment":" Get the individual segments of a polyline.\n\n Polyline3d.segments examplePolyline\n --> [ LineSegment3d.from\n --> (Point3d.meters 0 0 0)\n --> (Point3d.meters 1 0 0)\n --> , LineSegment3d.from\n --> (Point3d.meters 1 0 0)\n --> (Point3d.meters 1 2 0)\n --> , LineSegment3d.from\n --> (Point3d.meters 1 2 0)\n --> (Point3d.meters 1 2 3)\n --> ]\n\n","type":"Polyline3d.Polyline3d units coordinates -> List.List (LineSegment3d.LineSegment3d units coordinates)"},{"name":"translateBy","comment":" Translate a polyline by the given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"translateIn","comment":" Translate a polyline in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Polyline3d.Polyline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"vertices","comment":" Get the vertices of a polyline.\n","type":"Polyline3d.Polyline3d units coordinates -> List.List (Point3d.Point3d units coordinates)"}],"binops":[]},{"name":"QuadraticSpline2d","comment":" A `QuadraticSpline2d` is a quadratic [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve)\nin 2D defined by a start point, control point and end point. This module\ncontains functionality for\n\n - Evaluating points and derivatives along a spline\n - Scaling, rotating, translating or mirroring a spline\n - Converting a spline between local and global coordinates in different\n reference frames\n\n@docs QuadraticSpline2d\n\n\n# Constructors\n\n@docs fromControlPoints\n\n\n# Properties\n\n@docs startPoint, firstControlPoint, secondControlPoint, thirdControlPoint, endPoint, startDerivative, endDerivative, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Subdivision\n\n@docs bisect, splitAt\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, midpoint, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `QuadraticSpline2d`. If you need to do something fancy, you can\nextract these two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, secondDerivative, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" A spline that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"QuadraticSpline2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.QuadraticSpline2d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate a quadratic spline as a polyline, within a given tolerance.\nEvery point on the returned polyline will be within the given tolerance of the\nspline.\n","type":"Quantity.Quantity Basics.Float units -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of a spline, to within the accuracy specified\nwhen calling `arcLengthParameterized`.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given spline, with a given\naccuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> QuadraticSpline2d.Nondegenerate units coordinates -> QuadraticSpline2d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert a spline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> QuadraticSpline2d.QuadraticSpline2d units1 coordinates -> QuadraticSpline2d.QuadraticSpline2d units2 coordinates"},{"name":"at_","comment":" Convert a spline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> QuadraticSpline2d.QuadraticSpline2d units1 coordinates -> QuadraticSpline2d.QuadraticSpline2d units2 coordinates"},{"name":"bisect","comment":" Split a spline into two roughly equal halves. Equivalent to\n`QuadraticSpline2d.splitAt 0.5`.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> ( QuadraticSpline2d.QuadraticSpline2d units coordinates, QuadraticSpline2d.QuadraticSpline2d units coordinates )"},{"name":"boundingBox","comment":" Compute a bounding box for a given spline. It is not guaranteed that the\nresult will be the _smallest_ possible bounding box, since for efficiency the\nbounding box is computed from the spline's control points (which cover a larger\narea than the spline itself).\n\n QuadraticSpline2d.boundingBox exampleSpline\n --> BoundingBox2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 5 4)\n\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"endDerivative","comment":" Get the end derivative of a spline. This is equal to twice the vector from\nthe spline's second control point to its third.\n\n QuadraticSpline2d.endDerivative exampleSpline\n --> Vector2d.meters 4 -6\n\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"endPoint","comment":" Get the end point of a spline. Equal to [`thirdControlPoint`](#thirdControlPoint).\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstControlPoint","comment":" Get the first control point of a spline. Equal to [`startPoint`](#startPoint).\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of a spline at a given parameter value. Note that\nthe derivative interpolates linearly from end to end.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"fromArcLengthParameterized","comment":" Get the original `QuadraticSpline2d` from which an `ArcLengthParameterized`\nvalue was constructed.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"fromControlPoints","comment":" Construct a spline from its start point, inner control point and end point:\n\n exampleSpline =\n QuadraticSpline2d.fromControlPoints\n (Point2d.meters 1 1)\n (Point2d.meters 3 4)\n (Point2d.meters 5 1)\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate spline back to a general `QuadraticSpline2d`.\n","type":"QuadraticSpline2d.Nondegenerate units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"midpoint","comment":" Get the midpoint of a spline. Note that this is the point half way along the\nspline by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a spline across an axis.\n","type":"Axis2d.Axis2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate spline from a general\n`QuadraticSpline2d`. If the spline is in fact degenerate (consists of a single\npoint), returns an `Err` with that point.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Result.Result (Point2d.Point2d units coordinates) (QuadraticSpline2d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate a quadratic\nspline to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> QuadraticSpline2d.QuadraticSpline2d units coordinats -> Basics.Int"},{"name":"placeIn","comment":" Take a spline considered to be defined in local coordinates relative to a\ngiven reference frame, and return that spline expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> QuadraticSpline2d.QuadraticSpline2d units localCoordinates -> QuadraticSpline2d.QuadraticSpline2d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along a spline at a given arc length.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point2d.Point2d units coordinates"},{"name":"pointOn","comment":" Get the point along a spline at a given parameter value.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"relativeTo","comment":" Take a spline defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> QuadraticSpline2d.QuadraticSpline2d units globalCoordinates -> QuadraticSpline2d.QuadraticSpline2d units localCoordinates"},{"name":"reverse","comment":" Reverse a spline so that the start point becomes the end point, and vice\nversa.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"rotateAround","comment":" Rotate a spline counterclockwise around a given center point by a given\nangle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate spline at a\ngiven parameter value.\n","type":"QuadraticSpline2d.Nondegenerate units coordinates -> Basics.Float -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along a spline at a given arc length.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point2d.Point2d units coordinates, Direction2d.Direction2d coordinates )"},{"name":"scaleAbout","comment":" Scale a spline about the given center point by the given scale.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"secondControlPoint","comment":" Get the second control point of a spline.\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"secondDerivative","comment":" Get the second derivative of a spline (for a quadratic spline, this is a\nconstant).\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"segments","comment":" Approximate a quadratic spline by a given number of line segments. Note that\nthe number of points in the polyline will be one more than the number of\nsegments.\n","type":"Basics.Int -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> Polyline2d.Polyline2d units coordinates"},{"name":"splitAt","comment":" Split a spline at a particular parameter value, resulting in two smaller\nsplines.\n","type":"Basics.Float -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> ( QuadraticSpline2d.QuadraticSpline2d units coordinates, QuadraticSpline2d.QuadraticSpline2d units coordinates )"},{"name":"startDerivative","comment":" Get the start derivative of a spline. This is equal to twice the vector from\nthe spline's first control point to its second.\n\n QuadraticSpline2d.startDerivative exampleSpline\n --> Vector2d.meters 4 6\n\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"startPoint","comment":" Get the start point of a spline. Equal to [`firstControlPoint`](#firstControlPoint).\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate spline at a given parameter\nvalue.\n","type":"QuadraticSpline2d.Nondegenerate units coordinates -> Basics.Float -> Direction2d.Direction2d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along a spline at a given arc length.\n","type":"QuadraticSpline2d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction2d.Direction2d coordinates"},{"name":"thirdControlPoint","comment":" Get the third and last control point of a spline. Equal to [`endPoint`](#endPoint).\n","type":"QuadraticSpline2d.QuadraticSpline2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"translateBy","comment":" Translate a spline by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"},{"name":"translateIn","comment":" Translate a spline in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> QuadraticSpline2d.QuadraticSpline2d units coordinates -> QuadraticSpline2d.QuadraticSpline2d units coordinates"}],"binops":[]},{"name":"QuadraticSpline3d","comment":" A `QuadraticSpline3d` is a quadratic [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve)\nin 3D defined by a start point, control point and end point. This module\ncontains functionality for\n\n - Evaluating points and derivatives along a spline\n - Scaling, rotating, translating or mirroring a spline\n - Converting a spline between local and global coordinates in different\n reference frames\n\n@docs QuadraticSpline3d\n\n\n# Constructors\n\n@docs fromControlPoints, on\n\n\n# Properties\n\n@docs startPoint, firstControlPoint, secondControlPoint, thirdControlPoint, endPoint, startDerivative, endDerivative, boundingBox\n\n\n# Evaluation\n\n@docs pointOn\n@docs Nondegenerate, nondegenerate, fromNondegenerate\n@docs tangentDirection, sample\n\n\n# Linear approximation\n\n@docs segments, approximate\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs reverse, scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Sketch planes\n\n@docs projectInto\n\n\n# Subdivision\n\n@docs bisect, splitAt\n\n\n# Arc length parameterization\n\n@docs ArcLengthParameterized, arcLengthParameterized, arcLength\n\nFor the following evaluation functions, the given arc length will be clamped to\nthe arc length of the spline, so the result will always be on the spline.\n\n@docs pointAlong, midpoint, tangentDirectionAlong, sampleAlong\n\n\n## Low level\n\nAn `ArcLengthParameterized` value is a combination of an\n[`ArcLengthParameterization`](Geometry-ArcLengthParameterization) and an\nunderlying `QuadraticSpline3d`. If you need to do something fancy, you can\nextract these two values separately.\n\n@docs arcLengthParameterization, fromArcLengthParameterized\n\n\n# Advanced\n\nYou are unlikely to need to use these functions directly, but they are useful if\nyou are writing low-level geometric algorithms.\n\n@docs firstDerivative, secondDerivative, numApproximationSegments\n\n","unions":[{"name":"ArcLengthParameterized","comment":" A spline that has been parameterized by arc length.\n","args":["units","coordinates"],"cases":[]},{"name":"Nondegenerate","comment":" Represents a nondegenerate spline (one that has finite, non-zero length).\n","args":["units","coordinates"],"cases":[]}],"aliases":[{"name":"QuadraticSpline3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.QuadraticSpline3d units coordinates"}],"values":[{"name":"approximate","comment":" Approximate a quadratic spline as a polyline, within a given tolerance.\nEvery point on the returned polyline will be within the given tolerance of the\nspline.\n","type":"Quantity.Quantity Basics.Float units -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"arcLength","comment":" Find the total arc length of a spline, to within the accuracy specified\nwhen calling [`arcLengthParameterized`](#arcLengthParameterized).\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"arcLengthParameterization","comment":" ","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> ArcLengthParameterization.ArcLengthParameterization units"},{"name":"arcLengthParameterized","comment":" Build an arc length parameterization of the given spline, with a given\naccuracy.\n","type":"{ maxError : Quantity.Quantity Basics.Float units } -> QuadraticSpline3d.Nondegenerate units coordinates -> QuadraticSpline3d.ArcLengthParameterized units coordinates"},{"name":"at","comment":" Convert a spline from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> QuadraticSpline3d.QuadraticSpline3d units1 coordinates -> QuadraticSpline3d.QuadraticSpline3d units2 coordinates"},{"name":"at_","comment":" Convert a spline from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> QuadraticSpline3d.QuadraticSpline3d units1 coordinates -> QuadraticSpline3d.QuadraticSpline3d units2 coordinates"},{"name":"bisect","comment":" Split a spline into two roughly equal halves. Equivalent to\n`QuadraticSpline3d.splitAt 0.5`.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> ( QuadraticSpline3d.QuadraticSpline3d units coordinates, QuadraticSpline3d.QuadraticSpline3d units coordinates )"},{"name":"boundingBox","comment":" Compute a bounding box for a given spline. It is not guaranteed that the\nresult will be the _smallest_ possible bounding box, since for efficiency the\nbounding box is computed from the spline's control points (which cover a larger\nvolume than the spline itself).\n\n QuadraticSpline3d.boundingBox exampleSpline\n --> BoundingBox3d.from\n --> (Point3d.meters 1 1 1)\n --> (Point3d.meters 3 3 3)\n\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"endDerivative","comment":" Get the end derivative of a spline. This is equal to twice the vector from\nthe spline's second control point to its third.\n\n QuadraticSpline3d.endDerivative exampleSpline\n --> Vector3d.meters 0 2 4\n\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"endPoint","comment":" Get the end point of a spline. Equal to [`thirdControlPoint`](#firstControlPoint).\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstControlPoint","comment":" Get the first control point of a spline. Equal to [`startPoint`](#startPoint).\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"firstDerivative","comment":" Get the first derivative of a spline at a given parameter value. Note that\nthe derivative interpolates linearly from end to end.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"fromArcLengthParameterized","comment":" Get the original `QuadraticSpline3d` from which an `ArcLengthParameterized`\nvalue was constructed.\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"fromControlPoints","comment":" Construct a spline from its start point, inner control point and end point:\n\n exampleSpline =\n QuadraticSpline3d.fromControlPoints\n (Point3d.meters 1 1 1)\n (Point3d.meters 3 2 1)\n (Point3d.meters 3 3 3)\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"fromNondegenerate","comment":" Convert a nondegenerate spline back to a general `QuadraticSpline3d`.\n","type":"QuadraticSpline3d.Nondegenerate units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"midpoint","comment":" Get the midpoint of a spline. Note that this is the point half way along the\nspline by arc length, which is not in general the same as evaluating at a\nparameter value of 0.5.\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a spline across a plane.\n","type":"Plane3d.Plane3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"nondegenerate","comment":" Attempt to construct a nondegenerate spline from a general\n`QuadraticSpline3d`. If the spline is in fact degenerate (consists of a single\npoint), returns an `Err` with that point.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Result.Result (Point3d.Point3d units coordinates) (QuadraticSpline3d.Nondegenerate units coordinates)"},{"name":"numApproximationSegments","comment":" Determine the number of linear segments needed to approximate a quadratic\nspline to within a given tolerance.\n","type":"Quantity.Quantity Basics.Float units -> QuadraticSpline3d.QuadraticSpline3d units coordinats -> Basics.Int"},{"name":"on","comment":" Construct a 3D spline lying _on_ a sketch plane by providing a 2D spline\nspecified in XY coordinates _within_ the sketch plane.\n\n QuadraticSpline3d.on SketchPlane3d.xz <|\n QuadraticSpline2d.fromControlPoints\n (Point2d.meters 1 1)\n (Point2d.meters 3 4)\n (Point2d.meters 5 1)\n --> QuadraticSpline3d.fromControlPoints\n --> (Point3d.meters 1 0 1)\n --> (Point3d.meters 3 0 4)\n --> (Point3d.meters 5 0 1)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> QuadraticSpline2d.QuadraticSpline2d units coordinates2d -> QuadraticSpline3d.QuadraticSpline3d units coordinates3d"},{"name":"placeIn","comment":" Take a spline considered to be defined in local coordinates relative to a\ngiven reference frame, and return that spline expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> QuadraticSpline3d.QuadraticSpline3d units localCoordinates -> QuadraticSpline3d.QuadraticSpline3d units globalCoordinates"},{"name":"pointAlong","comment":" Get the point along a spline at a given arc length.\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates"},{"name":"pointOn","comment":" Get the point along a spline at a given parameter value.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"projectInto","comment":" Project a spline into a given sketch plane. Conceptually, finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the spline onto the plane and then expresses the projected spline in 2D\nsketch coordinates.\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> QuadraticSpline3d.QuadraticSpline3d units coordinates3d -> QuadraticSpline2d.QuadraticSpline2d units coordinates2d"},{"name":"projectOnto","comment":" Find the orthographic projection of a spline onto a plane.\n","type":"Plane3d.Plane3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"relativeTo","comment":" Take a spline defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> QuadraticSpline3d.QuadraticSpline3d units globalCoordinates -> QuadraticSpline3d.QuadraticSpline3d units localCoordinates"},{"name":"reverse","comment":" Reverse a spline so that the start point becomes the end point, and vice\nversa.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"rotateAround","comment":" Rotate a spline counterclockwise around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"sample","comment":" Get both the point and tangent direction of a nondegenerate spline at a\ngiven parameter value.\n","type":"QuadraticSpline3d.Nondegenerate units coordinates -> Basics.Float -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"sampleAlong","comment":" Get the point and tangent direction along a spline at a given arc length.\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> ( Point3d.Point3d units coordinates, Direction3d.Direction3d coordinates )"},{"name":"scaleAbout","comment":" Scale a spline about the given center point by the given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"secondControlPoint","comment":" Get the second control point of a spline.\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"secondDerivative","comment":" Get the second derivative of a spline (for a quadratic spline, this is a\nconstant).\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"segments","comment":" Approximate a quadratic spline by a given number of line segments. Note that\nthe number of points in the polyline will be one more than the number of\nsegments.\n","type":"Basics.Int -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> Polyline3d.Polyline3d units coordinates"},{"name":"splitAt","comment":" Split a spline at a particular parameter value, resulting in two smaller\nsplines.\n","type":"Basics.Float -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> ( QuadraticSpline3d.QuadraticSpline3d units coordinates, QuadraticSpline3d.QuadraticSpline3d units coordinates )"},{"name":"startDerivative","comment":" Get the start derivative of a spline. This is equal to twice the vector from\nthe spline's first control point to its second.\n\n QuadraticSpline3d.startDerivative exampleSpline\n --> Vector3d.meters 4 2 0\n\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"startPoint","comment":" Get the start point of a spline. Equal to [`firstControlPoint`](#firstControlPoint).\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"tangentDirection","comment":" Get the tangent direction to a nondegenerate spline at a given parameter\nvalue.\n","type":"QuadraticSpline3d.Nondegenerate units coordinates -> Basics.Float -> Direction3d.Direction3d coordinates"},{"name":"tangentDirectionAlong","comment":" Get the tangent direction along a spline at a given arc length.\n","type":"QuadraticSpline3d.ArcLengthParameterized units coordinates -> Quantity.Quantity Basics.Float units -> Direction3d.Direction3d coordinates"},{"name":"thirdControlPoint","comment":" Get the third and last control point of a spline. Equal to [`endPoint`](#endPoint).\n","type":"QuadraticSpline3d.QuadraticSpline3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"translateBy","comment":" Translate a spline by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"},{"name":"translateIn","comment":" Translate an arc in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> QuadraticSpline3d.QuadraticSpline3d units coordinates -> QuadraticSpline3d.QuadraticSpline3d units coordinates"}],"binops":[]},{"name":"Rectangle2d","comment":" A `Rectangle2d` represents a rectangle in 2D space. This module contains\nrectangle-related functionality such as:\n\n - Constructing rectangles in various ways\n - Extracting rectangle vertices and edges\n - Scaling, rotating, translating and mirroring rectangles\n - Converting rectangles between different coordinate systems\n\nUnlike bounding boxes, rectangles are _not_ constrained to be axis-aligned -\nthey can have arbitrary orientation and so can be rotated, mirrored etc.\n\n@docs Rectangle2d\n\n\n# Construction\n\n@docs with, from, withDimensions, centeredOn, withXAxis, withYAxis, fromBoundingBox\n\n\n# Properties\n\n@docs dimensions, axes, xAxis, yAxis, centerPoint, area, vertices, edges, boundingBox\n\n\n# Interpolation\n\n@docs interpolate\n\n\n# Querying\n\n@docs contains\n\n\n# Conversion\n\n@docs toPolygon\n\n\n# Transformation\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Random point generation\n\n@docs randomPoint\n\n","unions":[],"aliases":[{"name":"Rectangle2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Rectangle2d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a rectangle.\n","type":"Rectangle2d.Rectangle2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a rectangle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Rectangle2d.Rectangle2d units1 coordinates -> Rectangle2d.Rectangle2d units2 coordinates"},{"name":"at_","comment":" Convert a rectangle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Rectangle2d.Rectangle2d units1 coordinates -> Rectangle2d.Rectangle2d units2 coordinates"},{"name":"axes","comment":" Get the central axes of a rectangle as a `Frame2d`:\n\n rectangle =\n Rectangle2d.with\n { x1 = Length.meters 2\n , x2 = Length.meters 5\n , y1 = Length.meters 1\n , y2 = Length.meters 3\n }\n\n Rectangle2d.axes rectangle\n --> Frame2d.atPoint (Point2d.meters 3.5 2)\n\nThe origin point of the frame will be the center point of the rectangle.\n\n","type":"Rectangle2d.Rectangle2d units coordinates -> Frame2d.Frame2d units coordinates defines"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given rectangle. This will have\nexactly the same shape and size as the rectangle itself if the rectangle is\naxis-aligned, but will be larger than the rectangle if the rectangle is at an\nangle.\n\n square =\n Rectangle2d.with\n { x1 = Length.meters 0\n , x2 = Length.meters 1\n , y1 = Length.meters 0\n , y2 = Length.meters 1\n }\n\n diamond =\n square\n |> Rectangle2d.rotateAround Point2d.origin\n (Angle.degrees 45)\n\n Rectangle2d.boundingBox diamond\n --> BoundingBox2d.from\n --> (Point2d.meters -0.7071 0)\n --> (Point2d.meters 0.7071 1.4142)\n\n","type":"Rectangle2d.Rectangle2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a rectangle.\n","type":"Rectangle2d.Rectangle2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"centeredOn","comment":" Construct a frame centered on the given axes, with the given overall\ndimensions;\n\n Rectangle2d.withDimensions dimensions angle centerPoint\n\ncould be written as\n\n Rectangle2d.centeredOn\n (Frame2d.withAngle angle centerPoint)\n dimensions\n\n","type":"Frame2d.Frame2d units coordinates defines -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Rectangle2d.Rectangle2d units coordinates"},{"name":"contains","comment":" Check if a rectangle contains a given point.\n","type":"Point2d.Point2d units coordinates -> Rectangle2d.Rectangle2d units coordinates -> Basics.Bool"},{"name":"dimensions","comment":" Get the overall dimensions (width and height) of a rectangle:\n\n rectangle =\n Rectangle2d.with\n { x1 = Length.meters 2\n , x2 = Length.meters 5\n , y1 = Length.meters 1\n , y2 = Length.meters 3\n }\n\n Rectangle2d.dimensions rectangle\n --> ( Length.meters 3, Length.meters 2 )\n\n","type":"Rectangle2d.Rectangle2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"edges","comment":" Get the edges of a rectangle as a list. The edges will be returned\nin counterclockwise order if the rectangle's axes are right-handed, and\nclockwise order if the axes are left-handed.\n","type":"Rectangle2d.Rectangle2d units coordinates -> List.List (LineSegment2d.LineSegment2d units coordinates)"},{"name":"from","comment":" Construct an axis-aligned rectangle stretching from one point to another;\n\n Rectangle2d.from p1 p2\n\nis equivalent to\n\n Rectangle2d.with\n { x1 = Point2d.xCoordinate p1\n , y1 = Point2d.yCoordinate p1\n , x2 = Point2d.xCoordinate p2\n , y2 = Point2d.yCoordinate p2\n }\n\nand so the same logic about the resulting rectangle's X and Y directions\napplies (see above for details). Therefore, assuming a Y-up coordinate system,\nsomething like\n\n Rectangle2d.from lowerLeftPoint upperRightPoint\n\nwould have positive X and Y directions, while\n\n Rectangle2d.from upperLeftPoint lowerRightPoint\n\nwould have a positive X direction but a negative Y direction.\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"fromBoundingBox","comment":" Convert a `BoundingBox2d` to the equivalent axis-aligned `Rectangle2d`.\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"interpolate","comment":" Interpolate within a rectangle based on coordinates which range from 0 to 1.\nFor example, the four vertices of a given rectangle are\n\n [ Rectangle2d.interpolate rectangle 0 0\n , Rectangle2d.interpolate rectangle 1 0\n , Rectangle2d.interpolate rectangle 1 1\n , Rectangle2d.interpolate rectangle 0 1\n ]\n\nand its center point is\n\n Rectangle2d.interpolate rectangle 0.5 0.5\n\n","type":"Rectangle2d.Rectangle2d units coordinates -> Basics.Float -> Basics.Float -> Point2d.Point2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a rectangle across a given axis. Note that this will flip the\nhandedness of the rectangle's axes, and therefore the order/direction of results\nfrom `Rectangle2d.vertices` and `Rectangle2d.edges` will change.\n","type":"Axis2d.Axis2d units coordinates -> Rectangle2d.Rectangle2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"placeIn","comment":" Take a rectangle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that rectangle expressed in global\ncoordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Rectangle2d.Rectangle2d units localCoordinates -> Rectangle2d.Rectangle2d units globalCoordinates"},{"name":"randomPoint","comment":" Create a [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor points within a given rectangle.\n","type":"Rectangle2d.Rectangle2d units coordinates -> Random.Generator (Point2d.Point2d units coordinates)"},{"name":"relativeTo","comment":" Take a rectangle defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Rectangle2d.Rectangle2d units globalCoordinates -> Rectangle2d.Rectangle2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a rectangle around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Rectangle2d.Rectangle2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"scaleAbout","comment":" Scale a rectangle about a given point by a given scale. Note that scaling by\na negative value will flip the handedness of the rectangle's axes, and therefore\nthe order/direction of results from `Rectangle2d.vertices` and\n`Rectangle2d.edges` will change.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Rectangle2d.Rectangle2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"toPolygon","comment":" Convert a rectangle to a [`Polygon2d`](Polygon2d#Polygon2d).\n","type":"Rectangle2d.Rectangle2d units coordinates -> Polygon2d.Polygon2d units coordinates"},{"name":"translateBy","comment":" Translate a rectangle by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Rectangle2d.Rectangle2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"translateIn","comment":" Translate a rectangle in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Rectangle2d.Rectangle2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"vertices","comment":" Get the vertices of a rectangle as a list. The vertices will be returned\nin counterclockwise order if the rectangle's axes are right-handed, and\nclockwise order if the axes are left-handed.\n","type":"Rectangle2d.Rectangle2d units coordinates -> List.List (Point2d.Point2d units coordinates)"},{"name":"with","comment":" Construct an axis-aligned rectangle given the X and Y coordinates of two\ndiagonally opposite vertices. The X and Y directions of the resulting rectangle\nare determined by the order of the given values:\n\n - If `x1 <= x2`, then the rectangle's X direction will be\n `Direction2d.positiveX`, otherwise it will be `Direction2d.negativeX`\n - If `y1 <= y2`, then the rectangle's Y direction will be\n `Direction2d.positiveY`, otherwise it will be `Direction2d.negativeY`\n\nTherefore, something like\n\n Rectangle2d.with\n { x1 = Pixels.pixels 0\n , y1 = Pixels.pixels 300\n , x2 = Pixels.pixels 500\n , y2 = Pixels.pixels 0\n }\n\nwould have its X direction equal to `Direction2d.positiveX` and its Y direction\nequal to `Direction2d.negativeY`.\n\n","type":"{ x1 : Quantity.Quantity Basics.Float units, y1 : Quantity.Quantity Basics.Float units, x2 : Quantity.Quantity Basics.Float units, y2 : Quantity.Quantity Basics.Float units } -> Rectangle2d.Rectangle2d units coordinates"},{"name":"withDimensions","comment":" Construct a rectangle with the given overall dimensions (width/height) and\nangle, centered on the given point. For an axis-aligned rectangle you can pass\n`Angle.degrees 0` (or equivalently `Angle.radians 0` or even `Quantity.zero`) as\nthe second argument:\n\n rectangle =\n Rectangle2d.withDimensions\n ( Pixels.pixels 200, Pixels.pixels 100 )\n (Angle.degrees 0)\n (Point2d.pixels 400 300)\n\n Rectangle2d.vertices rectangle\n --> [ Point2d.pixels 300 250\n --> , Point2d.pixels 500 250\n --> , Point2d.pixels 500 350\n --> , Point2d.pixels 300 350\n --> ]\n\nPassing a non-zero angle lets you control the orientation of a rectangle; to\nmake a diamond shape you might do something like\n\n diamond =\n Rectangle2d.withDimensions\n ( Length.meters 2, Length.meters 2 )\n (Angle.degrees 45)\n Point2d.origin\n\n Rectangle2d.vertices diamond\n --> [ Point2d.meters 0 -1.4142\n --> , Point2d.meters 1.4142 0\n --> , Point2d.meters 0 1.4142\n --> , Point2d.meters -1.4142 0\n --> ]\n\n","type":"( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Angle.Angle -> Point2d.Point2d units coordinates -> Rectangle2d.Rectangle2d units coordinates"},{"name":"withXAxis","comment":" Construct a rectangle with the given X axis and overall dimensions. The\nrectangle will be centered on the axis' origin point.\n","type":"Axis2d.Axis2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Rectangle2d.Rectangle2d units coordinates"},{"name":"withYAxis","comment":" Construct a rectangle with the given Y axis and overall dimensions. The\nrectangle will be centered on the axis' origin point.\n","type":"Axis2d.Axis2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Rectangle2d.Rectangle2d units coordinates"},{"name":"xAxis","comment":" Get the X axis of a rectangle.\n","type":"Rectangle2d.Rectangle2d units coordinates -> Axis2d.Axis2d units coordinates"},{"name":"yAxis","comment":" Get the Y axis of a rectangle.\n","type":"Rectangle2d.Rectangle2d units coordinates -> Axis2d.Axis2d units coordinates"}],"binops":[]},{"name":"Rectangle3d","comment":" The `Rectangle3d` type is an extension of `Rectangle2d` that exists in 3D.\nIn most cases it will be most convenient to create a `Rectangle3d` by creating\na `Rectangle2d` on a particular `SketchPlane3d`, using [`Rectangle3d.on`](#on).\nThis module then contains functionality for:\n\n - Finding the edges and vertices of rectangles\n - Interpolating points within rectangles\n - Scaling, rotating, translating, mirroring and projecting rectangles\n - Converting rectangles between different coordinate systems\n\n@docs Rectangle3d\n\n\n# Construction\n\n@docs on, centeredOn\n\n\n# Properties\n\n@docs dimensions, axes, xAxis, yAxis, centerPoint, area, vertices, edges, boundingBox\n\n\n# Interpolation\n\n@docs interpolate\n\n\n# Transformation\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n\n# Random point generation\n\n@docs randomPoint\n\n","unions":[],"aliases":[{"name":"Rectangle3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Rectangle3d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a rectangle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Rectangle3d.Rectangle3d units1 coordinates -> Rectangle3d.Rectangle3d units2 coordinates"},{"name":"at_","comment":" Convert a rectangle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Rectangle3d.Rectangle3d units1 coordinates -> Rectangle3d.Rectangle3d units2 coordinates"},{"name":"axes","comment":" Get the central axes of a rectangle as a `SketchPlane3d`. The origin point\nof the sketch plane will be the center point of the rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"centeredOn","comment":" Construct a rectangle centered on the axes of the given sketch plane, with\nthe given overall dimensions.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units ) -> Rectangle3d.Rectangle3d units coordinates"},{"name":"dimensions","comment":" Get the overall dimensions (width and height) of a rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"edges","comment":" Get the edges of a rectangle as a list. The edges will be returned\nin counterclockwise order with respect to the `SketchPlane3d` defining the\nrectangle's axes.\n","type":"Rectangle3d.Rectangle3d units coordinates -> List.List (LineSegment3d.LineSegment3d units coordinates)"},{"name":"interpolate","comment":" Interpolate within a rectangle based on coordinates which range from 0 to 1.\nFor example, the four vertices of a given rectangle are\n\n [ Rectangle3d.interpolate rectangle 0 0\n , Rectangle3d.interpolate rectangle 1 0\n , Rectangle3d.interpolate rectangle 1 1\n , Rectangle3d.interpolate rectangle 0 1\n ]\n\nand its center point is\n\n Rectangle3d.interpolate rectangle 0.5 0.5\n\n","type":"Rectangle3d.Rectangle3d units coordinates -> Basics.Float -> Basics.Float -> Point3d.Point3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a rectangle across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Rectangle3d.Rectangle3d units coordinates -> Rectangle3d.Rectangle3d units coordinates"},{"name":"on","comment":" Construct a 3D rectangle lying _on_ a sketch plane by providing a 2D\nrectangle specified in XY coordinates _within_ the sketch plane. For example,\nto create a 3D rectangle lying on the YZ plane:\n\n rectangle =\n Rectangle3d.on SketchPlane3d.yz <|\n Rectangle2d.from\n (Point2d.meters 1 2)\n (Point2d.meters 3 4)\n\n Rectangle3d.vertices rectangle\n --> [ Point3d.meters 0 1 2\n --> , Point3d.meters 0 3 2\n --> , Point3d.meters 0 3 4\n --> , Point3d.meters 0 1 4\n --> ]\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Rectangle2d.Rectangle2d units coordinates2d -> Rectangle3d.Rectangle3d units coordinates3d"},{"name":"placeIn","comment":" Take a rectangle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that rectangle expressed in global\ncoordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Rectangle3d.Rectangle3d units localCoordinates -> Rectangle3d.Rectangle3d units globalCoordinates"},{"name":"randomPoint","comment":" Create a [random generator](https://package.elm-lang.org/packages/elm/random/latest/Random)\nfor points within a given rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> Random.Generator (Point3d.Point3d units coordinates)"},{"name":"relativeTo","comment":" Take a rectangle defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Rectangle3d.Rectangle3d units globalCoordinates -> Rectangle3d.Rectangle3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a rectangle around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Rectangle3d.Rectangle3d units coordinates -> Rectangle3d.Rectangle3d units coordinates"},{"name":"scaleAbout","comment":" Scale a rectangle about a given point by a given scale. Note that scaling by\na negative value will flip the directions of the rectangle's axes.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Rectangle3d.Rectangle3d units coordinates -> Rectangle3d.Rectangle3d units coordinates"},{"name":"translateBy","comment":" Translate a rectangle by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Rectangle3d.Rectangle3d units coordinates -> Rectangle3d.Rectangle3d units coordinates"},{"name":"translateIn","comment":" Translate a rectangle in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Rectangle3d.Rectangle3d units coordinates -> Rectangle3d.Rectangle3d units coordinates"},{"name":"vertices","comment":" Get the vertices of a rectangle as a list. The vertices will be returned\nin counterclockwise order with respect to the `SketchPlane3d` defining the\nrectangle's axes.\n","type":"Rectangle3d.Rectangle3d units coordinates -> List.List (Point3d.Point3d units coordinates)"},{"name":"xAxis","comment":" Get the X axis of a rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> Axis3d.Axis3d units coordinates"},{"name":"yAxis","comment":" Get the Y axis of a rectangle.\n","type":"Rectangle3d.Rectangle3d units coordinates -> Axis3d.Axis3d units coordinates"}],"binops":[]},{"name":"SketchPlane3d","comment":" A `SketchPlane3d` represents a 2D planar coordinate system in 3D space, and\nis defined by its origin point and X and Y directions (which are always\nperpendicular to each other). Sketch planes are the primary tool for converting\nback and forth between 2D and 3D coordinates:\n\n - 3D geometry such as points, directions and line segments can be projected\n _into_ a sketch plane, which effectively projects the geometry _onto_ the\n sketch plane and then expresses the projected geometry _in_ 2D coordinates.\n - 2D geometry can be place _onto_ a sketch plane to result in 3D geometry. For\n example, a 2D point placed onto a sketch plane will result in a 3D point\n _on_ that sketch plane that has the given 2D coordinate _in_ the sketch\n plane.\n\nThis allows you to create algorithms that project from 3D into 2D, perform some\ncalculations in 2D, then convert the result back to 3D.\n\nMany 3D data types have `projectInto` functions that return the corresponding 2D\ndata type, and `on` functions for converting back to 3D. For example,\n[`Triangle3d.projectInto`](Triangle3d#projectInto) returns a `Triangle2d` and\n[`Triangle3d.on`](Triangle3d#on) returns a `Triangle3d`. These pairs of\nfunctions are almost, but not quite, inverses of each other:\n\n triangle2d\n |> Triangle3d.on sketchPlane\n |> Triangle3d.projectInto sketchPlane\n\nwill just return the original `triangle2d` value (within roundoff error), while\n\n triangle3d\n |> Triangle3d.projectInto sketchPlane\n |> Triangle3d.on sketchPlane\n\nis equivalent to\n\n triangle3d\n |> Triangle3d.projectOnto\n (SketchPlane3d.toPlane sketchPlane)\n\n@docs SketchPlane3d\n\n\n# Constants\n\nThese predefined sketch planes all have the global origin point as their origin\npoint, and use the two indicated global axes as their X and Y axes. For example,\n\n SketchPlane3d.originPoint SketchPlane3d.yz\n --> Point3d.origin\n\n SketchPlane3d.xDirection SketchPlane3d.yz\n --> Direction3d.y\n\n SketchPlane3d.yDirection SketchPlane3d.yz\n --> Direction3d.z\n\n@docs xy, yx, yz, zy, zx, xz\n\n\n# Constructors\n\nSketch planes can also be constructed from `Frame3d` values using\n`Frame3d.xySketchPlane` etc.\n\n@docs through, withNormalDirection, on, throughPoints, fromPlane, copy, unsafe\n\n\n# Conversions\n\n@docs toPlane, toFrame\n\n\n# Properties\n\n@docs originPoint, xDirection, yDirection, normalDirection, xAxis, yAxis, normalAxis\n\n\n# Transformations\n\n@docs offsetBy, reverseX, reverseY, moveTo, rotateAround, rotateAroundOwn, translateBy, translateIn, translateAlongOwn, mirrorAcross\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"SketchPlane3d","comment":" The type parameters of a `SketchPlane3d` indicate what units and coordinate\nsystems it's defined in, and what local 2D coordinate system (if any) it itself\ndefines. A concrete `SketchPlane3d` type might look like\n\n type alias SketchPlane =\n SketchPlane3d Meters World { defines : Sketch }\n\nwhich can be read as \"a `SketchPlane3d` defined in meters in world coordinates,\nwhich itself defines a local 2D sketch coordinate system\". For sketch planes\nthat don't define a local 2D coordinate system, you could use\n\n type alias SketchPlane =\n SketchPlane3d Meters World {}\n\nMany functions in this module don't care about the third type argument (whether\nit's a record with a `defines` field like in the first example, an empty record\nlike in the second example, or even something else entirely) but functions like\n`projectInto` and `on` expect the `{ defines : localCoordinates }` pattern.\n\n","args":["units","coordinates","defines"],"type":"Geometry.Types.SketchPlane3d units coordinates defines"}],"values":[{"name":"at","comment":" Convert a sketch plane from one units type to another, by providing a\nconversion factor given as a rate of change of destination units with respect to\nsource units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> SketchPlane3d.SketchPlane3d units1 coordinates defines -> SketchPlane3d.SketchPlane3d units2 coordinates defines"},{"name":"at_","comment":" Convert a sketch plane from one units type to another, by providing an\n'inverse' conversion factor given as a rate of change of source units with\nrespect to destination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> SketchPlane3d.SketchPlane3d units1 coordinates defines -> SketchPlane3d.SketchPlane3d units2 coordinates defines"},{"name":"copy","comment":" Create a 'fresh copy' of a sketch plane: one with the same origin point and\nX/Y directions, but that can be used to define a different local coordinate\nsystem. Sometimes useful in generic/library code. Despite the name, this is\nefficient: it really just returns the value you passed in, but with a different\ntype.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"fromPlane","comment":" Construct a SketchPlane3d from the given plane;\n\n SketchPlane3d.fromPlane plane\n\nis equivalent to\n\n SketchPlane3d.withNormalDirection\n (Plane3d.normalDirection plane)\n (Plane3d.originPoint plane)\n\nNote that because the X and Y directions of the resulting sketch plane are\nchosen arbitrarily, conversions may not work exactly as you expect. For example,\nin the current implementation,\n\n sketchPlane =\n SketchPlane3d.fromPlane Plane3d.xy\n\nis not equal to `SketchPlane3d.xy` (although the two sketch planes have the same\norigin point and are coplanar):\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.origin\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.negativeY\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.positiveX\n\n","type":"Plane3d.Plane3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"mirrorAcross","comment":" Mirror a sketch plane across a plane.\n\n sketchPlane =\n SketchPlane3d.yz\n |> SketchPlane3d.moveTo (Point3d.meters 2 1 3)\n\n mirroredSketchPlane =\n SketchPlane3d.mirrorAcross Plane3d.xy sketchPlane\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 2 1 -3\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.y\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.negativeZ\n\n","type":"Plane3d.Plane3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"moveTo","comment":" Set the origin point of the given sketch plane to the given point, leaving\nits X and Y directions unchanged.\n","type":"Point3d.Point3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"normalAxis","comment":" Get the normal axis to a sketch plane (the axis formed from the sketch\nplane's origin point and normal direction).\n\n SketchPlane3d.normalAxis SketchPlane3d.xy\n --> Axis3d.z\n\n SketchPlane3d.normalAxis SketchPlane3d.xz\n --> Axis3d.reverse Axis3d.y\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"normalDirection","comment":" Get the normal direction to a sketch plane. This is equal to the cross\nproduct of the sketch plane's X and Y directions.\n\n SketchPlane3d.normalDirection SketchPlane3d.xy\n --> Direction3d.z\n\n SketchPlane3d.normalDirection SketchPlane3d.xz\n --> Direction3d.negativeY\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"offsetBy","comment":" Shift a sketch plane in its own normal direction by the given (signed)\ndistance.\n\n SketchPlane3d.xy\n |> SketchPlane3d.offsetBy (Length.meters -2.0)\n |> SketchPlane3d.originPoint\n --> Point3d.meters 0 0 -2\n\n SketchPlane3d.zx\n |> SketchPlane3d.offsetBy (Length.meters 1.0)\n |> SketchPlane3d.originPoint\n --> Point3d.meters 0 1 0\n\n","type":"Quantity.Quantity Basics.Float units -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"on","comment":" Construct one sketch plane lying on another sketch plane, but with a\ndifferent origin point and X/Y directions. To do this, a `Frame2d` must be\nprovided that specifies the origin point and X/Y directions of the new sketch\nplane, in 2D coordinates within the existing sketch plane. Whew!\n\n frame2d =\n Frame2d.atPoint (Point2d.meters 2 3)\n |> Frame2d.rotateBy (Angle.degrees -30)\n\n sketchPlane =\n SketchPlane3d.on SketchPlane3d.yz frame2d\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 0 2 3\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.yz (Angle.degrees -30)\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.yz (Angle.degrees 60)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Frame2d.Frame2d units coordinates2d defines -> SketchPlane3d.SketchPlane3d units coordinates3d defines"},{"name":"originPoint","comment":" Get the origin point of a sketch plane.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Point3d.Point3d units coordinates"},{"name":"placeIn","comment":" Take a sketch plane defined in local coordinates relative to a given\nreference frame, and return that sketch plane expressed in global coordinates.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> SketchPlane3d.SketchPlane3d units localCoordinates defines -> SketchPlane3d.SketchPlane3d units globalCoordinates defines"},{"name":"relativeTo","comment":" Take a sketch plane defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> SketchPlane3d.SketchPlane3d units globalCoordinates defines -> SketchPlane3d.SketchPlane3d units localCoordinates defines"},{"name":"reverseX","comment":" Reverse the X direction of a sketch plane, leaving its Y direction and\norigin point unchanged.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"reverseY","comment":" Reverse the Y direction of a sketch plane, leaving its X direction and\norigin point unchanged.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"rotateAround","comment":" Rotate a sketch plane around an axis by a given angle. The\nsketch plane's origin point and X and Y directions will all be rotated around\nthe given axis.\n\n SketchPlane3d.xy\n |> SketchPlane3d.rotateAround Axis3d.x\n (Angle.degrees 90)\n --> SketchPlane3d.xz\n\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"rotateAroundOwn","comment":" Rotate a sketch plane around one of its own axes by a given angle.\n\nThe first argument is a function that returns the axis to rotate around, given\nthe current sketch plane. The majority of the time this will be either\n`SketchPlane3d.xAxis` or `SketchPlane3d.yAxis`.\n\nThis function is convenient when constructing sketch planes via a series of\ntransformations. For example,\n\n sketchPlane =\n SketchPlane3d.xy\n |> SketchPlane3d.translateBy\n (Vector3d.meters 1 0 0)\n |> SketchPlane3d.rotateAroundOwn\n SketchPlane3d.yAxis\n (Angle.degrees -45)\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 1 0 0\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.xz (Angle.degrees 45)\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.y\n\nNote that since the rotation was around the sketch plane's own Y axis (which\npasses through the sketch plane's origin point) instead of the global Y axis,\nthe origin point itself was not affected by the rotation.\n\n","type":"(SketchPlane3d.SketchPlane3d units coordinates defines1 -> Axis3d.Axis3d units coordinates) -> Angle.Angle -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"through","comment":" Construct a sketch plane having the given origin point and normal direction.\nPerpendicular X and Y directions will be chosen arbitrarily; this is useful when\nconstructing 'scratch' sketch planes where the specific X/Y directions are\nunimportant.\n\n sketchPlane =\n SketchPlane3d.through Point3d.origin\n (Direction3d.xz (Angle.degrees 60))\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.origin\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.xz (Angle.degrees -30)\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.y\n\n","type":"Point3d.Point3d units coordinates -> Direction3d.Direction3d coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"throughPoints","comment":" Attempt to construct a sketch plane that passes through the three given\npoints. Returns a sketch plane where:\n\n - The origin point is the first given point\n - The X direction is equal to the direction from the first given point to the\n second\n - The Y direction is chosen such that the third given point lies on the sketch\n plane and has a positive Y coordinate within the sketch plane (that is, it\n is on the positive Y side of the sketch plane's X axis)\n\nIf the three given points are collinear, returns `Nothing`.\n\n SketchPlane3d.throughPoints\n (Point3d.meters 2 0 0)\n (Point3d.meters 3 0 0)\n (Point3d.meters 4 1 1)\n --> Just sketchPlane\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 2 0 0\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.x\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.yz (Angle.degrees 45)\n\n SketchPlane3d.throughPoints\n (Point3d.meters 2 0 0)\n (Point3d.meters 3 0 0)\n (Point3d.meters 4 0 0)\n --> Nothing\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (SketchPlane3d.SketchPlane3d units coordinates defines)"},{"name":"toFrame","comment":" Convert a `SketchPlane3d` to a `Frame3d` with the same origin point and X\nand Y directions. The Z direction of the returned frame will be equal to the\nnormal direction of the given sketch plane. This means that the given sketch\nplane will be the XY sketch plane of the returned frame.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines2d -> Geometry.Types.Frame3d units coordinates defines3d"},{"name":"toPlane","comment":" Convert a `SketchPlane3d` to a `Plane3d` with the same origin point and\nnormal direction.\n\n SketchPlane3d.toPlane SketchPlane3d.xy\n --> Plane3d.xy\n\n SketchPlane3d.toPlane SketchPlane3d.yx\n --> Plane3d.reverseNormal Plane3d.xy\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Plane3d.Plane3d units coordinates"},{"name":"translateAlongOwn","comment":" Translate a sketch plane along one of its own axes by a given distance.\n\nThe first argument is a function that returns the axis to translate along, given\nthe current sketch plane. The majority of the time this will be either\n`SketchPlane3d.xAxis` or `SketchPlane3d.yAxis`.\n\nThis function is convenient when constructing frames via a series of\ntransformations. For example,\n\n sketchPlane =\n SketchPlane3d.xy\n |> SketchPlane3d.rotateAround\n Axis3d.x\n (Angle.degrees 45)\n |> SketchPlane3d.translateAlongOwn\n SketchPlane3d.yAxis\n (Length.meters 2)\n\nmeans 'take the global XY sketch plane, rotate it around the global X axis by\n45 degrees, then translate the result 2 meters along its own (rotated) Y axis',\nresulting in\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 0 1.4142 1.4142\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.x\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.yz (Angle.degrees 45)\n\n","type":"(SketchPlane3d.SketchPlane3d units coordinates defines1 -> Axis3d.Axis3d units coordinates) -> Quantity.Quantity Basics.Float units -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"translateBy","comment":" Translate a sketch plane by a given displacement.\n\n displacement =\n Vector3d.meters 2 1 3\n\n sketchPlane =\n SketchPlane3d.xy\n |> SketchPlane3d.translateBy displacement\n\n SketchPlane3d.originPoint sketchPlane\n --> Point3d.meters 2 1 3\n\n SketchPlane3d.xDirection sketchPlane\n --> Direction3d.x\n\n SketchPlane3d.yDirection sketchPlane\n --> Direction3d.y\n\n","type":"Vector3d.Vector3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"translateIn","comment":" Translate a sketch plane in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> SketchPlane3d.SketchPlane3d units coordinates defines1 -> SketchPlane3d.SketchPlane3d units coordinates defines2"},{"name":"unsafe","comment":" Construct a sketch plane directly from its origin point and X and Y\ndirections:\n\n sketchPlane =\n SketchPlane3d.unsafe\n { originPoint = Point3d.meters 2 1 3\n , xDirection = Direction3d.positiveY\n , yDirection = Direction3d.negativeZ\n }\n\nIf you construct a `SketchPlane3d` this way, **you must ensure that the X and Y\nbasis directions are perpendicular to each other**.\n\n","type":"{ originPoint : Point3d.Point3d units coordinates, xDirection : Direction3d.Direction3d coordinates, yDirection : Direction3d.Direction3d coordinates } -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"withNormalDirection","comment":" Construct a sketch plane with the given normal direction, through the given\npoint. Flipped version of `through`.\n","type":"Direction3d.Direction3d coordinates -> Point3d.Point3d units coordinates -> SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"xAxis","comment":" Get the X axis of a sketch plane. A 2D X coordinate within the sketch plane\ncorresponds to a distance along this axis in 3D.\n\n SketchPlane3d.xAxis SketchPlane3d.zx\n --> Axis3d.z\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"xDirection","comment":" Get the X direction of a sketch plane (the direction of the sketch plane's\nX axis).\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"xy","comment":" A sketch plane formed from the global X and Y axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"xz","comment":" A sketch plane formed from the global X and Z axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"yAxis","comment":" Get the Y axis of a sketch plane. A 2D Y coordinate within the sketch plane\ncorresponds to a distance along this axis in 3D.\n\n SketchPlane3d.yAxis SketchPlane3d.zx\n --> Axis3d.x\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Axis3d.Axis3d units coordinates"},{"name":"yDirection","comment":" Get the Y direction of a sketch plane (the direction of the sketch plane's\nY axis).\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines -> Direction3d.Direction3d coordinates"},{"name":"yx","comment":" A sketch plane formed from the global Y and X axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"yz","comment":" A sketch plane formed from the global Y and Z axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"zx","comment":" A sketch plane formed from the global Z and X axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"},{"name":"zy","comment":" A sketch plane formed from the global Z and Y axes.\n","type":"SketchPlane3d.SketchPlane3d units coordinates defines"}],"binops":[]},{"name":"Sphere3d","comment":" A `Sphere3d` is defined by its center point and radius. This module contains\nfunctionality for:\n\n - Constructing spheres through points\n - Scaling, rotating and translating spheres\n - Extracting sphere properties like center point and volume\n\n@docs Sphere3d\n\n\n# Constructors\n\n@docs atPoint, withRadius, atOrigin, throughPoints\n\n\n# Properties\n\n@docs centerPoint, radius, diameter, volume, surfaceArea, circumference, boundingBox\n\n\n# Queries\n\n@docs contains\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, projectInto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Sphere3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Sphere3d units coordinates"}],"values":[{"name":"at","comment":" Convert a sphere from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Sphere3d.Sphere3d units1 coordinates -> Sphere3d.Sphere3d units2 coordinates"},{"name":"atOrigin","comment":" Construct a sphere at the origin with the given radius.\n","type":"Quantity.Quantity Basics.Float units -> Sphere3d.Sphere3d units coordinates"},{"name":"atPoint","comment":" Construct a sphere from its center point and radius:\n\n exampleSphere =\n Sphere3d.atPoint (Point3d.meters 1 2 1)\n (Length.meters 3)\n\nIf you pass a negative radius, the absolute value will be used.\n\n","type":"Point3d.Point3d units coordinates -> Quantity.Quantity Basics.Float units -> Sphere3d.Sphere3d units coordinates"},{"name":"at_","comment":" Convert a sphere from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Sphere3d.Sphere3d units1 coordinates -> Sphere3d.Sphere3d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given sphere.\n\n Sphere3d.boundingBox exampleSphere\n --> BoundingBox3d.from\n --> (Point3d.meters -2 -1 -2)\n --> (Point3d.meters 4 5 4)\n\n","type":"Sphere3d.Sphere3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centerPoint","comment":" Get the center point of a sphere.\n","type":"Sphere3d.Sphere3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"circumference","comment":" Get the circumference of a sphere (the circumference of a [great circle](https://en.wikipedia.org/wiki/Great_circle)\nof the sphere).\n","type":"Sphere3d.Sphere3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"contains","comment":" Check if a sphere contains a given point.\n","type":"Point3d.Point3d units coordinates -> Sphere3d.Sphere3d units coordinates -> Basics.Bool"},{"name":"diameter","comment":" Get the diameter of a sphere (twice the radius).\n","type":"Sphere3d.Sphere3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"mirrorAcross","comment":" Mirror a sphere across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Sphere3d.Sphere3d units coordinates -> Sphere3d.Sphere3d units coordinates"},{"name":"placeIn","comment":" Take a sphere considered to be defined in local coordinates relative to a\ngiven reference frame, and return that sphere expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Sphere3d.Sphere3d units localCoordinates -> Sphere3d.Sphere3d units globalCoordinates"},{"name":"projectInto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a sphere into a sketch plane.\n\n Sphere3d.projectInto SketchPlane3d.xy exampleSphere\n --> Circle2d.withRadius (Length.meters 3)\n --> (Point2d.meters 1 2)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Sphere3d.Sphere3d units coordinates3d -> Circle2d.Circle2d units coordinates2d"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a sphere onto a plane.\n\n Sphere3d.projectOnto Plane3d.xy exampleSphere\n --> Circle3d.withRadius (Length.meters 3)\n --> Direction3d.z\n --> (Point3d.meters 1 2 0)\n\n","type":"Plane3d.Plane3d units coordinates -> Sphere3d.Sphere3d units coordinates -> Circle3d.Circle3d units coordinates"},{"name":"radius","comment":" Get the radius of a sphere.\n","type":"Sphere3d.Sphere3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"relativeTo","comment":" Take a sphere defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Sphere3d.Sphere3d units globalCoordinates -> Sphere3d.Sphere3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a sphere around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Sphere3d.Sphere3d units coordinates -> Sphere3d.Sphere3d units coordinates"},{"name":"scaleAbout","comment":" Scale a sphere around a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Sphere3d.Sphere3d units coordinates -> Sphere3d.Sphere3d units coordinates"},{"name":"surfaceArea","comment":" Get the surface area of a sphere.\n","type":"Sphere3d.Sphere3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"throughPoints","comment":" Attempt to construct a sphere that passes through the four given points.\nReturns `Nothing` if four given points are coplanar.\n\n Sphere3d.throughPoints\n (Point3d.meters 1 0 0)\n (Point3d.meters -1 0 0)\n (Point3d.meters 0 1 0)\n (Point3d.meters 0 0 0.5)\n --> Just <|\n --> Sphere3d.withRadius (Length.meters 1.25)\n --> (Point3d.meters 0 0 -0.75)\n\n -- Four coplanar points (in the XY plane)\n Sphere3d.throughPoints\n (Point3d.meters 1 0 0)\n (Point3d.meters -1 0 0)\n (Point3d.meters 0 1 0)\n (Point3d.meters 0 -1 0)\n --> Nothing\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Maybe.Maybe (Sphere3d.Sphere3d units coordinates)"},{"name":"translateBy","comment":" Translate a sphere by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Sphere3d.Sphere3d units coordinates -> Sphere3d.Sphere3d units coordinates"},{"name":"translateIn","comment":" Translate a sphere in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Sphere3d.Sphere3d units coordinates -> Sphere3d.Sphere3d units coordinates"},{"name":"volume","comment":" Get the volume of a sphere.\n","type":"Sphere3d.Sphere3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Cubed units)"},{"name":"withRadius","comment":" Construct a sphere from its radius and center point. Flipped version of\n`atPoint` that may be more useful in some situations like constructing a bunch\nof spheres of the same radius at different points:\n\n spheres =\n List.map (Sphere3d.withRadius radius) listOfPoints\n\n","type":"Quantity.Quantity Basics.Float units -> Point3d.Point3d units coordinates -> Sphere3d.Sphere3d units coordinates"}],"binops":[]},{"name":"SweptAngle","comment":" When constructing circular or elliptical arcs, it is sometimes necessary to\nspecify which of several possible arcs you want. For example, if you ask for a\ncircular arc from the point (1, 0) to the point (0, 1) with a radius of 1, there\nare four possible solutions:\n\n - An arc with a swept angle of 90 degrees, with center point at (0, 0)\n - An arc with a swept angle of -270 degrees, with center point at (0, 0)\n - An arc with a swept angle of -90 degrees, with center point at (1, 1)\n - An Arc with a swept angle of 270 degrees, with center point at (1, 1)\n\nThe `SweptAngle` type is used in these cases to specify which arc you want.\n\n@docs SweptAngle\n@docs smallPositive, smallNegative, largePositive, largeNegative\n\n","unions":[],"aliases":[{"name":"SweptAngle","comment":" Indicate which of four possible arcs you would like to construct. Used by\n[`Arc2d.withRadius`](Arc2d#withRadius) and [`EllipticalArc2d.fromEndpoints`](EllipticalArc2d#fromEndpoints).\n","args":[],"type":"Geometry.Types.SweptAngle"}],"values":[{"name":"largeNegative","comment":" Construct a clockwise arc with a swept angle between -180 and -360 degrees.\n","type":"SweptAngle.SweptAngle"},{"name":"largePositive","comment":" Construct a counterclockwise arc with a swept angle between 180 and 360\ndegrees.\n","type":"SweptAngle.SweptAngle"},{"name":"smallNegative","comment":" Construct a clockwise arc with a swept angle between 0 and -180 degrees.\n","type":"SweptAngle.SweptAngle"},{"name":"smallPositive","comment":" Construct a counterclockwise arc with a swept angle between 0 and 180\ndegrees.\n","type":"SweptAngle.SweptAngle"}],"binops":[]},{"name":"Triangle2d","comment":" A `Triangle2d` represents a triangle in 2D space, and is defined by its\nthree vertices. This module contains triangle-related functionality such as:\n\n - Finding the area and centroid of triangles\n - Scaling, rotating, translating and mirroring triangles\n - Converting triangles between different coordinate systems\n\n@docs Triangle2d\n\n\n# Constructors\n\n@docs fromVertices, from\n\n\n# Properties\n\n@docs vertices, edges, centroid, area, counterclockwiseArea, clockwiseArea, boundingBox, circumcircle\n\n\n# Queries\n\n@docs contains\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point2d`\nmodule](Point2d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, mapVertices\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn\n\n","unions":[],"aliases":[{"name":"Triangle2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Triangle2d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a triangle. The result will always be positive regardless of\nwhether the triangle's vertices are in clockwise or counterclockwise order.\n","type":"Triangle2d.Triangle2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a triangle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Triangle2d.Triangle2d units1 coordinates -> Triangle2d.Triangle2d units2 coordinates"},{"name":"at_","comment":" Convert a triangle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Triangle2d.Triangle2d units1 coordinates -> Triangle2d.Triangle2d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given triangle.\n\n Triangle2d.boundingBox exampleTriangle\n --> BoundingBox2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 2 3)\n\n","type":"Triangle2d.Triangle2d units coordinates -> BoundingBox2d.BoundingBox2d units coordinates"},{"name":"centroid","comment":" Get the centroid (center of mass) of a triangle.\n\n Triangle2d.centroid exampleTriangle\n --> Point2d.meters 1.3333 1.6667\n\n","type":"Triangle2d.Triangle2d units coordinates -> Point2d.Point2d units coordinates"},{"name":"circumcircle","comment":" Attempt to find the circumcircle of a triangle, a circle that passes through\neach of the triangle's vertices;\n\n Triangle2d.circumcircle triangle\n\nis equivalent to\n\n let\n ( p1, p2, p3 ) =\n Triangle2d.vertices triangle\n in\n Circle2d.throughPoints p1 p2 p3\n\nIf the triangle is degenerate (its three vertices are collinear), returns\n`Nothing`.\n\n","type":"Triangle2d.Triangle2d units coordinates -> Maybe.Maybe (Circle2d.Circle2d units coordinates)"},{"name":"clockwiseArea","comment":" Get the signed area of a triangle, returning a positive value if the\ntriangle's vertices are in clockwise order and a negative value otherwise.\n\n Triangle2d.clockwiseArea exampleTriangle\n --> Area.squareMeters -1.0\n\n","type":"Triangle2d.Triangle2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"contains","comment":" Check whether a given point is inside a given triangle. It does not matter\nwhether the triangle's vertices are in clockwise or counterclockwise order.\n","type":"Point2d.Point2d units coordinates -> Triangle2d.Triangle2d units coordinates -> Basics.Bool"},{"name":"counterclockwiseArea","comment":" Get the signed area of a triangle, returning a positive value if the\ntriangle's vertices are in counterclockwise order and a negative value\notherwise.\n\n Triangle2d.counterclockwiseArea exampleTriangle\n --> Area.squareMeters 1.0\n\n","type":"Triangle2d.Triangle2d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"edges","comment":" Get the edges of a triangle: from the first vertex to the second, from the\nsecond to the third, and from the third back to the first.\n\n\n ( e1, e2, e3 ) =\n Triangle2d.edges exampleTriangle\n\n --> e1 =\n --> LineSegment2d.from\n --> (Point2d.meters 1 1)\n --> (Point2d.meters 2 1)\n -->\n --> e2 =\n --> LineSegment2d.from\n --> (Point2d.meters 2 1)\n --> (Point2d.meters 1 3)\n -->\n --> e3 =\n --> LineSegment2d.from\n --> (Point2d.meters 1 3)\n --> (Point2d.meters 1 1)\n\n","type":"Triangle2d.Triangle2d units coordinates -> ( LineSegment2d.LineSegment2d units coordinates, LineSegment2d.LineSegment2d units coordinates, LineSegment2d.LineSegment2d units coordinates )"},{"name":"from","comment":" Construct a triangle from the first point, to the second, to the third:\n\n exampleTriangle =\n Triangle2d.from\n (Point2d.meters 1 1)\n (Point2d.meters 2 1)\n (Point2d.meters 1 3)\n\nUseful with `map3` functions such as `Json.Decode.map3`.\n\n","type":"Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Point2d.Point2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"fromVertices","comment":" Construct a triangle from its three vertices:\n\n exampleTriangle =\n Triangle2d.fromVertices\n ( Point2d.meters 1 1\n , Point2d.meters 2 1\n , Point2d.meters 1 3\n )\n\n","type":"( Point2d.Point2d units coordinates, Point2d.Point2d units coordinates, Point2d.Point2d units coordinates ) -> Triangle2d.Triangle2d units coordinates"},{"name":"mapVertices","comment":" Transform each vertex of a triangle by a given function and create a new\ntriangle from the resulting points. Most other transformation functions can be\ndefined in terms of `mapVertices`; for example,\n\n Triangle2d.mirrorAcross axis\n\nis equivalent to\n\n Triangle2d.mapVertices (Point2d.mirrorAcross axis)\n\n","type":"(Point2d.Point2d unitsA coordinatesA -> Point2d.Point2d unitsB coordinatesB) -> Triangle2d.Triangle2d unitsA coordinatesA -> Triangle2d.Triangle2d unitsB coordinatesB"},{"name":"mirrorAcross","comment":" Mirror a triangle across a given axis. Note that mirroring a triangle will\nresult in its 'winding direction' being flipped - if the triangle's vertices\nwere in counterclockwise order before mirroring, they will be in clockwise order\nafterwards and vice versa.\n","type":"Axis2d.Axis2d units coordinates -> Triangle2d.Triangle2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"placeIn","comment":" Take a triangle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that triangle expressed in global coordinates.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Triangle2d.Triangle2d units localCoordinates -> Triangle2d.Triangle2d units globalCoordinates"},{"name":"relativeTo","comment":" Take a triangle defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame2d.Frame2d units globalCoordinates { defines : localCoordinates } -> Triangle2d.Triangle2d units globalCoordinates -> Triangle2d.Triangle2d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a triangle around a given point by a given angle.\n","type":"Point2d.Point2d units coordinates -> Angle.Angle -> Triangle2d.Triangle2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"scaleAbout","comment":" Scale a triangle about a given point by a given scale. Note that scaling by\na negative value will result in the 'winding direction' of the triangle being\nflipped - if the triangle's vertices were in counterclockwise order before the\nnegative scaling, they will be in clockwise order afterwards and vice versa.\n","type":"Point2d.Point2d units coordinates -> Basics.Float -> Triangle2d.Triangle2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"translateBy","comment":" Translate a triangle by a given displacement.\n","type":"Vector2d.Vector2d units coordinates -> Triangle2d.Triangle2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"translateIn","comment":" Translate a triangle in a given direction by a given distance.\n","type":"Direction2d.Direction2d coordinates -> Quantity.Quantity Basics.Float units -> Triangle2d.Triangle2d units coordinates -> Triangle2d.Triangle2d units coordinates"},{"name":"vertices","comment":" Get the vertices of a triangle.\n\n ( p1, p2, p3 ) =\n Triangle2d.vertices exampleTriangle\n\n","type":"Triangle2d.Triangle2d units coordinates -> ( Point2d.Point2d units coordinates, Point2d.Point2d units coordinates, Point2d.Point2d units coordinates )"}],"binops":[]},{"name":"Triangle3d","comment":" A `Triangle3d` represents a triangle in 3D space, and is defined by its\nthree vertices. This module contains triangle-related functionality such as:\n\n - Finding the area and centroid of triangles\n - Scaling, rotating, translating, mirroring and projecting triangles\n - Converting triangles between different coordinate systems\n\n@docs Triangle3d\n\n\n# Constructors\n\n@docs fromVertices, from, on\n\n\n# Properties\n\n@docs vertices, edges, centroid, area, normalDirection, boundingBox, circumcircle\n\n\n# Transformations\n\nThese transformations generally behave just like [the ones in the `Point3d`\nmodule](Point3d#transformations).\n\n@docs scaleAbout, rotateAround, translateBy, translateIn, mirrorAcross, projectOnto, mapVertices\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\n@docs relativeTo, placeIn, projectInto\n\n","unions":[],"aliases":[{"name":"Triangle3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Triangle3d units coordinates"}],"values":[{"name":"area","comment":" Get the area of a triangle. This value is always positive.\n","type":"Triangle3d.Triangle3d units coordinates -> Quantity.Quantity Basics.Float (Quantity.Squared units)"},{"name":"at","comment":" Convert a triangle from one units type to another, by providing a conversion\nfactor given as a rate of change of destination units with respect to source\nunits.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units2 units1) -> Triangle3d.Triangle3d units1 coordinates -> Triangle3d.Triangle3d units2 coordinates"},{"name":"at_","comment":" Convert a triangle from one units type to another, by providing an 'inverse'\nconversion factor given as a rate of change of source units with respect to\ndestination units.\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate units1 units2) -> Triangle3d.Triangle3d units1 coordinates -> Triangle3d.Triangle3d units2 coordinates"},{"name":"boundingBox","comment":" Get the minimal bounding box containing a given triangle.\n\n Triangle3d.boundingBox exampleTriangle\n --> BoundingBox3d.from\n --> (Point3d.meters 1 0 0)\n --> (Point3d.meters 2 1 3)\n\n","type":"Triangle3d.Triangle3d units coordinates -> BoundingBox3d.BoundingBox3d units coordinates"},{"name":"centroid","comment":" Get the centroid (center of mass) of a triangle.\n\n Triangle3d.centroid exampleTriangle\n --> Point3d.meters 1.6667 0.6667 1\n\n","type":"Triangle3d.Triangle3d units coordinates -> Point3d.Point3d units coordinates"},{"name":"circumcircle","comment":" Attempt to find the circumcircle of a triangle, a circle that passes through\neach of the triangle's vertices;\n\n Triangle3d.circumcircle triangle\n\nis equivalent to\n\n let\n ( p1, p2, p3 ) =\n Triangle3d.vertices triangle\n in\n Circle3d.throughPoints p1 p2 p3\n\nIf the triangle is degenerate (its three vertices are collinear), returns\n`Nothing`.\n\n","type":"Triangle3d.Triangle3d units coordinates -> Maybe.Maybe (Circle3d.Circle3d units coordinates)"},{"name":"edges","comment":" Get the edges of a triangle: from the first vertex to the second, from the\nsecond to the third, and from the third back to the first.\n\n\n ( e1, e2, e3 ) =\n Triangle3d.edges exampleTriangle\n\n --> e1 =\n --> LineSegment3d.from\n --> (Point3d.meters 1 0 0)\n --> (Point3d.meters 2 0 0)\n -->\n --> e2 =\n --> LineSegment3d.from\n --> (Point3d.meters 2 0 0)\n --> (Point3d.meters 2 1 3)\n -->\n --> e3 =\n --> LineSegment3d.from\n --> (Point3d.meters 2 1 3)\n --> (Point3d.meters 1 0 0)\n\n","type":"Triangle3d.Triangle3d units coordinates -> ( LineSegment3d.LineSegment3d units coordinates, LineSegment3d.LineSegment3d units coordinates, LineSegment3d.LineSegment3d units coordinates )"},{"name":"from","comment":" Construct a triangle from the first point, to the second, to the third:\n\n exampleTriangle =\n Triangle3d.from\n (Point3d.meters 1 0 0)\n (Point3d.meters 2 0 0)\n (Point3d.meters 2 1 3)\n\nUseful with `map3` functions such as `Json.Decode.map3`.\n\n","type":"Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Point3d.Point3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"fromVertices","comment":" Construct a triangle from its three vertices:\n\n exampleTriangle =\n Triangle3d.fromVertices\n ( Point3d.meters 1 0 0\n , Point3d.meters 2 0 0\n , Point3d.meters 2 1 3\n )\n\n","type":"( Point3d.Point3d units coordinates, Point3d.Point3d units coordinates, Point3d.Point3d units coordinates ) -> Triangle3d.Triangle3d units coordinates"},{"name":"mapVertices","comment":" Transform each vertex of a triangle by a given function and create a new\ntriangle from the resulting points. Most other transformation functions can be\ndefined in terms of `mapVertices`; for example,\n\n Triangle3d.projectOnto plane\n\nis equivalent to\n\n Triangle3d.mapVertices (Point3d.projectOnto plane)\n\n","type":"(Point3d.Point3d units1 coordinates1 -> Point3d.Point3d units2 coordinates2) -> Triangle3d.Triangle3d units1 coordinates1 -> Triangle3d.Triangle3d units2 coordinates2"},{"name":"mirrorAcross","comment":" Mirror a triangle across a given plane.\n","type":"Plane3d.Plane3d units coordinates -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"normalDirection","comment":" Attempt to find the normal direction to a triangle. The resulting direction\nwill be oriented such that the triangle vertices are in counterclockwise order\naround it according to the right-hand rule. If the triangle is degenerate (its\nthree vertices are collinear), returns `Nothing`.\n\n Triangle3d.normalDirection exampleTriangle\n --> Just (Direction3d.yz (Angle.degrees 161.57))\n\n","type":"Triangle3d.Triangle3d units coordinates -> Maybe.Maybe (Direction3d.Direction3d coordinates)"},{"name":"on","comment":" Construct a 3D triangle lying _on_ a sketch plane by providing a 2D triangle\nspecified in XY coordinates _within_ the sketch plane.\n\n Triangle3d.on SketchPlane3d.xz <|\n Triangle2d.from\n (Point2d.meters 1 1)\n (Point2d.meters 2 1)\n (Point2d.meters 1 3)\n --> Triangle3d.from\n --> (Point3d.meters 1 0 1)\n --> (Point3d.meters 2 0 1)\n --> (Point3d.meters 1 0 3)\n\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Triangle2d.Triangle2d units coordinates2d -> Triangle3d.Triangle3d units coordinates3d"},{"name":"placeIn","comment":" Take a triangle considered to be defined in local coordinates relative to a\ngiven reference frame, and return that triangle expressed in global coordinates.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Triangle3d.Triangle3d units localCoordinates -> Triangle3d.Triangle3d units globalCoordinates"},{"name":"projectInto","comment":" Project a triangle into a given sketch plane. Conceptually, this finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the triangle onto the plane and then expresses the projected triangle in 2D\nsketch coordinates.\n","type":"SketchPlane3d.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Triangle3d.Triangle3d units coordinates3d -> Triangle2d.Triangle2d units coordinates2d"},{"name":"projectOnto","comment":" Find the [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof a triangle onto a plane.\n","type":"Plane3d.Plane3d units coordinates -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"relativeTo","comment":" Take a triangle defined in global coordinates, and return it expressed\nin local coordinates relative to a given reference frame.\n","type":"Frame3d.Frame3d units globalCoordinates { defines : localCoordinates } -> Triangle3d.Triangle3d units globalCoordinates -> Triangle3d.Triangle3d units localCoordinates"},{"name":"rotateAround","comment":" Rotate a triangle around a given axis by a given angle.\n","type":"Axis3d.Axis3d units coordinates -> Angle.Angle -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"scaleAbout","comment":" Scale a triangle about a given point by a given scale.\n","type":"Point3d.Point3d units coordinates -> Basics.Float -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"translateBy","comment":" Translate a triangle by a given displacement.\n","type":"Vector3d.Vector3d units coordinates -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"translateIn","comment":" Translate a triangle in a given direction by a given distance.\n","type":"Direction3d.Direction3d coordinates -> Quantity.Quantity Basics.Float units -> Triangle3d.Triangle3d units coordinates -> Triangle3d.Triangle3d units coordinates"},{"name":"vertices","comment":" Get the vertices of a triangle.\n\n ( p1, p2, p3 ) =\n Triangle3d.vertices exampleTriangle\n\n","type":"Triangle3d.Triangle3d units coordinates -> ( Point3d.Point3d units coordinates, Point3d.Point3d units coordinates, Point3d.Point3d units coordinates )"}],"binops":[]},{"name":"Vector2d","comment":" A `Vector2d` represents a quantity such as a displacement or velocity in 2D,\nand is defined by its X and Y components. This module contains a variety of\nvector-related functionality, such as\n\n - Adding or subtracting vectors\n - Finding the lengths of vectors\n - Rotating vectors\n - Converting vectors between different coordinate systems\n\nNote that unlike in many other geometry packages where vectors are used as a\ngeneral-purpose data type, `elm-geometry` has separate data types for vectors,\ndirections and points. In most code it is actually more common to use `Point2d`\nand `Direction2d` than `Vector2d`, and much code can avoid working directly with\n`Vector2d` values at all!\n\n@docs Vector2d\n\n\n# Constants\n\n@docs zero\n\nAlthough there are no predefined constants for the vectors with components\n(1,0) and (0,1), in most cases you will actually want their `Direction2d`\nversions [`Direction2d.x`](Direction2d#x) and [`Direction2d.y`](Direction2d#y).\n\n\n# Literals\n\n@docs unitless\n\nThe remaining functions all construct a `Vector2d` from X and Y components given\nin specific units. Functions like `Vector2d.xy` are more useful in generic code,\nbut these functions are useful for quickly creating hardcoded constant values,\ne.g.\n\n vector =\n Vector2d.meters 2 3\n\n@docs meters, pixels, millimeters, centimeters, inches, feet\n\nThere are some [additional constructors](#physics) below for vectors with\nphysics-related units (speed, acceleration and force).\n\n\n# Constructors\n\n@docs xy, xyIn, rTheta, rThetaIn, from, withLength, perpendicularTo, interpolateFrom\n\n\n# Interop\n\nThese functions are useful for interoperability with other Elm code that uses\nplain `Float` tuples or records to represent vectors.\n\n@docs fromTuple, toTuple, fromRecord, toRecord\n\n\n## Zero-copy conversions\n\nThese functions allow zero-overhead conversion of vectors to and from records\nwith `x` and `y` `Float` fields, useful for efficient interop with other code\nthat represents vectors as plain records.\n\n@docs fromMeters, toMeters, fromPixels, toPixels, fromUnitless, toUnitless\n\n\n# Rates of change\n\n@docs per, for\n\n\n# Properties\n\n@docs components, xComponent, yComponent, componentIn, length, direction\n\n\n# Comparison\n\n@docs equalWithin, lexicographicComparison\n\n\n# Arithmetic\n\n@docs plus, minus, dot, cross, sum, twice, half\n\n\n## Vector/scalar products\n\n@docs product, times, over, over_\n\n\n# Transformations\n\nNote that for `mirrorAcross` and `projectOnto`, only the direction of the axis\naffects the result, since vectors are position-independent. Think of\nmirroring/projecting a vector across/onto an axis as moving the vector so its\ntail is on the axis, then mirroring/projecting its tip across/onto the axis.\n\n@docs reverse, normalize, scaleBy, scaleTo, rotateBy, rotateClockwise, rotateCounterclockwise, mirrorAcross, projectionIn, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\nLike other transformations, coordinate conversions of vectors depend only on the\norientations of the relevant frames, not the positions of their origin points.\n\nFor the examples, assume the following frame has been defined:\n\n rotatedFrame =\n Frame2d.atOrigin\n |> Frame2d.rotateBy (Angle.degrees 30)\n\n@docs relativeTo, placeIn\n\n\n# Physics\n\nThese constructors let you conveniently create vectors with physics-related\nunits such as speed, acceleration and force. For example, a speed of 5 feet per\nsecond in the positive Y direction could be written as\n\n Vector2d.feetPerSecond 0 5\n\nand a force of 10 newtons in the negative X direction could be written as\n\n Vector2d.newtons -10 0\n\n\n## Speed\n\n@docs metersPerSecond, feetPerSecond, kilometersPerHour, milesPerHour\n\n\n## Acceleration\n\n@docs metersPerSecondSquared, feetPerSecondSquared, gees\n\n\n## Force\n\n@docs newtons, kilonewtons, meganewtons, pounds, kips\n\n\n# Advanced\n\nThese functions are unsafe because they require you to track units manually. In\ngeneral you should prefer other functions instead, but these functions may be\nuseful when writing generic/library code.\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Vector2d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Vector2d units coordinates"}],"values":[{"name":"at","comment":" Convert a vector from one units type to another, by providing a conversion factor given as a\nrate of change of destination units with respect to source units.\n\n worldVector =\n Vector2d.meters 2 3\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 100 |> Quantity.per (Length.meters 1)\n\n worldVector |> Vector2d.at resolution\n --> Vector2d.pixels 200 300\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate destinationUnits sourceUnits) -> Vector2d.Vector2d sourceUnits coordinates -> Vector2d.Vector2d destinationUnits coordinates"},{"name":"at_","comment":" Convert a vector from one units type to another, by providing an 'inverse' conversion factor\ngiven as a rate of change of source units with respect to destination units.\n\n screenVector =\n Vector2d.pixels 200 300\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 50 |> Quantity.per (Length.meters 1)\n\n screenVector |> Vector2d.at_ resolution\n --> Vector2d.meters 4 6\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate sourceUnits destinationUnits) -> Vector2d.Vector2d sourceUnits coordinates -> Vector2d.Vector2d destinationUnits coordinates"},{"name":"centimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"componentIn","comment":" Find the component of a vector in an arbitrary direction, for example\n\n forwardSpeed =\n Vector2d.componentIn forwardDirection velocity\n\nThis is more general and flexible than using `xComponent` or `yComponent`, both\nof which can be expressed in terms of `componentIn`; for example,\n\n Vector2d.xComponent vector\n\nis equivalent to\n\n Vector2d.componentIn Direction2d.x vector\n\n","type":"Geometry.Types.Direction2d coordinates -> Vector2d.Vector2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"components","comment":" Get the X and Y components of a vector as a tuple.\n\n Vector2d.components (Vector2d.meters 2 3)\n --> ( Length.meters 2, Length.meters 3 )\n\n","type":"Vector2d.Vector2d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"cross","comment":" Find the scalar 'cross product' of two vectors in 2D. This is useful in many\nof the same ways as the 3D cross product:\n\n - Its length is equal to the product of the lengths of the two given vectors\n and the sine of the angle between them, so it can be used as a metric to\n determine if two vectors are nearly parallel.\n - The sign of the result indicates the direction of rotation from the first\n vector to the second (positive indicates a counterclockwise rotation and\n negative indicates a clockwise rotation), similar to how the direction of\n the 3D cross product indicates the direction of rotation.\n\nNote the argument order: `v1 x v2` would be written as\n\n v1 |> Vector2d.cross v2\n\nwhich is the same as\n\n Vector2d.cross v2 v1\n\nbut the _opposite_ of\n\n Vector2d.cross v1 v2\n\nNote that the cross product of two vectors with length units will be a vector\nwith area units!\n\n","type":"Vector2d.Vector2d units2 coordinates -> Vector2d.Vector2d units1 coordinates -> Quantity.Quantity Basics.Float (Quantity.Product units1 units2)"},{"name":"direction","comment":" Attempt to find the direction of a vector. In the case of a zero vector,\nreturn `Nothing`.\n\n Vector2d.direction (Vector2d.meters 3 3)\n --> Just (Direction2d.degrees 45)\n\n Vector2d.direction Vector2d.zero\n --> Nothing\n\n","type":"Vector2d.Vector2d units coordinates -> Maybe.Maybe (Geometry.Types.Direction2d coordinates)"},{"name":"dot","comment":" Find the dot product of two vectors.\n\n firstVector =\n Vector2d.meters 1 2\n\n secondVector =\n Vector2d.meters 3 4\n\n firstVector |> Vector2d.dot secondVector\n --> Area.squareMeters 11\n\n","type":"Vector2d.Vector2d units2 coordinates -> Vector2d.Vector2d units1 coordinates -> Quantity.Quantity Basics.Float (Quantity.Product units1 units2)"},{"name":"equalWithin","comment":" Compare two vectors within a tolerance. Returns true if the difference\nbetween the two given vectors has magnitude less than the given tolerance.\n\n firstVector =\n Vector2d.meters 1 2\n\n secondVector =\n Vector2d.meters 0.9999 2.0002\n\n Vector2d.equalWithin (Length.millimeters 1)\n firstVector\n secondVector\n --> True\n\n Vector2d.equalWithin (Length.microns 1)\n firstVector\n secondVector\n --> False\n\n","type":"Quantity.Quantity Basics.Float units -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Basics.Bool"},{"name":"feet","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"feetPerSecond","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Speed.MetersPerSecond coordinates"},{"name":"feetPerSecondSquared","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Acceleration.MetersPerSecondSquared coordinates"},{"name":"for","comment":" Multiply a rate of change vector by an independent quantity to get a total vector. For example,\nmultiply a velocity by a duration to get a total displacement:\n\n velocity =\n Vector2d.xy\n (Pixels.pixelsPerSecond 200)\n (Pixels.pixelsPerSecond 50)\n\n velocity |> Vector2d.for (Duration.seconds 0.1)\n --> Vector2d.pixels 20 5\n\n","type":"Quantity.Quantity Basics.Float independentUnits -> Vector2d.Vector2d (Quantity.Rate dependentUnits independentUnits) coordinates -> Vector2d.Vector2d dependentUnits coordinates"},{"name":"from","comment":" Construct a vector from the first given point to the second.\n\n startPoint =\n Point2d.meters 1 1\n\n endPoint =\n Point2d.meters 4 5\n\n Vector2d.from startPoint endPoint\n --> Vector2d.meters 3 4\n\n","type":"Geometry.Types.Point2d units coordinates -> Geometry.Types.Point2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"fromMeters","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"fromPixels","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Vector2d.Vector2d Pixels.Pixels coordinates"},{"name":"fromRecord","comment":" Construct a `Vector2d` from a record with `Float` fields, by specifying what units those fields\nare in.\n\n Vector2d.fromRecord Length.inches { x = 24, y = 36 }\n --> Vector2d.feet 2 3\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> { x : Basics.Float, y : Basics.Float } -> Vector2d.Vector2d units coordinates"},{"name":"fromTuple","comment":" Construct a `Vector2d` from a tuple of `Float` values, by specifying what units those values are\nin.\n\n Vector2d.fromTuple Length.meters ( 2, 3 )\n --> Vector2d.meters 2 3\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> ( Basics.Float, Basics.Float ) -> Vector2d.Vector2d units coordinates"},{"name":"fromUnitless","comment":" ","type":"{ x : Basics.Float, y : Basics.Float } -> Vector2d.Vector2d Quantity.Unitless coordinates"},{"name":"gees","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Acceleration.MetersPerSecondSquared coordinates"},{"name":"half","comment":" Shorthand for `Vector2d.scaleBy 0.5`.\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"inches","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"interpolateFrom","comment":" Construct a vector by interpolating from the first given vector to the\nsecond, based on a parameter that ranges from zero to one.\n\n startVector =\n Vector2d.zero\n\n endVector =\n Vector2d.meters 8 12\n\n Vector2d.interpolateFrom startVector endVector 0.25\n --> Vector2d.meters 2 3\n\nPartial application may be useful:\n\n interpolatedVector : Float -> Vector2d\n interpolatedVector =\n Vector2d.interpolateFrom startVector endVector\n\n List.map interpolatedVector [ 0, 0.5, 1 ]\n --> [ Vector2d.meters 0 0\n --> , Vector2d.meters 4 6\n --> , Vector2d.meters 8 12\n --> ]\n\nYou can pass values less than zero or greater than one to extrapolate:\n\n interpolatedVector -0.5\n --> Vector2d.meters -4 -6\n\n interpolatedVector 1.25\n --> Vector2d.meters 10 15\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Basics.Float -> Vector2d.Vector2d units coordinates"},{"name":"kilometersPerHour","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Speed.MetersPerSecond coordinates"},{"name":"kilonewtons","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Force.Newtons coordinates"},{"name":"kips","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Force.Newtons coordinates"},{"name":"length","comment":" Get the length (magnitude) of a vector.\n\n Vector2d.length (Vector2d.meters 3 4)\n --> Length.meters 5\n\n","type":"Vector2d.Vector2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"lexicographicComparison","comment":" Compare two `Vector2d` values lexicographically: first by X component, then\nby Y. Can be used to provide a sort order for `Vector2d` values.\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Basics.Order"},{"name":"meganewtons","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Force.Newtons coordinates"},{"name":"meters","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"metersPerSecond","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Speed.MetersPerSecond coordinates"},{"name":"metersPerSecondSquared","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Acceleration.MetersPerSecondSquared coordinates"},{"name":"milesPerHour","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Speed.MetersPerSecond coordinates"},{"name":"millimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Length.Meters coordinates"},{"name":"minus","comment":" Find the difference between two vectors (the second vector minus the first).\n\n firstVector =\n Vector2d.meters 5 6\n\n secondVector =\n Vector2d.meters 1 3\n\n firstVector |> Vector2d.minus secondVector\n --> Vector2d.meters 4 3\n\nNote the argument order: `v1 - v2` would be written as\n\n v1 |> Vector2d.minus v2\n\nwhich is the same as\n\n Vector2d.minus v2 v1\n\nbut the _opposite_ of\n\n Vector2d.minus v1 v2\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a vector across a given axis.\n\n vector =\n Vector2d.meters 2 3\n\n Vector2d.mirrorAcross Axis2d.y vector\n --> Vector2d.meters -2 3\n\nThe position of the axis doesn't matter, only its orientation:\n\n horizontalAxis =\n Axis2d.withDirection Direction2d.x\n (Point2d.meters 100 200)\n\n Vector2d.mirrorAcross horizontalAxis vector\n --> Vector2d.meters 2 -3\n\n","type":"Geometry.Types.Axis2d axisUnits coordinates -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"newtons","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Force.Newtons coordinates"},{"name":"normalize","comment":" Normalize a vector to have a length of one. Zero vectors are left as-is.\n\n vector =\n Vector2d.meters 3 4\n\n Vector2d.normalize vector\n --> Vector2d.meters 0.6 0.8\n\n Vector2d.normalize Vector2d.zero\n --> Vector2d.zero\n\n**Warning**: `Vector2d.direction` is safer since it forces you to explicitly\nconsider the case where the given vector is zero. `Vector2d.normalize` is\nprimarily useful for cases like generating WebGL meshes, where defaulting to a\nzero vector for degenerate cases is acceptable, and the overhead of something\nlike\n\n Vector2d.direction vector\n |> Maybe.map Direction2d.toVector\n |> Maybe.withDefault Vector2d.zero\n\n(which is functionally equivalent to `Vector2d.normalize vector`) is too high.\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d Quantity.Unitless coordinates"},{"name":"over","comment":" Divide a vector with units `Product units1 units2` by a scalar with units\n`units1`, resulting in a vector with units `units2`.\n\n accelerationVector =\n forceVector |> Vector2d.over mass\n\n","type":"Quantity.Quantity Basics.Float units1 -> Vector2d.Vector2d (Quantity.Product units1 units2) coordinates -> Vector2d.Vector2d units2 coordinates"},{"name":"over_","comment":" Divide a vector with units `Product units1 units2` by a scalar with units\n`units2`, resulting in a vector with units `units1`. Provided for consistency\nwith `elm-units` but shouldn't be needed in most cases.\n","type":"Quantity.Quantity Basics.Float units2 -> Vector2d.Vector2d (Quantity.Product units1 units2) coordinates -> Vector2d.Vector2d units1 coordinates"},{"name":"per","comment":" Construct a vector representing a rate of change such as a speed:\n\n displacement =\n Vector2d.meters 6 8\n\n velocity =\n displacement |> Vector2d.per (Duration.seconds 2)\n\n -- Get the magnitude of the velocity (the speed)\n Vector2d.length velocity\n --> Speed.metersPerSecond 5\n\n","type":"Quantity.Quantity Basics.Float independentUnits -> Vector2d.Vector2d dependentUnits coordinates -> Vector2d.Vector2d (Quantity.Rate dependentUnits independentUnits) coordinates"},{"name":"perpendicularTo","comment":" Construct a vector perpendicular to the given vector, by rotating the given\nvector 90 degrees counterclockwise. The constructed vector will have the same\nlength as the given vector. Alias for `Vector2d.rotateCounterclockwise`.\n\n Vector2d.perpendicularTo (Vector2d.meters 1 0)\n --> Vector2d.meters 0 1\n\n Vector2d.perpendicularTo (Vector2d.meters 0 2)\n --> Vector2d.meters -2 0\n\n Vector2d.perpendicularTo (Vector2d.meters 3 1)\n --> Vector2d.meters -1 3\n\n Vector2d.perpendicularTo Vector2d.zero\n --> Vector2d.zero\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"pixels","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Pixels.Pixels coordinates"},{"name":"placeIn","comment":" Take a vector defined in local coordinates relative to a given reference\nframe, and return that vector expressed in global coordinates.\n\n Vector2d.meters 2 0\n |> Vector2d.placeIn rotatedFrame\n --> Vector2d.meters 1.732 1\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Vector2d.Vector2d units localCoordinates -> Vector2d.Vector2d units globalCoordinates"},{"name":"plus","comment":" Find the sum of two vectors.\n\n firstVector =\n Vector2d.meters 1 2\n\n secondVector =\n Vector2d.meters 3 4\n\n firstVector |> Vector2d.plus secondVector\n --> Vector2d.meters 4 6\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"pounds","comment":" ","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Force.Newtons coordinates"},{"name":"product","comment":" Multiply a scalar and a vector, resulting in a vector with units `Product\nscalarUnits vectorUnits`:\n\n forceVector =\n Vector2d.product mass accelerationVector\n\nIf you just want to scale a vector by a certain amount, you can use\n[`scaleBy`](#scaleBy) instead.\n\n","type":"Quantity.Quantity Basics.Float scalarUnits -> Vector2d.Vector2d vectorUnits coordinates -> Vector2d.Vector2d (Quantity.Product scalarUnits vectorUnits) coordinates"},{"name":"projectOnto","comment":" Project a vector onto an axis.\n\n Vector2d.projectOnto Axis2d.y (Vector2d.meters 3 4)\n --> Vector2d.meters 0 4\n\n Vector2d.projectOnto Axis2d.x (Vector2d.meters -1 2)\n --> Vector2d.meters -1 0\n\nThis is equivalent to finding the projection in the axis' direction.\n\n","type":"Geometry.Types.Axis2d units coordinates -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"projectionIn","comment":" Find the projection of a vector in a particular direction. Conceptually,\nthis means splitting the original vector into a portion parallel to the given\ndirection and a portion perpendicular to it, then returning the parallel\nportion.\n\n vector =\n Vector2d.meters 2 3\n\n Vector2d.projectionIn Direction2d.x vector\n --> Vector2d.meters 2 0\n\n Vector2d.projectionIn Direction2d.y vector\n --> Vector2d.meters 0 3\n\n","type":"Geometry.Types.Direction2d coordinates -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"rTheta","comment":" Construct a vector from a length and angle. The angle is measured\ncounterclockwise from the positive X direction.\n\n Vector2d.rTheta (Length.meters 2) (Angle.degrees 135)\n -->Vector2d.meters -1.4142 1.4142\n\n","type":"Quantity.Quantity Basics.Float units -> Angle.Angle -> Vector2d.Vector2d units coordinates"},{"name":"rThetaIn","comment":" Construct a vector given its local polar components within a particular\nframe:\n\n rotatedFrame =\n Frame2d.atOrigin\n |> Frame2d.rotateBy (Angle.degrees 45)\n\n Vector2d.rThetaIn rotatedFrame\n (Length.meters 1)\n (Angle.degrees 0)\n --> Vector2d.meters 0.7071 0.7071\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Angle.Angle -> Vector2d.Vector2d units globalCoordinates"},{"name":"relativeTo","comment":" Take a vector defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n\n Vector2d.meters 2 0\n |> Vector2d.relativeTo rotatedFrame\n --> Vector2d.meters 1.732 -1\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Vector2d.Vector2d units globalCoordinates -> Vector2d.Vector2d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of a vector, negating its components.\n\n Vector2d.reverse (Vector2d.meters -1 2)\n --> Vector2d.meters 1 -2\n\n(This could have been called `negate`, but `reverse` is more consistent with\nthe naming used in other modules.)\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"rotateBy","comment":" Rotate a vector counterclockwise by a given angle.\n\n Vector2d.meters 1 1\n |> Vector2d.rotateBy (Angle.degrees 45)\n --> Vector2d.meters 0 1.4142\n\n Vector2d.meters 1 0\n |> Vector2d.rotateBy (Angle.radians pi)\n --> Vector2d.meters -1 0\n\n","type":"Angle.Angle -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"rotateClockwise","comment":" Rotate the given vector 90 degrees clockwise;\n\n Vector2d.rotateClockwise vector\n\nis equivalent to\n\n Vector2d.rotateBy (Angle.degrees -90) vector\n\nbut is more efficient.\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"rotateCounterclockwise","comment":" Rotate the given vector 90 degrees counterclockwise;\n\n Vector2d.rotateCounterclockwise vector\n\nis equivalent to\n\n Vector2d.rotateBy (Angle.degrees 90) vector\n\nbut is more efficient.\n\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"scaleBy","comment":" Scale the length of a vector by a given scale.\n\n Vector2d.scaleBy 3 (Vector2d.meters 1 2)\n --> Vector2d.meters 3 6\n\n(This could have been called `multiply` or `times`, but `scaleBy` was chosen as\na more geometrically meaningful name and to be consistent with the `scaleAbout`\nname used in other modules.)\n\n","type":"Basics.Float -> Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"scaleTo","comment":" Scale a vector to a given length.\n\n Vector2d.scaleTo (Length.meters 25) (Vector2d.meters 3 4)\n --> Vector2d.meters 15 20\n\nScaling a zero vector will always result in a zero vector.\n\n","type":"Quantity.Quantity Basics.Float units2 -> Vector2d.Vector2d units1 coordinates -> Vector2d.Vector2d units2 coordinates"},{"name":"sum","comment":" Find the sum of a list of vectors.\n","type":"List.List (Vector2d.Vector2d units coordinates) -> Vector2d.Vector2d units coordinates"},{"name":"times","comment":" Multiply a vector by a scalar, resulting in a vector with units `Product\nvectorUnits scalarUnits`. (To the compiler `Product a b` and `Product b a`\nare different unit types, so sometimes you will have to swap from `product` to\n`times` or vice versa to make the types work out.)\n","type":"Quantity.Quantity Basics.Float scalarUnits -> Vector2d.Vector2d vectorUnits coordinates -> Vector2d.Vector2d (Quantity.Product vectorUnits scalarUnits) coordinates"},{"name":"toMeters","comment":" ","type":"Vector2d.Vector2d Length.Meters coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toPixels","comment":" ","type":"Vector2d.Vector2d Pixels.Pixels coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toRecord","comment":" Convert a `Vector2d` to a record with `Float` fields, by specifying what units you want the\nresult to be in.\n\n vector =\n Vector2d.meters 2 3\n\n Vector2d.toRecord Length.inCentimeters vector\n --> { x = 200, y = 300 }\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Vector2d.Vector2d units coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"toTuple","comment":" Convert a `Vector2d` to a tuple of `Float` values, by specifying what units you want the result\nto be in.\n\n vector =\n Vector2d.feet 2 3\n\n Vector2d.toTuple Length.inInches vector\n --> ( 24, 36 )\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Vector2d.Vector2d units coordinates -> ( Basics.Float, Basics.Float )"},{"name":"toUnitless","comment":" ","type":"Vector2d.Vector2d Quantity.Unitless coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"twice","comment":" Shorthand for `Vector2d.scaleBy 2`.\n","type":"Vector2d.Vector2d units coordinates -> Vector2d.Vector2d units coordinates"},{"name":"unitless","comment":" Construct a unitless `Vector2d` value from its X and Y components. See also\n[`fromUnitless`](#fromUnitless).\n","type":"Basics.Float -> Basics.Float -> Vector2d.Vector2d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a vector from its raw X and Y components as `Float` values. The\nvalues must be in whatever units the resulting point is considered to use\n(usually meters or pixels). You should generally use something safer such as\n[`meters`](#meters), [`fromPixels`](#fromPixels), [`xy`](#xy),\n[`fromRecord`](#fromRecord) etc.\n","type":"{ x : Basics.Float, y : Basics.Float } -> Vector2d.Vector2d units coordinates"},{"name":"unwrap","comment":" Extract a vector's raw X and Y components as `Float` values. These values\nwill be in whatever units the vector has (usually meters or pixels). You should\ngenerally use something safer such as [`toMeters`](#toMeters),\n[`toRecord`](#toRecord), [`xComponent`](#xComponent) etc.\n","type":"Vector2d.Vector2d units coordinates -> { x : Basics.Float, y : Basics.Float }"},{"name":"withLength","comment":" Construct a vector with the given length in the given direction.\n\n Vector2d.withLength (Length.meters 5) Direction2d.y\n --> Vector2d.meters 0 5\n\n","type":"Quantity.Quantity Basics.Float units -> Geometry.Types.Direction2d coordinates -> Vector2d.Vector2d units coordinates"},{"name":"xComponent","comment":" Get the X component of a vector.\n\n Vector2d.xComponent (Vector2d.meters 2 3)\n --> Length.meters 2\n\n","type":"Vector2d.Vector2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"xy","comment":" Construct a vector from its X and Y components.\n\n vector =\n Vector2d.xy (Length.meters 2) (Length.meters 3)\n\n","type":"Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Vector2d.Vector2d units coordinates"},{"name":"xyIn","comment":" Construct a vector given its local components within a particular frame:\n\n rotatedFrame =\n Frame2d.atOrigin\n |> Frame2d.rotateBy (Angle.degrees 45)\n\n Vector2d.xyIn rotatedFrame\n (Length.meters 2)\n (Length.meters 0)\n --> Vector2d.xy\n --> (Length.meters 1.4142)\n --> (Length.meters 1.4142)\n\n","type":"Geometry.Types.Frame2d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Vector2d.Vector2d units globalCoordinates"},{"name":"yComponent","comment":" Get the Y component of a vector.\n\n Vector2d.yComponent (Vector2d.meters 2 3)\n --> Length.meters 3\n\n","type":"Vector2d.Vector2d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"zero","comment":" The vector with components (0,0).\n","type":"Vector2d.Vector2d units coordinates"}],"binops":[]},{"name":"Vector3d","comment":" A `Vector3d` represents a quantity such as a displacement or velocity in 3D,\nand is defined by its X, Y and Z components. This module contains a variety of\nvector-related functionality, such as\n\n - Adding or subtracting vectors\n - Finding the lengths of vectors\n - Rotating vectors\n - Converting vectors between different coordinate systems\n\nNote that unlike in many other geometry packages where vectors are used as a\ngeneral-purpose data type, `elm-geometry` has separate data types for vectors,\ndirections and points. In most code it is actually more common to use `Point3d`\nand `Direction3d` than `Vector3d`, and much code can avoid working directly with\n`Vector3d` values at all!\n\n@docs Vector3d\n\n\n# Predefined vectors\n\n@docs zero\n\nAlthough there are no predefined constants for the vectors with components\n(1,0,0), (0,1,0) and (0,0,1), in most cases you will actually want their\n`Direction3d` versions [`Direction3d.x`](Direction3d#x),\n[`Direction3d.y`](Direction3d#y) and [`Direction3d.z`](Direction3d#z).\n\n\n# Literals\n\n@docs unitless\n\nThe remaining functions all construct a `Vector3d` from X, Y and Z components\ngiven in specific units. Functions like `Vector3d.xyz` are more useful in\ngeneric code, but these functions are useful for quickly creating hardcoded\nconstant values, e.g.\n\n vector =\n Vector3d.meters 2 3 1\n\n@docs meters, pixels, millimeters, centimeters, inches, feet\n\nThere are some [additional constructors](#physics) below for vectors with\nphysics-related units (speed, acceleration and force).\n\n\n# Constructors\n\n@docs xyz, xyzIn, from, withLength, on, xyOn, rThetaOn, perpendicularTo, interpolateFrom\n\n\n# Interop\n\nThese functions are useful for interoperability with other Elm code that uses\nplain `Float` tuples or records to represent vectors.\n\n@docs fromTuple, toTuple, fromRecord, toRecord\n\n\n## Zero-copy conversions\n\nThese functions allow zero-overhead conversion of vectors to and from records\nwith `x`, `y` and `z` `Float` fields, useful for efficient interop with other\ncode that represents vectors as plain records.\n\n@docs fromMeters, toMeters, fromPixels, toPixels, fromUnitless, toUnitless\n\n\n# Rates of change\n\n@docs per, for\n\n\n# Properties\n\n@docs components, xComponent, yComponent, zComponent, componentIn, length, direction\n\n\n# Comparison\n\n@docs equalWithin, lexicographicComparison\n\n\n# Arithmetic\n\n@docs plus, minus, dot, cross, sum, twice, half\n\n\n## Vector/scalar products\n\n@docs product, times, over, over_\n\n\n# Transformations\n\nNote that for all transformations, only the orientation of the given axis or\nplane is relevant, since vectors are position-independent. Think of transforming\na vector as placing its tail on the relevant axis or plane and then transforming\nits tip.\n\n@docs reverse, normalize, scaleBy, scaleTo, rotateAround, mirrorAcross, projectionIn, projectOnto\n\n\n# Unit conversions\n\n@docs at, at_\n\n\n# Coordinate conversions\n\nLike other transformations, coordinate transformations of vectors depend only on\nthe orientations of the relevant frames/sketch planes, not their positions.\n\nFor the examples, assume the following definition of a local coordinate frame,\none that is rotated 30 degrees counterclockwise around the Z axis from the\nglobal XYZ frame:\n\n rotatedFrame =\n Frame3d.atOrigin |> Frame3d.rotateAround Axis3d.z (Angle.degrees 30)\n\n@docs relativeTo, placeIn, projectInto\n\n\n# Physics\n\nThese constructors let you conveniently create vectors with physics-related\nunits such as speed, acceleration and force. For example, a speed of 5 feet per\nsecond in the positive Y direction could be written as\n\n Vector3d.feetPerSecond 0 5 0\n\nand a force of 10 newtons in the negative X direction could be written as\n\n Vector3d.newtons -10 0 0\n\n\n## Speed\n\n@docs metersPerSecond, feetPerSecond, kilometersPerHour, milesPerHour\n\n\n## Acceleration\n\n@docs metersPerSecondSquared, feetPerSecondSquared, gees\n\n\n## Force\n\n@docs newtons, kilonewtons, meganewtons, pounds, kips\n\n\n# Advanced\n\nThese functions are unsafe because they require you to track units manually. In\ngeneral you should prefer other functions instead, but these functions may be\nuseful when writing generic/library code.\n\n@docs unsafe, unwrap\n\n","unions":[],"aliases":[{"name":"Vector3d","comment":" ","args":["units","coordinates"],"type":"Geometry.Types.Vector3d units coordinates"}],"values":[{"name":"at","comment":" Convert a vector from one units type to another, by providing a conversion factor given as a\nrate of change of destination units with respect to source units.\n\n worldVector =\n Vector3d.meters 2 3 1\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 100 |> Quantity.per (Length.meters 1)\n\n worldVector |> Vector3d.at resolution\n --> Vector3d.pixels 200 300 100\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate destinationUnits sourceUnits) -> Vector3d.Vector3d sourceUnits coordinates -> Vector3d.Vector3d destinationUnits coordinates"},{"name":"at_","comment":" Convert a vector from one units type to another, by providing an 'inverse' conversion factor\ngiven as a rate of change of source units with respect to destination units.\n\n screenVector =\n Vector3d.pixels 200 300 100\n\n resolution : Quantity Float (Rate Pixels Meters)\n resolution =\n Pixels.pixels 50 |> Quantity.per (Length.meters 1)\n\n screenVector |> Vector3d.at_ resolution\n --> Vector3d.meters 4 6 2\n\n","type":"Quantity.Quantity Basics.Float (Quantity.Rate sourceUnits destinationUnits) -> Vector3d.Vector3d sourceUnits coordinates -> Vector3d.Vector3d destinationUnits coordinates"},{"name":"centimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"componentIn","comment":" Find the component of a vector in an arbitrary direction, for example\n\n verticalSpeed =\n Vector3d.componentIn upDirection velocity\n\nThis is more general and flexible than using `xComponent`, `yComponent` or\n`zComponent`, all of which can be expressed in terms of `componentIn`; for\nexample,\n\n Vector3d.zComponent vector\n\nis equivalent to\n\n Vector3d.componentIn Direction3d.z vector\n\n","type":"Geometry.Types.Direction3d coordinates -> Vector3d.Vector3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"components","comment":" Get the X, Y and Z components of a vector as a tuple.\n\n Vector3d.components (Vector3d.meters 2 3 1)\n --> ( Length.meters 2\n --> , Length.meters 3\n --> , Length.meters 1\n --> )\n\n","type":"Vector3d.Vector3d units coordinates -> ( Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units, Quantity.Quantity Basics.Float units )"},{"name":"cross","comment":" Find the cross product of two vectors.\n\n firstVector =\n Vector3d.meters 2 0 0\n\n secondVector =\n Vector3d.meters 0 3 0\n\n firstVector |> Vector3d.cross secondVector\n --> Vector3d.xyz\n --> Quantity.zero\n --> Quantity.zero\n --> (Area.squareMeters 6)\n\nNote the argument order: `v1 x v2` would be written as\n\n v1 |> Vector3d.cross v2\n\nwhich is the same as\n\n Vector3d.cross v2 v1\n\nbut the _opposite_ of\n\n Vector3d.cross v1 v2\n\nNote that the cross product of two vectors with length units will be a vector\nwith area units!\n\n","type":"Vector3d.Vector3d units2 coordinates -> Vector3d.Vector3d units1 coordinates -> Vector3d.Vector3d (Quantity.Product units1 units2) coordinates"},{"name":"direction","comment":" Attempt to find the direction of a vector. In the case of a zero vector,\nreturns `Nothing`.\n\n Vector3d.direction (Vector3d.meters 3 0 3)\n --> Just (Direction3d.xz (Angle.degrees 45))\n\n Vector3d.direction Vector3d.zero\n --> Nothing\n\n","type":"Vector3d.Vector3d units coordinates -> Maybe.Maybe (Geometry.Types.Direction3d coordinates)"},{"name":"dot","comment":" Find the dot product of two vectors.\n\n firstVector =\n Vector3d.meters 1 0 2\n\n secondVector =\n Vector3d.meters 3 4 5\n\n firstVector |> Vector3d.dot secondVector\n --> Area.squareMeters 13\n\n","type":"Vector3d.Vector3d units2 coordinates -> Vector3d.Vector3d units1 coordinates -> Quantity.Quantity Basics.Float (Quantity.Product units1 units2)"},{"name":"equalWithin","comment":" Compare two vectors within a tolerance. Returns true if the difference\nbetween the two given vectors has magnitude less than the given tolerance.\n\n firstVector =\n Vector3d.meters 2 1 3\n\n secondVector =\n Vector3d.meters 2.0002 0.9999 3.0001\n\n Vector3d.equalWithin (Length.millimeters 1)\n firstVector\n secondVector\n --> True\n\n Vector3d.equalWithin (Length.microns 1)\n firstVector\n secondVector\n --> False\n\n","type":"Quantity.Quantity Basics.Float units -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates -> Basics.Bool"},{"name":"feet","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"feetPerSecond","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Speed.MetersPerSecond coordinates"},{"name":"feetPerSecondSquared","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Acceleration.MetersPerSecondSquared coordinates"},{"name":"for","comment":" Multiply a rate of change vector by an independent quantity to get a total vector. For example,\nmultiply a velocity by a duration to get a total displacement:\n\n velocity =\n Vector3d.xy\n (Pixels.pixelsPerSecond 200)\n (Pixels.pixelsPerSecond 50)\n (Pixels.pixelsPerSecond 100)\n\n velocity |> Vector3d.for (Duration.seconds 0.1)\n --> Vector3d.pixels 20 5 10\n\n","type":"Quantity.Quantity Basics.Float independentUnits -> Vector3d.Vector3d (Quantity.Rate dependentUnits independentUnits) coordinates -> Vector3d.Vector3d dependentUnits coordinates"},{"name":"from","comment":" Construct a vector from the first given point to the second.\n\n startPoint =\n Point3d.meters 1 1 1\n\n endPoint =\n Point3d.meters 4 5 6\n\n Vector3d.from startPoint endPoint\n --> Vector3d.meters 3 4 5\n\n","type":"Geometry.Types.Point3d units coordinates -> Geometry.Types.Point3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"fromMeters","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"fromPixels","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Vector3d.Vector3d Pixels.Pixels coordinates"},{"name":"fromRecord","comment":" Construct a `Vector3d` from a record with `Float` fields, by specifying what\nunits those fields are in.\n\n Vector3d.fromRecord Length.inches { x = 24, y = 36, z = 12 }\n --> Vector3d.feet 2 3 1\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> { x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Vector3d.Vector3d units coordinates"},{"name":"fromTuple","comment":" Construct a `Vector3d` from a tuple of `Float` values, by specifying what units those values are\nin.\n\n Vector3d.fromTuple Length.meters ( 2, 3, 1 )\n --> Vector3d.meters 2 3 1\n\n","type":"(Basics.Float -> Quantity.Quantity Basics.Float units) -> ( Basics.Float, Basics.Float, Basics.Float ) -> Vector3d.Vector3d units coordinates"},{"name":"fromUnitless","comment":" ","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Vector3d.Vector3d Quantity.Unitless coordinates"},{"name":"gees","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Acceleration.MetersPerSecondSquared coordinates"},{"name":"half","comment":" Shorthand for `Vector3d.scaleBy 0.5`.\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"inches","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"interpolateFrom","comment":" Construct a vector by interpolating from the first given vector to the\nsecond, based on a parameter that ranges from zero to one.\n\n startVector =\n Vector3d.meters 1 2 4\n\n endVector =\n Vector3d.meters 1 3 8\n\n Vector3d.interpolateFrom startVector endVector 0.25\n --> Vector3d.meters 1 2.25 5\n\nPartial application may be useful:\n\n interpolatedVector : Float -> Vector3d\n interpolatedVector =\n Vector3d.interpolateFrom startVector endVector\n\n List.map interpolatedVector [ 0, 0.5, 1 ]\n --> [ Vector3d.meters 1 2 4\n --> , Vector3d.meters 1 2 6\n --> , Vector3d.meters 1 2 8\n --> ]\n\nYou can pass values less than zero or greater than one to extrapolate:\n\n interpolatedVector -0.5\n --> Vector3d.meters 1 2 2\n\n interpolatedVector 1.25\n --> Vector3d.meters 1 2 9\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates -> Basics.Float -> Vector3d.Vector3d units coordinates"},{"name":"kilometersPerHour","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Speed.MetersPerSecond coordinates"},{"name":"kilonewtons","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Force.Newtons coordinates"},{"name":"kips","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Force.Newtons coordinates"},{"name":"length","comment":" Get the length (magnitude) of a vector.\n\n Vector3d.length (Vector3d.meters 2 1 2)\n --> Length.meters 3\n\n","type":"Vector3d.Vector3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"lexicographicComparison","comment":" Compare two `Vector3d` values lexicographically: first by X component, then\nby Y, then by Z. Can be used to provide a sort order for `Vector3d` values.\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates -> Basics.Order"},{"name":"meganewtons","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Force.Newtons coordinates"},{"name":"meters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"metersPerSecond","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Speed.MetersPerSecond coordinates"},{"name":"metersPerSecondSquared","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Acceleration.MetersPerSecondSquared coordinates"},{"name":"milesPerHour","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Speed.MetersPerSecond coordinates"},{"name":"millimeters","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Length.Meters coordinates"},{"name":"minus","comment":" Find the difference between two vectors (the second vector minus the first).\n\n firstVector =\n Vector3d.meters 5 6 7\n\n secondVector =\n Vector3d.meters 1 1 1\n\n firstVector |> Vector3d.minus secondVector\n --> Vector3d.meters 4 5 6\n\nNote the argument order: `v1 - v2` would be written as\n\n v1 |> Vector3d.minus v2\n\nwhich is the same as\n\n Vector3d.minus v2 v1\n\nbut the _opposite_ of\n\n Vector3d.minus v1 v2\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"mirrorAcross","comment":" Mirror a vector across a plane.\n\n vector =\n Vector3d.meters 1 2 3\n\n Vector3d.mirrorAcross Plane3d.xy vector\n --> Vector3d.meters 1 2 -3\n\n Vector3d.mirrorAcross Plane3d.yz vector\n --> Vector3d.meters -1 2 3\n\n","type":"Geometry.Types.Plane3d units coordinates -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"newtons","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Force.Newtons coordinates"},{"name":"normalize","comment":" Normalize a vector to have a length of one. Zero vectors are left as-is.\n\n vector =\n Vector3d.meters 3 0 4\n\n Vector3d.normalize vector\n --> Vector3d.meters 0.6 0 0.8\n\n Vector3d.normalize Vector3d.zero\n --> Vector3d.zero\n\n**Warning**: `Vector3d.direction` is safer since it forces you to explicitly\nconsider the case where the given vector is zero. `Vector3d.normalize` is\nprimarily useful for cases like generating WebGL meshes, where defaulting to a\nzero vector for degenerate cases is acceptable, and the overhead of something\nlike\n\n Vector3d.direction vector\n |> Maybe.map Direction3d.toVector\n |> Maybe.withDefault Vector3d.zero\n\n(which is functionally equivalent to `Vector3d.normalize vector`) is too high.\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d Quantity.Unitless coordinates"},{"name":"on","comment":" Construct a 3D vector lying _on_ a sketch plane by providing a 2D vector\nspecified in XY coordinates _within_ the sketch plane.\n\n vector2d =\n Vector2d.meters 2 3\n\n Vector3d.on SketchPlane3d.xy vector2d\n --> Vector3d.meters 2 3 0\n\n Vector3d.on SketchPlane3d.yz vector2d\n --> Vector3d.meters 0 2 3\n\n Vector3d.on SketchPlane3d.zx vector2d\n --> Vector3d.meters 3 0 2\n\nA slightly more complex example:\n\n tiltedSketchPlane =\n SketchPlane3d.xy\n |> SketchPlane3d.rotateAround Axis3d.x\n (Angle.degrees 45)\n\n Vector3d.on tiltedSketchPlane <|\n Vector2d.meters 1 1\n --> Vector3d.meters 1 0.7071 0.7071\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Vector2d.Vector2d units coordinates2d -> Vector3d.Vector3d units coordinates3d"},{"name":"over","comment":" Divide a vector with units `Product units1 units2` by a scalar with units\n`units1`, resulting in a vector with units `units2`.\n\n accelerationVector =\n forceVector |> Vector3d.over mass\n\n","type":"Quantity.Quantity Basics.Float units1 -> Vector3d.Vector3d (Quantity.Product units1 units2) coordinates -> Vector3d.Vector3d units2 coordinates"},{"name":"over_","comment":" Divide a vector with units `Product units1 units2` by a scalar with units\n`units2`, resulting in a vector with units `units1`. Provided for consistency\nwith `elm-units` but shouldn't be needed in most cases.\n","type":"Quantity.Quantity Basics.Float units2 -> Vector3d.Vector3d (Quantity.Product units1 units2) coordinates -> Vector3d.Vector3d units1 coordinates"},{"name":"per","comment":" Construct a vector representing a rate of change such as a speed:\n\n displacement =\n Vector3d.meters 6 8 4\n\n displacement |> Vector3d.per (Duration.seconds 2)\n --> Vector3d.xyz\n --> (Speed.metersPerSecond 3)\n --> (Speed.metersPerSecond 4)\n --> (Speed.metersPerSecond 2)\n\n","type":"Quantity.Quantity Basics.Float independentUnits -> Vector3d.Vector3d dependentUnits coordinates -> Vector3d.Vector3d (Quantity.Rate dependentUnits independentUnits) coordinates"},{"name":"perpendicularTo","comment":" Construct an arbitrary vector perpendicular to the given vector. The exact\nlength and direction of the resulting vector are not specified, but it is\nguaranteed to be perpendicular to the given vector and non-zero (unless the\ngiven vector is itself zero).\n\n Vector3d.perpendicularTo (Vector3d.meters 3 0 0)\n --> Vector3d.meters 0 0 -3\n\n Vector3d.perpendicularTo (Vector3d.meters 1 2 3)\n --> Vector3d.meters 0 -3 2\n\n Vector3d.perpendicularTo Vector3d.zero\n --> Vector3d.zero\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"pixels","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Pixels.Pixels coordinates"},{"name":"placeIn","comment":" Take a vector defined in local coordinates relative to a given reference\nframe, and return that vector expressed in global coordinates.\n\n vector =\n Vector3d.meters 2 0 3\n\n Vector3d.placeIn rotatedFrame vector\n --> Vector3d.meters 1.732 1 3\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Vector3d.Vector3d units localCoordinates -> Vector3d.Vector3d units globalCoordinates"},{"name":"plus","comment":" Find the sum of two vectors.\n\n firstVector =\n Vector3d.meters 1 2 3\n\n secondVector =\n Vector3d.meters 4 5 6\n\n firstVector |> Vector3d.plus secondVector\n --> Vector3d.meters 5 7 9\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"pounds","comment":" ","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Force.Newtons coordinates"},{"name":"product","comment":" Multiply a scalar and a vector, resulting in a vector with units `Product\nscalarUnits vectorUnits`:\n\n forceVector =\n Vector3d.product mass accelerationVector\n\nIf you just want to scale a vector by a certain amount, you can use\n[`scaleBy`](#scaleBy) instead.\n\n","type":"Quantity.Quantity Basics.Float scalarUnits -> Vector3d.Vector3d vectorUnits coordinates -> Vector3d.Vector3d (Quantity.Product scalarUnits vectorUnits) coordinates"},{"name":"projectInto","comment":" Project a vector into a given sketch plane. Conceptually, this finds the\n[orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection)\nof the vector onto the plane and then expresses the projected vector in 2D\nsketch coordinates.\n\n vector =\n Vector3d.meters 2 1 3\n\n Vector3d.projectInto SketchPlane3d.xy vector\n --> Vector2d.meters 2 1\n\n Vector3d.projectInto SketchPlane3d.yz vector\n --> Vector2d.meters 1 3\n\n Vector3d.projectInto SketchPlane3d.zx vector\n --> Vector2d.meters 3 2\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Vector3d.Vector3d units coordinates3d -> Vector2d.Vector2d units coordinates2d"},{"name":"projectOnto","comment":" Project a vector [orthographically](https://en.wikipedia.org/wiki/Orthographic_projection)\nonto a plane. Conceptually, this means splitting the original vector into a\nportion parallel to the plane (perpendicular to the plane's normal direction)\nand a portion perpendicular to it (parallel to its normal direction), then\nreturning the parallel (in-plane) portion.\n\n vector =\n Vector3d.meters 2 1 3\n\n Vector3d.projectOnto Plane3d.xy vector\n --> Vector3d.meters 2 1 0\n\n Vector3d.projectOnto Plane3d.xz vector\n --> Vector3d.meters 2 0 3\n\n","type":"Geometry.Types.Plane3d units coordinates -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"projectionIn","comment":" Find the projection of a vector in a particular direction. Conceptually,\nthis means splitting the original vector into a portion parallel to the given\ndirection and a portion perpendicular to it, then returning the parallel\nportion.\n\n vector =\n Vector3d.meters 1 2 3\n\n Vector3d.projectionIn Direction3d.x vector\n --> Vector3d.meters 1 0 0\n\n Vector3d.projectionIn Direction3d.z vector\n --> Vector3d.meters 0 0 3\n\n","type":"Geometry.Types.Direction3d coordinates -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"rThetaOn","comment":" Construct a 3D vector lying on a sketch plane by providing its 2D polar\ncomponents within the sketch plane:\n\n Vector3d.rThetaOn SketchPlane3d.xy\n (Length.meters 2)\n (Angle.degrees 45)\n --> Vector3d.meters 1.4142 1.4142 0\n\n Vector3d.rThetaOn SketchPlane3d.yz\n (Length.meters 2)\n (Angle.degrees 30)\n --> Vector3d.meters 0 1.732 1\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Quantity.Quantity Basics.Float units -> Angle.Angle -> Vector3d.Vector3d units coordinates3d"},{"name":"relativeTo","comment":" Take a vector defined in global coordinates, and return it expressed in\nlocal coordinates relative to a given reference frame.\n\n vector =\n Vector3d.meters 2 0 3\n\n Vector3d.relativeTo rotatedFrame vector\n --> Vector3d.meters 1.732 -1 3\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Vector3d.Vector3d units globalCoordinates -> Vector3d.Vector3d units localCoordinates"},{"name":"reverse","comment":" Reverse the direction of a vector, negating its components.\n\n Vector3d.reverse (Vector3d.meters 1 -3 2)\n --> Vector3d.meters -1 3 -2\n\n(This could have been called `negate`, but `reverse` is more consistent with\nthe naming used in other modules.)\n\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"rotateAround","comment":" Rotate a vector around a given axis by a given angle.\n\n vector =\n Vector3d.meters 2 0 1\n\n vector\n |> Vector3d.rotateAround Axis3d.x\n (Angle.degrees 90)\n --> Vector3d.meters 2 -1 0\n\n vector\n |> Vector3d.rotateAround Axis3d.z\n (Angle.degrees 45)\n --> Vector3d.meters 1.4142 1.4142 1\n\n","type":"Geometry.Types.Axis3d units coordinates -> Angle.Angle -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"scaleBy","comment":" Scale the length of a vector by a given scale.\n\n Vector3d.scaleBy 3 (Vector3d.meters 1 2 3)\n --> Vector3d.meters 3 6 9\n\n(This could have been called `multiply` or `times`, but `scaleBy` was chosen as\na more geometrically meaningful name and to be consistent with the `scaleAbout`\nname used in other modules.)\n\n","type":"Basics.Float -> Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"scaleTo","comment":" Scale a vector to a given length.\n\n Vector3d.scaleTo (Length.meters 25) (Vector3d.meters 0 3 4)\n --> Vector3d.meters 0 15 20\n\nScaling a zero vector will always result in a zero vector.\n\n","type":"Quantity.Quantity Basics.Float units2 -> Vector3d.Vector3d units1 coordinates -> Vector3d.Vector3d units2 coordinates"},{"name":"sum","comment":" Find the sum of a list of vectors.\n","type":"List.List (Vector3d.Vector3d units coordinates) -> Vector3d.Vector3d units coordinates"},{"name":"times","comment":" Multiply a vector by a scalar, resulting in a vector with units `Product\nvectorUnits scalarUnits`. (To the compiler `Product a b` and `Product b a`\nare different unit types, so sometimes you will have to swap from `product` to\n`times` or vice versa to make the types work out.)\n","type":"Quantity.Quantity Basics.Float scalarUnits -> Vector3d.Vector3d vectorUnits coordinates -> Vector3d.Vector3d (Quantity.Product vectorUnits scalarUnits) coordinates"},{"name":"toMeters","comment":" ","type":"Vector3d.Vector3d Length.Meters coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toPixels","comment":" ","type":"Vector3d.Vector3d Pixels.Pixels coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toRecord","comment":" Convert a `Vector3d` to a record with `Float` fields, by specifying what units you want the\nresult to be in.\n\n vector =\n Vector3d.meters 2 3 1\n\n Vector3d.toRecord Length.inCentimeters vector\n --> { x = 200, y = 300, z = 100 }\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Vector3d.Vector3d units coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"toTuple","comment":" Convert a `Vector3d` to a tuple of `Float` values, by specifying what units you want the result\nto be in.\n\n vector =\n Vector3d.feet 2 3 1\n\n Vector3d.toTuple Length.inInches vector\n --> ( 24, 36, 12 )\n\n","type":"(Quantity.Quantity Basics.Float units -> Basics.Float) -> Vector3d.Vector3d units coordinates -> ( Basics.Float, Basics.Float, Basics.Float )"},{"name":"toUnitless","comment":" ","type":"Vector3d.Vector3d Quantity.Unitless coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"twice","comment":" Shorthand for `Vector3d.scaleBy 2`.\n","type":"Vector3d.Vector3d units coordinates -> Vector3d.Vector3d units coordinates"},{"name":"unitless","comment":" Construct a unitless `Vector3d` value from its X, Y and Z components. See\nalso [`fromUnitless`](#fromUnitless).\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Vector3d.Vector3d Quantity.Unitless coordinates"},{"name":"unsafe","comment":" Construct a vector from its raw X, Y and Z components as `Float` values. The\nvalues must be in whatever units the resulting vector is considered to use\n(usually meters or pixels). You should generally use something safer such as\n[`meters`](#meters), [`fromPixels`](#fromPixels), [`xyz`](#xyz),\n[`fromRecord`](#fromRecord) etc.\n","type":"{ x : Basics.Float, y : Basics.Float, z : Basics.Float } -> Vector3d.Vector3d units coordinates"},{"name":"unwrap","comment":" Extract a vector's raw X, Y and Z coordinates as `Float` values. These\nvalues will be in whatever units the vector has (usually meters or pixels). You\nshould generally use something safer such as [`toMeters`](#toMeters),\n[`toRecord`](#toRecord), [`xComponent`](#xComponent) etc.\n","type":"Vector3d.Vector3d units coordinates -> { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"withLength","comment":" Construct a vector with the given length in the given direction.\n\n Vector3d.withLength (Length.meters 5) Direction3d.y\n --> Vector3d.meters 0 5 0\n\n","type":"Quantity.Quantity Basics.Float units -> Geometry.Types.Direction3d coordinates -> Vector3d.Vector3d units coordinates"},{"name":"xComponent","comment":" Get the X component of a vector.\n\n Vector3d.xComponent (Vector3d.meters 1 2 3)\n --> Length.meters 1\n\n","type":"Vector3d.Vector3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"xyOn","comment":" Construct a 3D vector lying on a sketch plane by providing its 2D components\nwithin the sketch plane:\n\n Vector3d.xyOn SketchPlane3d.xy\n (Length.meters 2)\n (Length.meters 3)\n --> Vector3d.meters 2 3 0\n\n Vector3d.xyOn SketchPlane3d.zx\n (Length.meters 2)\n (Length.meters 3)\n --> Vector3d.meters 3 0 2\n\n","type":"Geometry.Types.SketchPlane3d units coordinates3d { defines : coordinates2d } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Vector3d.Vector3d units coordinates3d"},{"name":"xyz","comment":" Construct a vector from its X, Y and Z components.\n\n vector =\n Vector3d.xyz\n (Length.meters 2)\n (Length.meters 1)\n (Length.meters 3)\n\n","type":"Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Vector3d.Vector3d units coordinates"},{"name":"xyzIn","comment":" Construct a vector given its local components within a particular frame:\n\n frame =\n Frame3d.atOrigin\n |> Frame3d.rotateAround Axis3d.z\n (Angle.degrees 45)\n\n Vector3d.xyzIn frame\n (Speed.feetPerSecond 1)\n (Speed.feetPerSecond 0)\n (Speed.feetPerSecond 2)\n --> Vector3d.xyz\n --> (Speed.feetPerSecond 0.7071)\n --> (Speed.feetPerSecond 0.7071)\n --> (Speed.feetPerSecond 2)\n\n","type":"Geometry.Types.Frame3d units globalCoordinates { defines : localCoordinates } -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Quantity.Quantity Basics.Float units -> Vector3d.Vector3d units globalCoordinates"},{"name":"yComponent","comment":" Get the Y component of a vector.\n\n Vector3d.yComponent (Vector3d.meters 1 2 3)\n --> Length.meters 2\n\n","type":"Vector3d.Vector3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"zComponent","comment":" Get the Z component of a vector.\n\n Vector3d.zComponent (Vector3d.meters 1 2 3)\n --> Length.meters 3\n\n","type":"Vector3d.Vector3d units coordinates -> Quantity.Quantity Basics.Float units"},{"name":"zero","comment":" The vector with components (0,0,0).\n","type":"Vector3d.Vector3d units coordinates"}],"binops":[]},{"name":"VoronoiDiagram2d","comment":" For any given set of distinct (non-equal) points in 2D, there is a finite\nregion around each point such that anywhere in the region is closer to that\npoint than to any other point. These are the called the Voronoi regions of each\npoint, and the collection of the Voronoi regions for a set of points is called\nthe [Voronoi diagram](https://en.wikipedia.org/wiki/Voronoi_diagram) of those\npoints.\n\n![Voronoi diagram](https://ianmackenzie.github.io/elm-geometry/1.2.0/VoronoiDiagram2d/VoronoiDiagram.png)\n\nAlthough some Voronoi regions will be infinite in size, if they are all clipped\nto a particular bounding box then they will all be finite, convex polygons. This\nmodule therefore provides functionality for:\n\n - Building Voronoi diagrams from sets of points or arbitrary vertices (so\n you can associate colors, IDs or other data with points)\n - Adding new points/vertices to an existing Voronoi diagram\n - Clipping a Voronoi diagram to a particular bounding box to get a list of\n polygons with their associated points/vertices\n\nThe returned polygons can then be used in various interesting ways:\n\n - Use to do interesting geographical analyses (for example, what are the areas\n covered by different fire stations?)\n - Use as an invisible hover target in SVG to highlight corresponding points:\n highlighting a given point when the mouse is over its Voronoi polygon is one\n way to highlight the point nearest the mouse\n\nThe current implementation is somewhat inefficient, but there are plans to speed\nit up in the future (without requiring any changes to the API).\n\n@docs VoronoiDiagram2d, Error\n\n\n# Construction\n\nConstructing a Voronoi diagram from points/vertices is currently an O(n^2)\noperation but should be O(n log n) in the future.\n\n@docs empty\n\n@docs fromPoints, fromVerticesBy\n\n\n# Modification\n\nInserting a point into a Voronoi diagram is currently an O(n) operation but\nshould be O(log n) in the future.\n\n@docs insertPoint, insertVertexBy\n\n\n# Properties\n\n@docs vertices, polygons\n\n\n# Conversion\n\nA Voronoi diagram of a set or vertices is [the dual](https://en.wikipedia.org/wiki/Delaunay_triangulation#Relationship_with_the_Voronoi_diagram)\nof the Delaunay triangulation of those vertices. As a result, it is possible to\nconvert back and forth between the two.\n\n@docs fromDelaunayTriangulation, toDelaunayTriangulation\n\n","unions":[{"name":"Error","comment":" An error type indicating that the two given vertices have the same position.\n","args":["vertex"],"cases":[["CoincidentVertices",["vertex","vertex"]]]},{"name":"VoronoiDiagram2d","comment":" A 2D Voronoi diagram of a set of vertices.\n","args":["vertex","units","coordinates"],"cases":[]}],"aliases":[],"values":[{"name":"empty","comment":" An empty Voronoi diagram with no vertices or faces.\n","type":"VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates"},{"name":"fromDelaunayTriangulation","comment":" Construct a Voronoi diagram from a Delaunay triangulation. Complexity should\nbe O(n) in the vast majority of cases but may be O(n log n) in pathological\ncases.\n","type":"DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates -> VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates"},{"name":"fromPoints","comment":" Construct a Voronoi diagram from an array of points. The points must all be\ndistinct; if any two points are equal, you will get an `Err CoincidentVertices`.\n","type":"Array.Array (Point2d.Point2d units coordinates) -> Result.Result (VoronoiDiagram2d.Error (Point2d.Point2d units coordinates)) (VoronoiDiagram2d.VoronoiDiagram2d (Point2d.Point2d units coordinates) units coordinates)"},{"name":"fromVerticesBy","comment":" Construct a Voronoi diagram from an array of vertices of arbitrary type, by\nsupplying a function that returns the position of each vertex as a `Point2d`.\nFor example, if you had\n\n types alias Vertex =\n { position = Point2d Meters WorldCoordinates\n , color = String\n }\n\nand\n\n vertices : Array Vertex\n vertices =\n ...\n\nthen you would use\n\n VoronoiDiagram2d.fromVerticesBy .position vertices\n\nThe vertices must all be distinct; if any two have the same position, you will\nget an `Err CoincidentVertices`.\n\n","type":"(vertex -> Point2d.Point2d units coordinates) -> Array.Array vertex -> Result.Result (VoronoiDiagram2d.Error vertex) (VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates)"},{"name":"insertPoint","comment":" Add a new point into an existing Voronoi diagram. It must not be equal to\nany existing point; if it is, you will get an `Err CoincidentVertices`.\n","type":"Point2d.Point2d units coordinates -> VoronoiDiagram2d.VoronoiDiagram2d (Point2d.Point2d units coordinates) units coordinates -> Result.Result (VoronoiDiagram2d.Error (Point2d.Point2d units coordinates)) (VoronoiDiagram2d.VoronoiDiagram2d (Point2d.Point2d units coordinates) units coordinates)"},{"name":"insertVertexBy","comment":" Add a new vertex into an existing Voronoi diagram, by supplying a function\nto get the position of the vertex. The vertex must not have the same position as\nany existing vertex; if it is, you will get an `Err CoincidentVertices`.\n","type":"(vertex -> Point2d.Point2d units coordinates) -> vertex -> VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates -> Result.Result (VoronoiDiagram2d.Error vertex) (VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates)"},{"name":"polygons","comment":" Convert a Voronoi diagram to a list of polygons, by clipping each (possibly\ninfinite/unbounded) Voronoi region to the given bounding box. Each item in the\nreturned list will be an input vertex with its corresponding (clipped) Voronoi\nregion.\n\nIf the bounding box contains all vertices, then there will be an entry in the\nlist for every vertex. However, if some vertices fall outside the given\nbounding box, then it is possible that their Voronoi region is also entirely\noutside the bounding box, in which case they will have no entry in the\nreturned list.\n\nComplexity should be O(n) in the vast majority of cases but may be O(n log n)\nin pathological cases (such as 1000 points on a circle surrounding a single\ncenter point, in which case the Voronoi region for the center point will be\na polygon with 1000 edges).\n\n","type":"BoundingBox2d.BoundingBox2d units coordinates -> VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates -> List.List ( vertex, Polygon2d.Polygon2d units coordinates )"},{"name":"toDelaunayTriangulation","comment":" Convert a Voronoi diagram to a Delaunay triangulation. This is a simple\naccessor, so complexity is O(1).\n","type":"VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates -> DelaunayTriangulation2d.DelaunayTriangulation2d vertex units coordinates"},{"name":"vertices","comment":" Get the vertices of a Voronoi diagram. If the diagram was constructed by\ncalling `fromPoints` or `fromVerticesBy`, then the returned vertex array will\nsimply be the array that was passed in. If any vertices were added using\n`insertPoint` or `insertVertexBy`, then they will be appended to the end of the\narray. This is a simple accessor, so complexity is O(1).\n","type":"VoronoiDiagram2d.VoronoiDiagram2d vertex units coordinates -> Array.Array vertex"}],"binops":[]}]