2d地图上2点之间的航点发生器

时间:2014-01-10 21:10:39

标签: c++ multidimensional-array

我现在正试图在2D地图路径上生成直接同步点 换句话说,我想在地图上的点A之间溢出距离,例如X:301 Y:679到点B X:360 Y:630,每8个距离单位通过。
每{8}个距离单位由sqrt(pow(a_x - b_x, 2), pow(a_y - b_y, 2))计算。
我想获取地图上的下一个坐标,例如a_x +距离和b_y +距离。
我试着这样做但它不起作用,x轴没有改变属性 这是我的代码:

float base_x = active->getX();
    float base_y = active->getY();

    float destx = incoming_packet.get()->getFloat(4);
    float desty = incoming_packet.get()->getFloat(8);

    float distance = active->distance(destx, desty); // calculated by sqrt(pow(curent character x pos - destx, 2), pow(current character y pos - desty, 2))

    float delta_X = active->vDistance(base_x, destx); // calculated by sqrt(pow(base_x - destx, 2))
    float delta_Y = active->vDistance(base_y, desty);  // calculated by sqrt(pow(base_y - desty, 2))

    float cosa = delta_X / distance;
    float sina = delta_Y / distance;



    int mapx = 1;
    int mapy = 1;

    if(distance > 8)///active sync
    {
        for(float dist = 8; dist < distance;dist+=8)
        {
            base_x += mapx * (cosa * 8);
            base_y += mapy * (sina * 8);
            BOOST_LOG_TRIVIAL(debug) << "[ACTIVESYNC]NEXT SYNC ACK X : " << base_x << " Y : " << base_y;
         }
    }

我在这做错了什么?

1 个答案:

答案 0 :(得分:1)

“cosa”(和cosb)显然是无量纲的。 (即米/米)

“mapx”(和“mapy”)也是无量纲的。

请注意,在for循环中,base_x,base_y描述地图上的一个点。 并且该循环中有两个有趣的计算

base_x += mapx * (cosa * 8);
base_y += mapy * (sina * 8);
通过尝试向一个点添加无量纲数字,

变得无意义。可以通过无量纲数乘以,但将无量纲数添加到地图点是不合理的。

我建议改变cosa和cosb来表示每一步的距离(即米)。

float cosa = delta_X / 8;  // size of steps in x direction
float sina = delta_Y / 8;  // size of steps in y direction

现在for循环可以适当地添加8步cosa和sina来描述路径点,而cosa和sina都有适当的尺寸用于下一次计算。

for循环可以简化为:

  for(int step = 0; step < 8; step += 1)
  {
     base_x += (mapx * cosa);
     base_y += (mapy * sina);

     // remove or adapt the following 
     std::cout << std::setw(10) << std::left << (step+1) << std::setw(10) 
               << base_x  <<  std::setw(10) << base_y << std::endl;

     // you were using:
     //BOOST_LOG_TRIVIAL(debug) << "[ACTIVESYNC]NEXT SYNC ACK X : " 
     //                         << base_x << " Y : " << base_y;
  }

我的虚拟代码输出:

base  x/y  301 679
dest  x/y  360 630
delta x/y   59 -49

step_x  = 7.375
step_y  = -6.125

step      base_x    base_y
0         301       679       
1         308.375   672.875   
2         315.75    666.75    
3         323.125   660.625   
4         330.5     654.5     
5         337.875   648.375   
6         345.25    642.25    
7         352.625   636.125   
8         360       630       

这些方式点看起来更符合您的需求吗?