public static Point getIntersection(Point p1, Point p2, Point p3, Point p4) {
        float a1 = p2.getY() - p1.getY();
        float a2 = p4.getY() - p3.getY();
        float b1 = p1.getX() - p2.getX();
        float b2 = p3.getX() - p4.getX();
        float det = a1 * b2 - a2 * b1;
        if (Math.abs(det) <= epsilon) return null;
        float c1 = p1.getY() * b1 + p1.getX() * a1;
        float c2 = p3.getY() * b2 + p3.getX() * a2;
        float det1 = c1 * b2 - c2 * b1;
        float det2 = a1 * c2 - a2 * c1;
        float x = det1 / det;
        float y = det2 / det;
        boolean inX12 = Math.min(p1.getX(), p2.getX()) <= x && x <= Math.max(p1.getX(), p2.getX());
        boolean inX34 = Math.min(p3.getX(), p4.getX()) <= x && x <= Math.max(p3.getX(), p4.getX());
        boolean inY12 = Math.min(p1.getY(), p2.getY()) <= y && y <= Math.max(p1.getY(), p2.getY());
        boolean inY34 = Math.min(p3.getY(), p4.getY()) <= y && y <= Math.max(p3.getY(), p4.getY());
        if (inX12 && inX34 && inY12 && inY34) return new Point(x, y);
        return null;
    }