// Path: src/main/java/com/github/davidmoten/rtree/geometry/Circle.java
// public interface Circle extends Geometry {
// 
//     double x();
// 
//     double y();
// 
//     double radius();
// 
//     boolean intersects(Circle c);
// 
//     boolean intersects(Point point);
// 
//     boolean intersects(Line line);
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Line.java
// public interface Line extends Geometry {
// 
//     double x1();
// 
//     double y1();
// 
//     double x2();
// 
//     double y2();
// 
//     boolean intersects(Line b);
// 
//     boolean intersects(Point point);
// 
//     boolean intersects(Circle circle);
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Point.java
// public interface Point extends Rectangle {
// 
//     double x();
// 
//     double y();
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Rectangle.java
// public interface Rectangle extends Geometry, HasGeometry {
// 
//     double x1();
// 
//     double y1();
// 
//     double x2();
// 
//     double y2();
// 
//     double area();
// 
//     double intersectionArea(Rectangle r);
// 
//     double perimeter();
// 
//     Rectangle add(Rectangle r);
// 
//     boolean contains(double x, double y);
//     
//     boolean isDoublePrecision();
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/internal/util/ObjectsHelper.java
// public final class ObjectsHelper {
// 
//     private ObjectsHelper() {
//         // prevent instantiation
//     }
// 
//     @VisibleForTesting
//     static void instantiateForTestCoveragePurposesOnly() {
//         new ObjectsHelper();
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <T> Optional<T> asClass(Object object, Class<T> cls) {
//         if (object == null) {
//             return Optional.empty();
//         } else if (object.getClass() != cls) {
//             return Optional.empty();
//         } else {
//             return Optional.of((T) object);
//         }
//     }
// 
// }


import com.github.davidmoten.rtree.geometry.Circle;
import com.github.davidmoten.rtree.geometry.Line;
import com.github.davidmoten.rtree.geometry.Point;
import com.github.davidmoten.rtree.geometry.Rectangle;
import com.github.davidmoten.rtree.internal.util.ObjectsHelper;
import java.util.Objects;
import java.util.Optional;
    public boolean intersects(Circle c) {
        double total = radius + c.radius();
        return GeometryUtil.distanceSquared(x, y, c.x(), c.y()) <= total * total;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y, radius);
    }

    @Override
    public boolean equals(Object obj) {
        Optional<CircleFloat> other = ObjectsHelper.asClass(obj, CircleFloat.class);
        if (other.isPresent()) {
            return Objects.equals(x, other.get().x) && Objects.equals(y, other.get().y)
                    && Objects.equals(radius, other.get().radius);
        } else
            return false;
    }

    @Override
    public boolean intersects(Point point) {
        return Math.sqrt(sqr(x - point.x()) + sqr(y - point.y())) <= radius;
    }

    private double sqr(double x) {
        return x * x;
    }

    @Override
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Circle.java
// public interface Circle extends Geometry {
// 
//     double x();
// 
//     double y();
// 
//     double radius();
// 
//     boolean intersects(Circle c);
// 
//     boolean intersects(Point point);
// 
//     boolean intersects(Line line);
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Line.java
// public interface Line extends Geometry {
// 
//     double x1();
// 
//     double y1();
// 
//     double x2();
// 
//     double y2();
// 
//     boolean intersects(Line b);
// 
//     boolean intersects(Point point);
// 
//     boolean intersects(Circle circle);
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Point.java
// public interface Point extends Rectangle {
// 
//     double x();
// 
//     double y();
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/geometry/Rectangle.java
// public interface Rectangle extends Geometry, HasGeometry {
// 
//     double x1();
// 
//     double y1();
// 
//     double x2();
// 
//     double y2();
// 
//     double area();
// 
//     double intersectionArea(Rectangle r);
// 
//     double perimeter();
// 
//     Rectangle add(Rectangle r);
// 
//     boolean contains(double x, double y);
//     
//     boolean isDoublePrecision();
// 
// }
// 
// Path: src/main/java/com/github/davidmoten/rtree/internal/util/ObjectsHelper.java
// public final class ObjectsHelper {
// 
//     private ObjectsHelper() {
//         // prevent instantiation
//     }
// 
//     @VisibleForTesting
//     static void instantiateForTestCoveragePurposesOnly() {
//         new ObjectsHelper();
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <T> Optional<T> asClass(Object object, Class<T> cls) {
//         if (object == null) {
//             return Optional.empty();
//         } else if (object.getClass() != cls) {
//             return Optional.empty();
//         } else {
//             return Optional.of((T) object);
//         }
//     }
// 
// }


// Path: src/main/java/com/github/davidmoten/rtree/geometry/internal/CircleFloat.java
import com.github.davidmoten.rtree.geometry.Circle;
import com.github.davidmoten.rtree.geometry.Line;
import com.github.davidmoten.rtree.geometry.Point;
import com.github.davidmoten.rtree.geometry.Rectangle;
import com.github.davidmoten.rtree.internal.util.ObjectsHelper;
import java.util.Objects;
import java.util.Optional;

    public boolean intersects(Circle c) {
        double total = radius + c.radius();
        return GeometryUtil.distanceSquared(x, y, c.x(), c.y()) <= total * total;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y, radius);
    }

    @Override
    public boolean equals(Object obj) {
        Optional<CircleFloat> other = ObjectsHelper.asClass(obj, CircleFloat.class);
        if (other.isPresent()) {
            return Objects.equals(x, other.get().x) && Objects.equals(y, other.get().y)
                    && Objects.equals(radius, other.get().radius);
        } else
            return false;
    }

    @Override
    public boolean intersects(Point point) {
        return Math.sqrt(sqr(x - point.x()) + sqr(y - point.y())) <= radius;
    }

    private double sqr(double x) {
        return x * x;
    }

    @Override
    public boolean intersects(Line line) {