ianmackenzie / elm-geometry / Circle2d

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


type alias Circle2d units coordinates =
Geometry.Types.Circle2d units coordinates

Constructors

atPoint : Point2d units coordinates -> Quantity Basics.Float units -> Circle2d units coordinates

Construct a circle from its radius and center point:

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

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

withRadius : Quantity Basics.Float units -> Point2d units coordinates -> Circle2d units coordinates

Construct a circle from its radius and center point. Flipped version of atPoint that may be more useful in some situations like constructing a bunch of circles of the same radius at different points:

circles =
    List.map (Circle2d.withRadius radius) listOfPoints

atOrigin : Quantity Basics.Float units -> Circle2d units coordinates

Construct a circle at the origin with the given radius.

throughPoints : 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:

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

If the three given points are collinear, returns Nothing:

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

sweptAround : 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.atOrigin (Length.meters 2)

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 a specific point but passing through several other different points, you could use something like

concentricCircles =
    List.map (Circle2d.sweptAround centerPoint) points

Properties

centerPoint : Circle2d units coordinates -> Point2d units coordinates

Get the center point of a circle.

radius : Circle2d units coordinates -> Quantity Basics.Float units

Get the radius of a circle.

diameter : Circle2d units coordinates -> Quantity Basics.Float units

Get the diameter of a circle (twice the radius).

area : Circle2d units coordinates -> Quantity Basics.Float (Quantity.Squared units)

Get the area of a circle.

circumference : Circle2d units coordinates -> Quantity Basics.Float units

Get the circumference (perimeter) of a circle.

boundingBox : Circle2d units coordinates -> BoundingBox2d units coordinates

Get the minimal bounding box containing a given circle.

Circle2d.boundingBox exampleCircle
--> BoundingBox2d.from
-->     (Point2d.meters -2 -1)
-->     (Point2d.meters 4 5)

Conversion

toArc : Circle2d units coordinates -> Geometry.Types.Arc2d units coordinates

Convert a circle to a 360 degree arc.

Queries

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

Check if a circle contains a given point.

intersectsBoundingBox : BoundingBox2d units coordinates -> Circle2d units coordinates -> Basics.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.from
        (Point2d.meters 2 0)
        (Point2d.meters 3 2)

circle =
    Circle2d.atOrigin (Length.meters 3)

Circle2d.intersectsBoundingBox boundingBox circle
--> True

Transformations

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

scaleAbout : Point2d units coordinates -> Basics.Float -> Circle2d units coordinates -> Circle2d units coordinates

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

rotateAround : Point2d units coordinates -> Angle -> Circle2d units coordinates -> Circle2d units coordinates

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

translateBy : Vector2d units coordinates -> Circle2d units coordinates -> Circle2d units coordinates

Translate a circle by a given displacement.

translateIn : Direction2d coordinates -> Quantity Basics.Float units -> Circle2d units coordinates -> Circle2d units coordinates

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

mirrorAcross : Axis2d units coordinates -> Circle2d units coordinates -> Circle2d units coordinates

Mirror a circle across a given axis.

Unit conversions

at : Quantity Basics.Float (Quantity.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 Basics.Float (Quantity.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.

Coordinate conversions

relativeTo : 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.

placeIn : 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.