圆圈交叉代码给出错误的坐标

时间:2014-05-30 17:38:56

标签: java geometry

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

您能否告诉我此代码中的错误?

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 :(得分:1)

我看到有两个问题:交叉点不对(我用代码实现了完整的测试用例),交叉点不应该依赖于点的排序。

让我们来看一个简单的例子。当我们有半径为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