如何检查圆圈是否相互相交?

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.
}

您永远不会分配字段 xy。因此 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中添加了另一个xy字段,即隐藏 基础字段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你关于字段隐藏.