如何检查圆圈是否相互相交?
How to check if circles intersect each other?
这是我的测试class,
public class Shape2DTester {
public static void main(String[] args) {
GeometricObject2D geoObject1 = new ComparableCircle2D(0, 5, 2);
GeometricObject2D geoObject3 = new ComparableCircle2D(0, 0, 2);
System.out.println("geoObject1 overlaps geoObject3: "
+ geoObject1.intersect(geoObject3));
}
}
这是我的圈子class,
public 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();
return (dx * dx + dy * dy < radi * radi);
}
}
}
这是我的超级class,
public 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;
}
}
我想找出两个圆相交的可能性,但我的代码中有一个我没有意识到的错误。
例如我创建了两个圆对象 coordinates-1(0,0) , radius-1=2 和 坐标-2(0,5),半径-2=2。上述方法必须 return 为假,但 return 为真。我没有发现错误。
System.out.println("geoObject1 intersects geoObject3: "
+ geoObject1.intersect(geoObject3));
打印geoObject1 intersects geoObject3: true
而不是 Math.pow(x, 2) 做 x * x 更有效,而不是使用 Math.sqrt 你可以平方半径的总和。
public boolean intersect(GeometricObject2D g) {
ComparableCircle2D other = (ComparableCircle2D) g;
double dx = other.x - x; // e.g. 0 - 0
double dy = other.y - y; // e.g. 5 - 0
double radii = other.radius + radius; // e.g. 2 + 2
return dx * dx + dy * dy < radii * radii ; // e.g. 0 + 25 < 16 is false.
}
您永远不会分配字段 x
和 y
。因此 dx
= dy
= 0.
您必须分配字段的值或使用超类中的字段(但您不应在同一对象中拥有具有相同信息的字段,因此请删除在 ComparableCircle2D
中创建的字段)。
另外,如果你的圆被定义为等高线,而不是面积,那么截取圆的测试是不正确的。考虑 2 个圆心相同但半径不同的情况:dx² + dy² = 0 < dr²
,但等高线不相交;只有圆圈内的区域重叠。
正如@Pshemo 所说,您的代码(现在您已经展示了它)在末尾有一个额外的 }
不应该存在。
如何,如果我们将所有代码粘贴到 IDEONE 和 运行 中,我们就会确认您的错误。
如果我们通过添加单个 print
语句 DEBUG 代码,我们会看到:
dx=0.0, dy=0.0, radi=4.0
嗯,为什么 dy = 0
应该是 5
?
答案:因为您在子class中添加了另一个组x
和y
字段,即隐藏 基础字段class!!!!
简单的调试就会让你自己看到这个。这就是@PeterLawrey 在他的评论中所说的内容:
you mistake is it is likely to be; the values are not what you think they are. This is where debugging your code can show this.
当然,如果你用的好IDE,你甚至不需要调试,因为IDE会有warned你关于字段隐藏.
这是我的测试class,
public class Shape2DTester {
public static void main(String[] args) {
GeometricObject2D geoObject1 = new ComparableCircle2D(0, 5, 2);
GeometricObject2D geoObject3 = new ComparableCircle2D(0, 0, 2);
System.out.println("geoObject1 overlaps geoObject3: "
+ geoObject1.intersect(geoObject3));
}
}
这是我的圈子class,
public 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();
return (dx * dx + dy * dy < radi * radi);
}
}
}
这是我的超级class,
public 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;
}
}
我想找出两个圆相交的可能性,但我的代码中有一个我没有意识到的错误。
例如我创建了两个圆对象 coordinates-1(0,0) , radius-1=2 和 坐标-2(0,5),半径-2=2。上述方法必须 return 为假,但 return 为真。我没有发现错误。
System.out.println("geoObject1 intersects geoObject3: "
+ geoObject1.intersect(geoObject3));
打印geoObject1 intersects geoObject3: true
而不是 Math.pow(x, 2) 做 x * x 更有效,而不是使用 Math.sqrt 你可以平方半径的总和。
public boolean intersect(GeometricObject2D g) {
ComparableCircle2D other = (ComparableCircle2D) g;
double dx = other.x - x; // e.g. 0 - 0
double dy = other.y - y; // e.g. 5 - 0
double radii = other.radius + radius; // e.g. 2 + 2
return dx * dx + dy * dy < radii * radii ; // e.g. 0 + 25 < 16 is false.
}
您永远不会分配字段 x
和 y
。因此 dx
= dy
= 0.
您必须分配字段的值或使用超类中的字段(但您不应在同一对象中拥有具有相同信息的字段,因此请删除在 ComparableCircle2D
中创建的字段)。
另外,如果你的圆被定义为等高线,而不是面积,那么截取圆的测试是不正确的。考虑 2 个圆心相同但半径不同的情况:dx² + dy² = 0 < dr²
,但等高线不相交;只有圆圈内的区域重叠。
正如@Pshemo 所说,您的代码(现在您已经展示了它)在末尾有一个额外的 }
不应该存在。
如何,如果我们将所有代码粘贴到 IDEONE 和 运行 中,我们就会确认您的错误。
如果我们通过添加单个 print
语句 DEBUG 代码,我们会看到:
dx=0.0, dy=0.0, radi=4.0
嗯,为什么 dy = 0
应该是 5
?
答案:因为您在子class中添加了另一个组x
和y
字段,即隐藏 基础字段class!!!!
简单的调试就会让你自己看到这个。这就是@PeterLawrey 在他的评论中所说的内容:
you mistake is it is likely to be; the values are not what you think they are. This is where debugging your code can show this.
当然,如果你用的好IDE,你甚至不需要调试,因为IDE会有warned你关于字段隐藏.