opensolid/geometry/1.0.3

NOTE: this package is not compatible with Elm 0.19.1

OpenSolid.Triangle3d

Triangle3d

A Triangle3d represents a triangle in 3D space, and is defined by its three vertices. This module contains triangle-related functionality such as:

  • Finding the area and centroid of triangles
  • Scaling, rotating, translating, mirroring and projecting triangles
  • Converting triangles between different coordinate systems

Triangles can be constructed by passing a tuple of vertices to the Triangle3d constructor, for example

exampleTriangle =
    Triangle3d
        ( Point3d ( 1, 0, 0 )
        , Point3d ( 2, 0, 0 )
        , Point3d ( 2, 1, 3 )
        )

Accessors

vertices : Triangle3d -> ( Point3d, Point3d, Point3d )

Get the vertices of a triangle.

( p1, p2, p3 ) =
    Triangle3d.vertices exampleTriangle
--> p1 = Point3d ( 1, 0, 0 )
--> p2 = Point3d ( 2, 0, 0 )
--> p3 = Point3d ( 2, 1, 3 )
edges : Triangle3d -> ( LineSegment3d, LineSegment3d, LineSegment3d )

Get the edges of a triangle: from the first vertex to the second, from the second to the third, and from the third back to the first.

( e1, e2, e3 ) =
    Triangle3d.edges exampleTriangle
--> e1 = LineSegment3d ( Point3d ( 1, 0, 0 ), Point3d ( 2, 0, 0 ) )
--> e2 = LineSegment3d ( Point3d ( 2, 0, 0 ), Point3d ( 2, 1, 3 ) )
--> e3 = LineSegment3d ( Point3d ( 2, 1, 3 ), Point3d ( 1, 0, 0 ) )

Basics

centroid : Triangle3d -> Point3d

Get the centroid (center of mass) of a triangle.

Triangle3d.centroid exampleTriangle
--> Point3d ( 1.6667, 0.6667, 1 )
area : Triangle3d -> Float

Get the area of a triangle. This value is always positive.

Triangle3d.area exampleTriangle
--> 1.5811

Transformations

Transforming a triangle is equivalent to transforming its vertices.

scaleAbout : Point3d -> Float -> Triangle3d -> Triangle3d

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

Triangle3d.scaleAbout Point3d.origin 2 exampleTriangle
--> Triangle3d
-->     ( Point3d ( 2, 0, 0 )
-->     , Point3d ( 4, 0, 0 )
-->     , Point3d ( 4, 2, 6 )
-->     )
rotateAround : Axis3d -> Float -> Triangle3d -> Triangle3d

Rotate a triangle around a given axis by a given angle (in radians).

Triangle3d.rotateAround Axis3d.z (degrees 90) exampleTriangle
--> Triangle3d
-->     ( Point3d ( 0, 1, 0 )
-->     , Point3d ( 0, 2, 0 )
-->     , Point3d ( -1, 2, 3 )
-->     )
translateBy : Vector3d -> Triangle3d -> Triangle3d

Translate a triangle by a given displacement.

displacement =
    Vector3d ( 2, -1, 3 )


Triangle3d.translateBy displacement exampleTriangle
--> Triangle3d
-->     ( Point3d ( 3, -1, 3 )
-->     , Point3d ( 4, -1, 3 )
-->     , Point3d ( 4, 0, 6 )
-->     )
mirrorAcross : Plane3d -> Triangle3d -> Triangle3d

Mirror a triangle across a given plane.

Triangle3d.mirrorAcross Plane3d.yz exampleTriangle
--> Triangle3d
-->     ( Point3d ( -1, 0, 0 )
-->     ( Point3d ( -2, 0, 0 )
-->     ( Point3d ( -2, 1, 3 )
-->     )
projectOnto : Plane3d -> Triangle3d -> Triangle3d

Project a triangle onto a given plane.

Triangle3d.projectOnto Plane3d.xy exampleTriangle
--> Triangle3d
-->     ( Point3d ( 1, 0, 0 )
-->     , Point3d ( 2, 0, 0 )
-->     , Point3d ( 2, 1, 0 )
-->     )


Triangle3d.projectOnto Plane3d.xz exampleTriangle
--> Triangle3d
-->     ( Point3d ( 1, 0, 0 )
-->     , Point3d ( 2, 0, 0 )
-->     , Point3d ( 2, 0, 3 )
-->     )
map : (Point3d -> Point3d) -> Triangle3d -> Triangle3d

Transform each vertex of a triangle by a given function and create a new triangle from the resulting points. Most other transformation functions can be defined in terms of map; for example,

Triangle.projectOnto Plane3d.xz triangle

is equivalent to

Triangle.map (Point3d.projectOnto Plane3d.xz) triangle

Coordinate frames

Functions for transforming triangles between local and global coordinates in different coordinate frames.

relativeTo : Frame3d -> Triangle3d -> Triangle3d

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

localFrame =
    Frame3d.at (Point3d ( 2, 1, 3 ))


Triangle3d.relativeTo localFrame exampleTriangle
--> Triangle3d
-->     ( Point3d ( -1, -1, -3 )
-->     , Point3d ( 0, -1, -3 )
-->     , Point3d ( 0, 0, 0 )
-->     )
placeIn : Frame3d -> Triangle3d -> Triangle3d

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

localFrame =
    Frame3d.at (Point3d ( 2, 1, 3 ))


Triangle3d.placeIn localFrame exampleTriangle
--> Triangle3d
-->     ( Point3d ( 3, 1, 3 )
-->     , Point3d ( 4, 1, 3 )
-->     , Point3d ( 4, 2, 6 )
-->     )

Sketch planes

projectInto : SketchPlane3d -> Triangle3d -> Triangle2d

Project a triangle into a given sketch plane. Conceptually, this projects the triangle onto the plane and then expresses the projected triangle in 2D sketch coordinates.

Triangle3d.projectInto SketchPlane3d.xy exampleTriangle
--> Triangle2d
-->     ( Point2d ( 1, 0 )
-->     , Point2d ( 2, 0 )
-->     , Point2d ( 2, 1 )
-->     )


Triangle3d.projectInto SketchPlane3d.zx exampleTriangle
--> Triangle2d
-->     ( Point2d ( 0, 1 )
-->     , Point2d ( 0, 2 )
-->     , Point2d ( 3, 2 )
-->     )

Bounds

boundingBox : Triangle3d -> BoundingBox3d

Get the minimal bounding box containing a given triangle.

Triangle3d.boundingBox exampleTriangle
--> BoundingBox3d
-->     { minX = 1
-->     , maxX = 2
-->     , minY = 0
-->     , maxY = 1
-->     , minZ = 0
-->     , maxZ = 3
-->     }