我试图在不使用平方根的情况下在两个圆圈之间进行距离检查。根据网上的许多消息来源(例如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);
}
}
我做错了什么或公式是不正确的?
答案 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
。当循环无法在范围内找到任何内容时,您还应该有一些东西。