ianmackenzie/elm-geometry/2.0.0

NOTE: the latest version is 4.0.0

Circle2d

A Circle2d is defined by its center point and radius. This module includes functionality for

  • Constructing circles through points or with a given center/radius
  • Scaling, rotating and translating circles
  • Extracting properties of circles like area, center point and radius
type alias Circle2d units coordinates =
Circle2d units coordinates

Constructors

Quantity Float units
-> Point2d units coordinates
-> Circle2d units coordinates

Construct a circle from its radius and center point:

exampleCircle =
    Circle2d.withRadius (Length.meters 3)
        (Point2d.meters 1 2)

If you pass a negative radius, the absolute value will be used.

Point2d units coordinates
-> Point2d units coordinates
-> Point2d units coordinates
-> Maybe (Circle2d units coordinates)

Attempt to construct a circle that passes through the three given points. If the three given points are collinear, returns Nothing.

Circle2d.throughPoints
    Point2d.origin
    (Point2d.meters 1 0)
    (Point2d.meters 0 1)
--> Just <|
-->     Circle2d.withRadius (Length.meters 0.7071)
-->         (Point2d.meters 0.5 0.5)


Circle2d.throughPoints
    Point2d.origin
    (Point2d.meters 2 1)
    (Point2d.meters 4 0)
--> Just <|
-->     Circle2d.withRadius (Length.meters 2.5)
-->         (Point2d.meters 2 -1.5)


Circle2d.throughPoints
    Point2d.origin
    (Point2d.meters 2 0)
    (Point2d.meters 4 0)
--> Nothing


Circle2d.throughPoints
    Point2d.origin
    Point2d.origin
    (Point2d.meters 1 0)
--> Nothing
Point2d units coordinates
-> Point2d units coordinates
-> Circle2d units coordinates

Construct a circle by rotating a point on the circle around a given center point. The center point is given first and the point on the circle is given second.

Circle2d.sweptAround Point2d.origin
    (Point2d.meters 2 0)
--> Circle2d.withRadius (Length.meters 2)
-->     Point2d.origin

The above example could be rewritten as

Point2d.meters 2 0
    |> Circle2d.sweptAround Point2d.origin

and if you wanted to create many concentric circles all centered on the origin but passing through several other different points, you could use something like

concentricCircles =
    points
        |> List.map
            (Circle2d.sweptAround Point2d.origin)

Properties

centerPoint : Circle2d units coordinates -> Point2d units coordinates

Get the center point of a circle.

Circle2d.centerPoint exampleCircle
--> Point2d.meters 1 2
radius : Circle2d units coordinates -> Quantity Float units

Get the radius of a circle.

Circle2d.radius exampleCircle
--> Length.meters 3
diameter : Circle2d units coordinates -> Quantity Float units

Get the diameter of a circle.

Circle2d.diameter exampleCircle
--> Length.meters 6
area : Circle2d units coordinates -> Quantity Float (Squared units)

Get the area of a circle.

Circle2d.area exampleCircle
--> Area.squareMeters 28.2743
circumference : Circle2d units coordinates -> Quantity Float units

Get the circumference of a circle.

Circle2d.circumference exampleCircle
--> Length.meters 18.8496
boundingBox : Circle2d units coordinates -> BoundingBox2d units coordinates

Get the minimal bounding box containing a given circle.

Circle2d.boundingBox exampleCircle
--> BoundingBox2d.fromExtrema
-->     { minX = Length.meters -2
-->     , maxX = Length.meters 4
-->     , minY = Length.meters -1
-->     , maxY = Length.meters 5
-->     }

Conversion

toArc : Circle2d units coordinates -> Arc2d units coordinates

Convert a circle to a 360 degree arc.

Circle2d.toArc exampleCircle
--> Point2d.meters 4 2
-->     |> Arc2d.sweptAround
-->         (Point2d.meters 1 2)
-->         (Angle.degrees 360)

Queries

contains : Point2d units coordinates -> Circle2d units coordinates -> Bool

Check if a circle contains a given point.

Circle2d.contains Point2d.origin exampleCircle
--> True


exampleCircle
    |> Circle2d.contains
        (Point2d.meters 10 10)
--> False
BoundingBox2d units coordinates
-> Circle2d units coordinates
-> Bool

Check if a circle intersects with a given bounding box. This function will return true if the circle intersects the edges of the bounding box or is fully contained within the bounding box.

boundingBox =
    BoundingBox2d.fromExtrema
        { minX = Length.meters 2
        , maxX = Length.meters 3
        , minY = Length.meters 0
        , maxY = Length.meters 2
        }


circle =
    Circle2d.withRadius (Length.meters 3)
        Point2d.origin


Circle2d.intersectsBoundingBox boundingBox circle
--> True

Unit conversions

at :
Quantity Float (Rate units2 units1)
-> Circle2d units1 coordinates
-> Circle2d units2 coordinates

Convert a circle from one units type to another, by providing a conversion factor given as a rate of change of destination units with respect to source units.

at_ :
Quantity Float (Rate units1 units2)
-> Circle2d units1 coordinates
-> Circle2d units2 coordinates

Convert a circle from one units type to another, by providing an 'inverse' conversion factor given as a rate of change of source units with respect to destination units.

Transformations

These transformations generally behave just like the ones in the Point2d module.

Point2d units coordinates
-> Float
-> Circle2d units coordinates
-> Circle2d units coordinates

Scale a circle about a given point by a given scale.

Point2d units coordinates
-> Angle
-> Circle2d units coordinates
-> Circle2d units coordinates

Rotate a circle around a given point by a given angle.

Vector2d units coordinates
-> Circle2d units coordinates
-> Circle2d units coordinates

Translate a circle by a given displacement.

Direction2d coordinates
-> Quantity Float units
-> Circle2d units coordinates
-> Circle2d units coordinates

Translate a circle in a given direction by a given distance.

Axis2d units coordinates
-> Circle2d units coordinates
-> Circle2d units coordinates

Mirror a circle across a given axis.

Coordinate conversions

Frame2d units globalCoordinates { defines : localCoordinates }
-> Circle2d units globalCoordinates
-> Circle2d units localCoordinates

Take a circle defined in global coordinates, and return it expressed in local coordinates relative to a given reference frame.

Frame2d units globalCoordinates { defines : localCoordinates }
-> Circle2d units localCoordinates
-> Circle2d units globalCoordinates

Take a circle considered to be defined in local coordinates relative to a given reference frame, and return that circle expressed in global coordinates.