没有sqrt的两个圆之间的距离检查

时间:2014-08-20 21:33:26

标签: c++11 distance geometry trigonometry sqrt

我试图在不使用平方根的情况下在两个圆圈之间进行距离检查。根据网上的许多消息来源(例如this one),这样做的方法是减去圆的总和的平方'平方距离的半径(使用毕达哥拉斯定理)。 但是,这似乎不起作用。根据Wolfram Alpha和我自己的测试,检查不像sqrt版本那样工作。 这里是Wolfram中比较的两个方程:http://www.wolframalpha.com/input/?i=sqrt%28d%29+-+%28r1%2Br2%29+%3C+y+%3D%3D+d+-+%28r1%2Br2%29%5E2+%3C+y

以及不符合规定的相关代码:

T DistanceTo(Point p) const {
    return sqrt((p.x - x)*(p.x - x) + (p.y - y)*(p.y - y));
}

T DistanceToSq(Point p) const {
    return (p.x - x)*(p.x - x) + (p.y - y)*(p.y - y);
}

float Unit::GetDistanceTo(Unit * tgt)   const {
    auto dist = _pos.DistanceTo(tgt->GetPos());
    dist -= GetRadius() + tgt->GetRadius();
    return dist;
}
float Unit::GetDistanceToSq(Unit * tgt) const {
    auto dist = _pos.DistanceToSq(tgt->GetPos());
    auto radii = (GetRadius() + tgt->GetRadius());
    dist -= radii * radii;
    return dist;
}

template<typename Func>
void ForEachRange(Unit * owner, float range, Func func = [](Unit * tgt)) {
    auto range_sq = range * range;

    for(Unit * p : m_players) {
        if(owner == p || owner->GetDistanceToSq(p) >= range_sq) {
            if(owner != p && owner->GetDistanceTo(p) < range)
                assert(0);

            continue;
        }

        assert(owner->GetDistanceTo(p) < range);

        func(p);
    }
}

我做错了什么或公式是不正确的?

2 个答案:

答案 0 :(得分:1)

你问过Wolfram Alpha,如果sqrt(d) - (r1+r2) < y等同于d - (r1+r2)^2 < y而Alpha说“不”。

让我们从您的查询中获取第一个不等式,并使用代数消除平方根:

sqrt(d) - (r1 + r2) < y
            sqrt(d) < y + r1 + r2
                  d < (y + r1 + r2)²

你是否看到这与你的第二个不等式d - (r1+r2)^2 < y有什么不同?

您可以遵循您的直觉,或者您可以遵循代数规则,但其中一个可以提供更好的答案。 ; ^)

答案 1 :(得分:0)

当您在范围内找到某些内容时,for循环无法结束。我想你想要一个break而不是continue。当循环无法在范围内找到任何内容时,您还应该有一些东西。