docs: public static Point crossPoint(Line l1, Line l2, AbstractPoint p)
      {
          if (Double.isInfinite(l1.getSlope()))
          {
              if (Double.isInfinite(l2.getSlope()))
              {
                  return null;
              }
              else
              {
                  return cyclePoint(p, l1.getA(), l2.getY(l1.getA()));
              }
          }
          if (Double.isInfinite(l2.getSlope()))
          {
              return cyclePoint(p, l2.getA(), l1.getY(l2.getA()));
          }
          double x1 = 0;
          double y1 = l1.getY(x1);
          
          double x2 = 10;
          double y2 = l1.getY(x2);
          
          double x3 = 0;
          double y3 = l2.getY(x3);
          
          double x4 = 10;
          double y4 = l2.getY(x4);
          
          double dd = det(x1-x2, y1-y2, x3-x4, y3-y4);
          if (dd == 0)
          {
              return null;
          }
          double x1y1x2y2 = det(x1, y1, x2, y2);
          double x3y3x4y4 = det(x3, y3, x4, y4);
          double xu = det(x1y1x2y2, x1-x2, x3y3x4y4, x3-x4);
          double yu = det(x1y1x2y2, y1-y2, x3y3x4y4, y3-y4);
          return cyclePoint(p, xu/dd, yu/dd);
          
      }