我现在正在尝试在2D地图路径上生成直线同步点。
换句话说,我想在地图上的点A(例如X:301 Y:679)到B点X:360 Y:630之间散布距离,每经过8个单位的距离。
sqrt(pow(a_x - b_x, 2), pow(a_y - b_y, 2))计算的每8个距离单位。我想获取地图上的下一个坐标,例如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;
         }
    }


我在这里做什么错了?

最佳答案

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

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

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

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


这些路标看起来是否更符合您的需求?

07-24 14:00