/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
GeometricObject2D geoObject1 = new ComparableCircle2D(0, 5, 2);
GeometricObject2D geoObject3 = new ComparableCircle2D(0, 0, 2);
System.
out.
println("geoObject1 overlaps geoObject3: " + geoObject1.intersect(geoObject3));
}
}
abstract class GeometricObject2D<T extends GeometricObject2D> implements
Comparable<GeometricObject2D> {
public double x, y;
GeometricObject2D() {
this.x = 0;
this.y = 0;
}
GeometricObject2D(double x, double y) {
this.x = x;
this.y = y;
}
public abstract double getArea();
public abstract double getPerimeter();
public abstract boolean intersect(GeometricObject2D g);
@Override
public int compareTo(GeometricObject2D o) {
// TODO Auto-generated method stub
return 0;
}
}
class ComparableCircle2D extends GeometricObject2D<ComparableCircle2D> {
public double x, y;
public double radius;
ComparableCircle2D() {
super();
this.radius = 1.0;
}
ComparableCircle2D(double radius) {
super();
this.
radius = Math.
abs(radius
); }
ComparableCircle2D(double x, double y, double radius) {
super(x, y);
this.
radius = Math.
abs(radius
); }
public double getArea() {
return Math.
PI * getRadius
() * getRadius
(); }
public double getPerimeter() {
return 2 * Math.
PI * getRadius
(); }
public void setRadius(double setRadius) {
this.
radius = Math.
abs(setRadius
); }
public double getRadius() {
return radius;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
@Override
public boolean intersect(GeometricObject2D g) {
ComparableCircle2D other = (ComparableCircle2D) g;
double dx = other.x - getX();
double dy = other.y - getY();
double radi = other.radius + getRadius();
System.
out.
println("dx=" + dx
+ ", dy=" + dy
+ ", radi=" + radi
); return (dx * dx + dy * dy < radi * radi);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCUdlb21ldHJpY09iamVjdDJEIGdlb09iamVjdDEgPSBuZXcgQ29tcGFyYWJsZUNpcmNsZTJEKDAsIDUsIDIpOyAKCQlHZW9tZXRyaWNPYmplY3QyRCBnZW9PYmplY3QzID0gbmV3IENvbXBhcmFibGVDaXJjbGUyRCgwLCAwLCAyKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oImdlb09iamVjdDEgb3ZlcmxhcHMgZ2VvT2JqZWN0MzogIgoJCSAgICAgICAgICAgICAgICArIGdlb09iamVjdDEuaW50ZXJzZWN0KGdlb09iamVjdDMpKTsKCX0KfQphYnN0cmFjdCBjbGFzcyBHZW9tZXRyaWNPYmplY3QyRDxUIGV4dGVuZHMgR2VvbWV0cmljT2JqZWN0MkQ+IGltcGxlbWVudHMKICAgICAgICBDb21wYXJhYmxlPEdlb21ldHJpY09iamVjdDJEPiB7CglwdWJsaWMgZG91YmxlIHgsIHk7CgoJR2VvbWV0cmljT2JqZWN0MkQoKSB7CgkJdGhpcy54ID0gMDsKCQl0aGlzLnkgPSAwOwoJfQoKCUdlb21ldHJpY09iamVjdDJEKGRvdWJsZSB4LCBkb3VibGUgeSkgewoJCXRoaXMueCA9IHg7CgkJdGhpcy55ID0geTsKCX0KCglwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldEFyZWEoKTsKCglwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFBlcmltZXRlcigpOwoKCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGludGVyc2VjdChHZW9tZXRyaWNPYmplY3QyRCBnKTsKCglAT3ZlcnJpZGUKCXB1YmxpYyBpbnQgY29tcGFyZVRvKEdlb21ldHJpY09iamVjdDJEIG8pIHsKCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCgkJcmV0dXJuIDA7Cgl9Cn0KY2xhc3MgQ29tcGFyYWJsZUNpcmNsZTJEIGV4dGVuZHMgR2VvbWV0cmljT2JqZWN0MkQ8Q29tcGFyYWJsZUNpcmNsZTJEPiB7CgoJcHVibGljIGRvdWJsZSB4LCB5OwoJcHVibGljIGRvdWJsZSByYWRpdXM7CgoJQ29tcGFyYWJsZUNpcmNsZTJEKCkgewoJCXN1cGVyKCk7CgkJdGhpcy5yYWRpdXMgPSAxLjA7Cgl9CgoJQ29tcGFyYWJsZUNpcmNsZTJEKGRvdWJsZSByYWRpdXMpIHsKCQlzdXBlcigpOwoJCXRoaXMucmFkaXVzID0gTWF0aC5hYnMocmFkaXVzKTsKCX0KCglDb21wYXJhYmxlQ2lyY2xlMkQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgcmFkaXVzKSB7CgkJc3VwZXIoeCwgeSk7CgkJdGhpcy5yYWRpdXMgPSBNYXRoLmFicyhyYWRpdXMpOwoJfQoKCXB1YmxpYyBkb3VibGUgZ2V0QXJlYSgpIHsKCQlyZXR1cm4gTWF0aC5QSSAqIGdldFJhZGl1cygpICogZ2V0UmFkaXVzKCk7Cgl9CgoJcHVibGljIGRvdWJsZSBnZXRQZXJpbWV0ZXIoKSB7CgkJcmV0dXJuIDIgKiBNYXRoLlBJICogZ2V0UmFkaXVzKCk7Cgl9CgoJcHVibGljIHZvaWQgc2V0UmFkaXVzKGRvdWJsZSBzZXRSYWRpdXMpIHsKCQl0aGlzLnJhZGl1cyA9IE1hdGguYWJzKHNldFJhZGl1cyk7Cgl9CgoJcHVibGljIGRvdWJsZSBnZXRSYWRpdXMoKSB7CgkJcmV0dXJuIHJhZGl1czsKCX0KCgoKCXB1YmxpYyBkb3VibGUgZ2V0WCgpIHsKCQlyZXR1cm4geDsKCX0KCglwdWJsaWMgdm9pZCBzZXRYKGRvdWJsZSB4KSB7CgkJdGhpcy54ID0geDsKCX0KCglwdWJsaWMgZG91YmxlIGdldFkoKSB7CgkJcmV0dXJuIHk7Cgl9CgoJcHVibGljIHZvaWQgc2V0WShkb3VibGUgeSkgewoJCXRoaXMueSA9IHk7Cgl9CgoJQE92ZXJyaWRlCglwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3QoR2VvbWV0cmljT2JqZWN0MkQgZykgewoJCUNvbXBhcmFibGVDaXJjbGUyRCBvdGhlciA9IChDb21wYXJhYmxlQ2lyY2xlMkQpIGc7CgkJZG91YmxlIGR4ID0gb3RoZXIueCAtIGdldFgoKTsKCQlkb3VibGUgZHkgPSBvdGhlci55IC0gZ2V0WSgpOwoJCWRvdWJsZSByYWRpID0gb3RoZXIucmFkaXVzICsgZ2V0UmFkaXVzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJkeD0iICsgZHggKyAiLCBkeT0iICsgZHkgKyAiLCByYWRpPSIgKyByYWRpKTsKCQlyZXR1cm4gKGR4ICogZHggKyBkeSAqIGR5IDwgcmFkaSAqIHJhZGkpOwoJfQoKfQ==