我知道有很多例子可以做到这一点。但我需要了解我在做什么。
您能否告诉我此代码中的错误?
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个圈c0
和c1
。我写的时候
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
答案 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
公式的,所以我建议您检查x
和y
的推导。
我只是实施程序here。