Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现碰撞检测_C++_Simulation - Fatal编程技术网

C++ 如何实现碰撞检测

C++ 如何实现碰撞检测,c++,simulation,C++,Simulation,我正在创建一个模拟机器人在地图上移动的程序。我有一个环境课程,里面有机器人和机器人可能遇到的障碍物。目前,我有我的机器人的类对象和障碍物,我有一个函数告诉我它们是否碰撞(返回真/假)。我只是不知道如何将其应用到机器人的移动功能中 机器人是一个正方形,有一个中心点(x,y),一个宽度,一个长度,一个角度方向(仅供参考,环境类是机器人类的朋友)。障碍物是具有中心点(x,y)和半径的圆 class Environment{ Robot robot; vector<Obstacle&g

我正在创建一个模拟机器人在地图上移动的程序。我有一个环境课程,里面有机器人和机器人可能遇到的障碍物。目前,我有我的机器人的类对象和障碍物,我有一个函数告诉我它们是否碰撞(返回真/假)。我只是不知道如何将其应用到机器人的移动功能中

机器人是一个正方形,有一个中心点(x,y),一个宽度,一个长度,一个角度方向(仅供参考,环境类是机器人类的朋友)。障碍物是具有中心点(x,y)和半径的圆

  class Environment{
  Robot robot;
  vector<Obstacle> obstacles;

  //random obstacle generation function

  bool collision_circle(Obstacle obstacle) {
      //Check if the circle intersects any of the corners of the robot
      std::vector<Point> points;
      points.push_back(robot.top_right);
      points.push_back(robot.top_left);
      points.push_back(robot.bottom_right);
      points.push_back(robot.bottom_left);

      Point obst_center(obstacle.return_x(), obstacle.return_y());

      for (int i = 0; i < points.size(); i++) {
        points[i].set_distance(obst_center);
        if (points[i].distance <= obstacle.return_radius()) { return  true; }
      }

      //Sort the points by distance away from the obstacle
      std::sort(points.begin(), points.end(), less_than());

      //Use the two closest to the obstacle to create a line
      double m = (points[0].x - points[1].x) / (points[0].y - 
      points[1].y);
      double b = points[0].y - (m * points[0].x);

      //Determine a line perpendicular which intersects the obstacle's 
      center
      double m_perp = 1 / m;
      double b_perp = obst_center.y - (m * obst_center.x);

      Point on Robot closest to obstacle
      double new_x = (b - b_perp) / (m_perp - m);
      double new_y = m_perp * new_x + b_perp;

      distance between points
      double diff_x = obst_center.x - new_x;
      double diff_y = obst_center.y - new_y;
      double distance = sqrt(pow(diff_x, 2) + pow(diff_y, 2));

      if (distance <= obstacle.return_radius()) { return true; }
      else { return false; }
  }

  Environment(Robot& t_robot): robot(t_robot) {}

  void forward(double num_inches){
    robot.y += num_inches * sin(robot.orientation * convert_deg); 
    //Convert_deg is a global variable = PI/180
    robot.x += num_inches * cos(robot.orientation * convert_deg);
  }
  //void backward, left, right, etc.
}
类环境{
机器人;
媒介障碍;
//随机障碍物生成函数
碰撞圆(障碍物){
//检查圆是否与机器人的任何角相交
std::向量点;
点。向后推(机器人。右上方);
点。向后推(机器人。左上角);
点。向后推(机器人。右下角);
点。向后推(机器人。左下角);
点障碍物中心(障碍物返回x(),障碍物返回y());
对于(int i=0;i如果(点)i(距离)诚实,上面的代码看起来不“慢”。要考虑的是使用距离的平方——这阻止了平方根调用,但是在现代CPU上,这并不太坏。如果程序被锁定,我会在代码中寻找无限循环(bug)。,而不是更快的数学运算。你可以使用计算可能的接触,然后使用更复杂的数学,如圆接触,来计算实际接触。@MichaelDorgan,我陷入了一个无限循环中。谢谢你。在考虑到这一点进行一些调试后,我发现了一个愚蠢的(对我来说)错误。我仍然很好奇是否有更好的方法来实现这种方法function@arc-威胁这可能是离题(因此发表评论),但考虑到您知道机器人的位置和障碍物的位置,如果您的目标是将机器人从一个位置移动到另一个位置,则有许多基于图形的方法来执行此任务。如果您只有局部信息,例如,传感器收集的机器人周围的数据或任何类似您希望的信息模拟-然后您可以使用DWA、势场和其他技术。我将采用的方法在很大程度上取决于您希望避免的障碍物的数量。对于上述情况,存储边界半径(平方)对于长方体,快速执行我的半径^2+障碍物半径^2<我们之间的距离^2检查。然后它只是将存储的平方半径值与笛卡尔差平方(x1-x0)^2+(y1-y0)^2相加,没有平方根。所有这些加在一起:1加,2减,2乘,和一个比较。将其与您的“在方块内”检查上面的情况,你很少需要排序任何东西。老实说,上面的代码看起来不是“慢”。要考虑的是使用距离的平方——这阻止了平方根调用,但是在现代CPU上,这并不太坏。如果程序被锁定,我会在代码中寻找无限循环(bug)。,而不是更快的数学运算。你可以使用计算可能的接触,然后使用更复杂的数学,如圆接触,来计算实际接触。@MichaelDorgan,我陷入了一个无限循环中。谢谢你。在考虑到这一点进行一些调试后,我发现了一个愚蠢的(对我来说)错误。我仍然很好奇是否有更好的方法来实现这种方法function@arc-威胁这可能是离题(因此发表评论),但考虑到您知道机器人的位置和障碍物的位置,如果您的目标是将机器人从一个位置移动到另一个位置,则有许多基于图形的方法来执行此任务。如果您只有局部信息,例如,传感器收集的机器人周围的数据或任何类似您希望的信息模拟-然后您可以使用DWA、势场和其他技术。我将采用的方法在很大程度上取决于您希望避免的障碍物的数量。对于上述情况,存储边界半径(平方)对于长方体,快速执行我的半径^2+障碍物半径^2<我们之间的距离^2检查。然后将存储的平方半径值与笛卡尔差平方(x1-x0)^2+(y1-y0)^2相加,没有平方根。所有这些加在一起:1加,2减,2乘,和一个比较。将其与您的“在方框内“检查上面的内容,很少需要对任何内容进行排序。