# Plane

## group plane

In projective geometry, planes are the fundamental element through which all other entities are constructed. Lines are the meet of two planes, and points are the meet of three planes (equivalently, a line and a plane).

The plane multivector in PGA looks like $$d\mathbf{e}_0 + a\mathbf{e}_1 + b\mathbf{e}_2 + c\mathbf{e}_3$$. Points that reside on the plane satisfy the familiar equation $$d + ax + by + cz = 0$$.

### Summary

Members Descriptions
public plane() = default
public plane(__m128 xmm) noexcept
public plane(float a,float b,float c,float d) noexcept The constructor performs the rearrangement so the plane can be specified in the familiar form: ax + by + cz + d
public explicit plane(float * data) noexcept Data should point to four floats with memory layout (d, a, b, c) where d occupies the lowest address in memory.
public void load(float * data) noexcept Unaligned load of data. The data argument should point to 4 floats corresponding to the (d, a, b, c) components of the plane multivector where d occupies the lowest address in memory.
public void normalize() noexcept Normalize this plane $$p$$ such that $$p \cdot p = 1$$.
public plane normalized() const noexcept Return a normalized copy of this plane.
public float norm() const noexcept Compute the plane norm, which is often used to compute distances between points and lines.
public void invert() noexcept
public plane inverse() const noexcept
public bool KLN_VEC_CALL operator==(plane other) const noexcept
public bool KLN_VEC_CALL approx_eq(plane other,float epsilon) const noexcept
public plane KLN_VEC_CALL operator()(plane const & p) const noexcept Reflect another plane $$p_2$$ through this plane $$p_1$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p_1 p_2 p_1$$.
public line KLN_VEC_CALL operator()(line const & l) const noexcept Reflect line $$\ell$$ through this plane $$p$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p \ell p$$.
public point KLN_VEC_CALL operator()(point const & p) const noexcept Reflect the point $$P$$ through this plane $$p$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p P p$$.
public plane &KLN_VEC_CALL operator+=(plane b) noexcept Plane addition.
public plane &KLN_VEC_CALL operator-=(plane b) noexcept Plane subtraction.
public plane & operator*=(float s) noexcept Plane uniform scale.
public plane & operator*=(int s) noexcept Plane uniform scale.
public plane & operator/=(float s) noexcept Plane uniform inverse scale.
public plane & operator/=(int s) noexcept Plane uniform inverse scale.
public float x() const noexcept
public float e1() const noexcept
public float y() const noexcept
public float e2() const noexcept
public float z() const noexcept
public float e3() const noexcept
public float d() const noexcept
public float e0() const noexcept
public plane KLN_VEC_CALL operator+(plane a,plane b) noexcept Plane addition.
public plane KLN_VEC_CALL operator-(plane a,plane b) noexcept Plane subtraction.
public plane KLN_VEC_CALL operator*(plane p,float s) noexcept Plane uniform scale.
public plane KLN_VEC_CALL operator*(float s,plane p) noexcept Plane uniform scale.
public plane KLN_VEC_CALL operator*(plane p,int s) noexcept Plane uniform scale.
public plane KLN_VEC_CALL operator*(int s,plane p) noexcept Plane uniform scale.
public plane KLN_VEC_CALL operator/(plane p,float s) noexcept Plane uniform inverse scale.
public plane KLN_VEC_CALL operator/(plane p,int s) noexcept Plane uniform inverse scale.
public plane KLN_VEC_CALL operator-(plane p) noexcept Unary minus (leaves displacement from origin untouched, changing orientation only)

### Members

#### plane(float a,float b,float c,float d) noexcept

The constructor performs the rearrangement so the plane can be specified in the familiar form: ax + by + cz + d

#### explicit plane(float * data) noexcept

Data should point to four floats with memory layout (d, a, b, c) where d occupies the lowest address in memory.

#### void load(float * data) noexcept

Unaligned load of data. The data argument should point to 4 floats corresponding to the (d, a, b, c) components of the plane multivector where d occupies the lowest address in memory.

Tip

This is a faster mechanism for setting data compared to setting components one at a time.

#### void normalize() noexcept

Normalize this plane $$p$$ such that $$p \cdot p = 1$$.

In order to compute the cosine of the angle between planes via the inner product operator | , the planes must be normalized. Producing a normalized rotor between two planes with the geometric product * also requires that the planes are normalized.

#### plane normalized() const noexcept

Return a normalized copy of this plane.

#### float norm() const noexcept

Compute the plane norm, which is often used to compute distances between points and lines.

Given a normalized point $$P$$ and normalized line $$\ell$$, the plane $$P\vee\ell$$ containing both $$\ell$$ and $$P$$ will have a norm equivalent to the distance between $$P$$ and $$\ell$$.

#### plane KLN_VEC_CALL operator()(plane const & p) const noexcept

Reflect another plane $$p_2$$ through this plane $$p_1$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p_1 p_2 p_1$$.

#### line KLN_VEC_CALL operator()(line const & l) const noexcept

Reflect line $$\ell$$ through this plane $$p$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p \ell p$$.

#### point KLN_VEC_CALL operator()(point const & p) const noexcept

Reflect the point $$P$$ through this plane $$p$$. The operation performed via this call operator is an optimized routine equivalent to the expression $$p P p$$.

#### plane &KLN_VEC_CALL operator-=(plane b) noexcept

Plane subtraction.

#### plane & operator*=(float s) noexcept

Plane uniform scale.

#### plane & operator*=(int s) noexcept

Plane uniform scale.

#### plane & operator/=(float s) noexcept

Plane uniform inverse scale.

#### plane & operator/=(int s) noexcept

Plane uniform inverse scale.

#### plane KLN_VEC_CALL operator-(plane a,plane b) noexcept

Plane subtraction.

#### plane KLN_VEC_CALL operator*(plane p,float s) noexcept

Plane uniform scale.

#### plane KLN_VEC_CALL operator*(float s,plane p) noexcept

Plane uniform scale.

#### plane KLN_VEC_CALL operator*(plane p,int s) noexcept

Plane uniform scale.

#### plane KLN_VEC_CALL operator*(int s,plane p) noexcept

Plane uniform scale.

#### plane KLN_VEC_CALL operator/(plane p,float s) noexcept

Plane uniform inverse scale.

#### plane KLN_VEC_CALL operator/(plane p,int s) noexcept

Plane uniform inverse scale.

#### plane KLN_VEC_CALL operator-(plane p) noexcept

Unary minus (leaves displacement from origin untouched, changing orientation only)