我知道有很多例子可以做到这一点。但是我需要了解我在做什么。

您能告诉我这段代码中的错误吗?

Point[] intersections(Circle c)
{
    Point p0 = new Point(center);
    Point p1 = new Point(c.center);
    double d, x, y;
    d = p0.distance(p1);
    if(radius + c.radius < d || Math.abs(radius - c.radius) > d)
        return null;
    x = (d*d - c.radius*c.radius + radius*radius)/(2*d);
    y = Math.sqrt(radius*radius - x*x);
    if(Double.isNaN(y))
        return null;
    double y0 = y;
    double y1 = -1*y;
    Point i0 = new Point(x,y0,0);
    Point i1 = new Point(x,y1,0);
    i0 = i0.add(p0);
    i1 = i1.add(p1);
    return new Point[]{i0, i1};
}


我有2个圈子c0c1。当我写
c0.intersections(c1),输出为:

5.162277660168379 14.32455532033676 0.0
8.162277660168378 2.675444679663241 0.0


如果我切换顺序:
c1.intersections(c0),输出为:

5.0 15.32455532033676 0.0
2.0 1.675444679663241 0.0

最佳答案

我看到两个问题:交点不正确(我去过并用您的代码实现了完整的测试用例),并且交点不应该依赖于点的顺序。

让我们来看一个简单的例子。当我们有每个半径为1且以(0,0)和(1,1)为中心的圆时会发生什么?然后我们得到

x = 1/sqrt(2)
y = 1/sqrt(2)
y0 = 1/sqrt(2)
y1 = -1/sqrt(2)


现在,我假设您的add方法只是将点的坐标相加。如果是这样,那么我们得到

Point i0 centered at (1/sqrt(2) + 0, 1/sqrt(2) + 0)
Point i1 centered at (1/sqrt(2) + 1, -1/sqrt(2) + 1)


这显然是不正确的,因为两个这样的圆的交点应该是(1,0)和(0,1)。而且,如果您在相交调用中颠倒了点的顺序,除了我们在第一个点上加上+1和+1,但在第二个点上加上+0和+0之外,其他一切都完全一样,结果是不同的答案!要解决此问题,您需要更改取反的坐标。

这将有助于知道您在哪里使用这些公式。例如,如果中心可以表示为(0,0)和(d,0),则您的x公式就足够了(请参见here),但这不适用于大多数圆对。而且我不知道您如何获得y公式,因此我建议检查您对xy的推导。

我只执行过程here

关于java - 圆-圆相交代码给出错误的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23960429/

10-09 23:02