1

好的,我需要进行碰撞测试。这种方式似乎最简单,但我的编译器不这么认为。感谢您的回复!

C++ 代码:

int sqrd(int num) { return (num*num); } //squares a number

bool checkColShip() {
  for(int x = 0;x < 10;x++) {
    double distance = 0; //use to be int tried to change it
    distance = abs( sqrt( sqrd((one.getXPos() - asteroid[x].getXPos()) +
                          sqrd((one.getYPos() - asteroid[x].getYPos()))
                   ); //include cmath
    distance -= 20;//ship radius
    distance -= 20;//asteroid radius
    if (distance<=0) return true;//collision true
  }
  //no collision
  return false;
}

编译器错误:

c:\documents and settings\all users\documents\c++ projects\learn sdl\learn sdl\main.cpp(702): error C2668: 'sqrt' : ambiguous call to overloaded function
c:\program files\microsoft visual studio 10.0\vc\include\math.h(589): could be 'long double sqrt(long double)'
c:\program files\microsoft visual studio 10.0\vc\include\math.h(541): or       'float sqrt(float)'
c:\program files\microsoft visual studio 10.0\vc\include\math.h(127): or       'double sqrt(double)'
while trying to match the argument list '(int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

PS我通常缩进我的代码,但第一次在这里发布,它一直给我带来问题。

4

4 回答 4

5

错误是说有三个可用sqrt()函数,并且在传递给它时没有明显的选择int

您必须决定是否需要或float通过强制转换参数。doublelong double

与您的问题无关 - 您的代码始终将实数、非负数传递给sqrt(),因此平方根将始终为实数且非负数。将结果传递给abs()是不必要的。

于 2012-07-20T09:26:59.730 回答
2

对于碰撞,您不需要执行平方根。只要确保距离的平方小于碰撞距离的平方

int square(int value) {
    return value * value;
}

bool collide(Object ship, Object asteroid, int collision_distance) {
    int distance_squared = square(xdiff(ship, asteroid)) +
                           square(ydiff(ship, asteroid));
    return distance_squared < square(collision_distance);
}

您看到的实际错误是因为sqrd返回 anint并且sqrt不采用int; 浮点参数有三种不同的版本。编译器不知道最佳选择。当然,最好的选择是首先避免这个问题。

于 2012-07-20T09:59:19.857 回答
1

sqrt 需要“双”或至少“长”。但是, sqrd 是一个 int。

于 2012-07-20T09:24:09.633 回答
0

sqrt( sqrd((one.getXPos() - asteroid[x].getXPos()) 是这里的问题,就像 tugrul 已经说过的那样。

但是你想先画几秒前平方数的平方根吗?为什么不直接将差异转换为 int 从而摆脱逗号?

或者等等……这是关于毕达哥拉斯的,不是吗?无论哪种情况,tugrul 都是正确的。sqrt 只能与 long double 或 double 一起使用。所以让 sqrd 返回 'double' 并且错误消失了。

于 2012-07-20T09:31:12.793 回答