C++中两个圆的交点

3

让我们定义一个二维圆:

struct Vec2D
{
    float x;
    float y;
};

// Assume dot, normalize, length, sum, subtract, and scale to exist.

struct Circle2D
{
    Vec2D center;
    float radius;
};

给定两个圆,需要确定两个圆之间的0、1或2个交点:

bool circleVsCircleIntersection( const Circle& a, const Circle& b, 
    std::array<std::optional<Vec2D>,2>& intersPos); 

如何在C++中确定两个圆的0、1或2个交点?


从以下网址开始:http://math.stackexchange.com/questions/39561/finding-the-intersecting-points-on-two-circles - Ulf Lindback
1
你知道如何计算交点吗?如果不知道,那么这是一个数学问题而不是编程问题。 - Paul R
1
@UlfLindback:如何在数学上找到截距的问题不一定与在代码中应该如何做相一致。使用双精度计算的数学上“简单”的公式得出的结果,往往比使用浮点精度计算的更复杂的公式得出的结果差。在谷歌搜索中,可以找到许多数学描述,但我没有看到任何解决精度问题的代码示例,因此我不知道我看到的结果是否非常好。 - supercat
将半径之和或差与中心点之间的距离进行比较。 - user1196549
1个回答

1
假设你有一个圆的中心点和半径,你可以设置一个类似这样的方程:
(x-x1)²+(y-y1)²=r1²

你可以对两个圆都这样做

I  x²-2xx1+x1²+y²-yy1+y1²=r1²
II x²-2xx2+x2²+y²-yy2+y2²=r2²

然后你可以将II插入I中,就完成了 :)


如果通过解二次方程 II 得到 y 关于 x 的表达式,计算会非常繁琐。更好的方法是先减去 I 和 II 中的二次项。由于只需要求解的解的数量,因此有一个更简单的解决方案。 - user1196549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接