Point2D foot(Point2D p, Point2D orig, Vector2D dire) { return orig - dire.norm2() * (1.0 / inner(p - orig, dire)) * dire; }
// $\NormSquare{\OuterV {V_1}{V_2}}$ Vector2D outer_norm2(Vector2D v1, Vector2D v2) { return v1.norm2() * v2.norm2() - inner(v1, v2).norm2(); }