我知道有很多例子可以做到这一点。但是我需要了解我在做什么。
您能告诉我这段代码中的错误吗?
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
最佳答案
我看到两个问题:交点不正确(我去过并用您的代码实现了完整的测试用例),并且交点不应该依赖于点的顺序。
让我们来看一个简单的例子。当我们有每个半径为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。
关于java - 圆-圆相交代码给出错误的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23960429/