Plane class

# TODO

- [ ] test coverage
I suggest having these three lines at the start:

    if not isinstance(l, (Line, Line3D, Ray, Ray3D, Segment, Segment3D)):
        return None # or raise an error if that makes more sense.
    a, b = self.projection(l.p1), self.projection(l.p2)
    # Then the rest...

By the way, each of your if statements can be shortened to use the tuple input like in my code example here.