# Inner Product

## group dot

The symmetric inner product takes two arguments and contracts the lower graded element to the greater graded element. If lower graded element spans an index that is not contained in the higher graded element, the result is annihilated. Otherwise, the result is the part of the higher graded element "most unlike" the lower graded element. Thus, the symmetric inner product can be thought of as a bidirectional contraction operator.

There is some merit in providing both a left and right contraction operator for explicitness. However, when using Klein, it's generally clear what the interpretation of the symmetric inner product is with respect to the projection on various entities.

Angle between planes

    kln::plane a{x1, y1, z1, d1};
kln::plane b{x2, y2, z2, d2};

// Compute the cos of the angle between two planes
float cos_ang = a | b;


Line to plane through point

    kln::point a{x1, y1, z1};
kln::plane b{x2, y2, z2, d2};

// The line l contains a and the shortest path from a to plane b.
line l = a | b;


### Summary

Members Descriptions
public float operator\|(plane a,plane b) noexcept
public plane operator\|(plane a,line b) noexcept
public plane operator\|(line b,plane a) noexcept
public plane operator\|(plane a,ideal_line b) noexcept
public plane operator\|(ideal_line b,plane a) noexcept
public line operator\|(plane a,point b) noexcept
public line operator\|(point a,plane b) noexcept
public float operator\|(line a,line b) noexcept
public plane operator\|(point a,line b) noexcept
public plane operator\|(line b,point a) noexcept
public float operator\|(point a,point b) noexcept