找到最小的小行星c ++位置

时间:2013-01-17 22:05:39

标签: c++ visual-c++

游戏小行星在圆环面上播放。

5 个答案:

答案 0 :(得分:7)

好吧,因为你可以环绕屏幕的任何边缘,小行星和船之间总共有4条直线(上下左右,上下左右,左下,下,右)。我只计算每个的长度并取最小的结果。

int dx1 = abs(ship_x - asteroid_x);
int dx2 = screen_width - dx1;

int dy1 = abs(ship_y - asertoid_y);
int dy2 = screen_height - dy1;

// Now calculate the psuedo-distances as Pete suggests:
int psuedo1 = (dx1 * dx1) + (dy1 * dy1);
int psuedo2 = (dx2 * dx2) + (dy1 * dy1);
int psuedo3 = (dx1 * dx1) + (dy2 * dy2);
int psuedo4 = (dx2 * dx2) + (dy2 * dy2);

这显示了如何计算所涉及的各种距离。将每一个映射到适当的方向有一点复杂。

答案 1 :(得分:4)

我会推荐A* search algorithm

答案 2 :(得分:1)

找到参考船舶的球体。

在我的例子中避免使用小数。让x&的范围y = [0 ... 511]其中511 == 0包裹时

让中间成为原点。

因此从球体和船舶位置

中减去vec2(256,256)

sphere.position(-255,255)= sphere.position(1 - 256,511 - 256);

ship.position(255,-255)= ship.position(511 - 256,1 - 256)

firstDistance(-510,510)= sphere.position(-255,255) - ship.position(255,-255)

wrappedPosition(254,-254)= wrapNewPositionToScreenBounds(firstDistance(-510,510))//在流量/溢出流量下使用原始偏移量256

secondDistance(1,-1)= ship.position(255,-255) - wrappedPosition(254,-254)

答案 3 :(得分:1)

#include <iostream>

template<typename Scalar>
struct vector2d {
  Scalar x;
  Scalar y;
};
template<typename Scalar>
struct position2d {
  Scalar x;
  Scalar y;
};

template<typename S>
S absolute( S in ) {
  if (in < S())
    return -in;
  return in;
}

template<typename S>
S ShortestPathScalar( S ship, S rock, S wrap ) {
  S direct = rock-ship;
  S indirect = (wrap-ship) + (rock);
  if (absolute( direct ) > absolute( indirect ) ) {
    return indirect;
  }
  return direct;
}

template<typename S>
vector2d<S> ShortestPath( position2d<S> ship, position2d<S> rock, position2d<S> wrap ) {
  vector2d<S> retval;
  retval.x = ShortestPathScalar( ship.x, rock.x, wrap.x );
  retval.y = ShortestPathScalar( ship.y, rock.y, wrap.y );
  return retval;
}


int main() {
  position2d<int> world = {1000, 1000};
  position2d<int> rock = {10, 10};
  position2d<int> ship = {500, 900};
  vector2d<int> path = ShortestPath( ship, rock, world );
  std::cout << "(" << path.x << "," << path.y << ")\n";
}

在像这样的简单宇宙中使用平方物做废话毫无意义。

Scalar支持任何支持a < b的类型,默认构造为零。与doubleintlong long一样。

请注意,复制/粘贴上述代码并将其作为一个作业在您正在玩该问题的级别进行处理时,会让您看起来很奇怪。但是,算法应该很容易理解。

答案 4 :(得分:1)

如果您需要通过小行星的最小路径,则无需计算到达小行星的实际最小距离。如果我理解正确,你需要最短的路而不是最短路径的长度。

我认为,这在计算上是最便宜的方法:

让流星的位置为(Mx,My)和船位(Sx,Sy)。 视口的宽度为W,高度为H.现在,

dx = Mx - Sx, dy =我 - Sy。

如果abs(dx)> W / 2(在这种情况下为256)你的船需要左转, 如果abs(dx)&lt; W / 2你的船需要正确。 重要信息 - 如果dx为负数,则反转结果。 (感谢@Toad指出这一点!)

同样,如果 abs(dy)&gt; H / 2船上升, abs(dy)&lt; H / 2船降下来。 和dx一样,如果dy是-ve,则翻转你的结果。

这需要考虑因素,并且应该适用于每个案例。没有广场或毕达哥拉斯定理,我怀疑它可以做得更便宜。此外,如果您必须找到实际的最短距离,您现在只需要应用一次(因为您已经知道需要采取哪四种可能的路径)。 @ Peter的帖子提供了一种优雅的方式来实现这一点,同时考虑到包装。