Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 无限期地随机移动对象而不发生碰撞_Algorithm_Collision Detection_Path Finding - Fatal编程技术网

Algorithm 无限期地随机移动对象而不发生碰撞

Algorithm 无限期地随机移动对象而不发生碰撞,algorithm,collision-detection,path-finding,Algorithm,Collision Detection,Path Finding,我有一个应用程序,我需要在屏幕上随机移动一些对象,它们不能相互碰撞。我正在寻找一种算法,该算法允许我生成不产生冲突的路径,并且可以无限期地持续(即:对象不断移动,直到用户驱动的事件将其从程序中删除) 我不是一个游戏程序员,但我认为这看起来像一个人工智能问题,你们可能闭上眼睛解决它。据我所知,A*似乎是推荐的“基本想法”,但我真的不想在没有确认的情况下投入大量时间 有人能解释一下方法吗?也许是反重力运动 这将在iOS上实现,如果这很重要的话 需要在每条路径的末尾生成新路径 没有可见的“网格”。在二

我有一个应用程序,我需要在屏幕上随机移动一些对象,它们不能相互碰撞。我正在寻找一种算法,该算法允许我生成不产生冲突的路径,并且可以无限期地持续(即:对象不断移动,直到用户驱动的事件将其从程序中删除)

我不是一个游戏程序员,但我认为这看起来像一个人工智能问题,你们可能闭上眼睛解决它。据我所知,A*似乎是推荐的“基本想法”,但我真的不想在没有确认的情况下投入大量时间

有人能解释一下方法吗?也许是反重力运动

  • 这将在iOS上实现,如果这很重要的话
  • 需要在每条路径的末尾生成新路径
  • 没有可见的“网格”。在二维空间中,运动是完全自由的
  • 这些物体是昆虫,它们在屏幕上游走直到被杀死

  • 对于*而言,即使二维栅格不可见,也需要二维栅格。如果我没弄错你的想法,你可以做以下事情

    实施寻路(例如a*),然后在屏幕上生成随机目标点并计算路径。一旦昆虫到达目的地,生成另一个目的地点/网格单元并继续,直到昆虫死亡

    在我看来,A*只有在屏幕上有障碍物的情况下才有意义,昆虫应该四处导航,否则它就足以计算出一条直线矢量路径,并可能处理与其他昆虫/物体的碰撞

    注意:我实现过一次,后来我发现 基本上也是这样,但更容易实现

    看看哪个描述了一个自动玩马里奥游戏的人工智能程序

    因此,在这个链接中,作者所做的是使用a*star算法引导Mario
    尽可能快地到达屏幕的右边框。避免受伤。

    因此,对于每个时间帧,他将有一个描述场景中其他对象当前位置的环境,对于每个动作(上、下、左、右和不做任何动作),他计算其成本函数,并根据此计算下一个动作的决策


    来源:

    你不能在无限期内提前计划轨迹

    我建议使用一种更简单的方法,只需预测下一次碰撞(知道物体的位置和速度,就可以判断它们是否会碰撞以及何时碰撞),然后通过更改任一物体的速度或方向(物体接触前反弹)来解决

    如果您创建了更早的碰撞,请确保重新检查碰撞

    在您的案例中,真正的挑战是有效地预测众多对象之间的碰撞,这是一项先验O(N²)任务。通过在运动场上叠加一个粗网格,并仅查看相邻单元中的对象,可以加快速度


    还可以维护一个“可能会在将来发生干扰”(即考虑到它们的距离和相对速度)的对象对列表,并保持更新。检查一对可能离开列表相对容易;有效地检查需要进入列表的新对并不重要。

    A*
    是一种算法,用于查找起始配置和目标配置之间的最短路径(根据您定义的短路径:常见的是例如欧几里德距离、成本或时间、角度距离……)。你的昆虫似乎没有特定的目标,它们甚至不需要最短的路径。我当然不会选择
    A*
    。(顺便说一句,由于您的环境是动态的,
    D*
    本来是一个想法,但它仍然意味着要找到从a到B的路径)

    我会按以下方法处理这个问题:

    随机路径及其跟踪 对于随机路径,我看到两种方法。第一种是简单的随机行走(),它可能会出现抖动,看起来也不太好看。第二个需要更详细的解释

    每只昆虫在其周围产生四个随机点,可能从一个正弦曲线开始。使用a在这些点之间生成平滑曲线。注意使用C1(2D)或C2(3D)。(建议:) 使用,您可以在沿曲线移动时找到配置

    可以找到类似方法的应用,也可以在计算机动画课程中找到更技术性(但仍然不是太技术性)的解释

    当昆虫开始移动时,它可以在第二个点和第三个点之间不断移动,当昆虫到达第三个点时,总是移除第一个点并附加一个新点,从而使第二个点成为第二个点

    If third point is reached
        Remove first
        Append new point
        Recalculate spline
    End if
    

    一条更平滑的曲线加上更多的点,在中间移动,原则保持不变。(就我个人而言,我只在固定环境中使用它,但它也应该在动态环境中使用。)

    这可以,如果你的随机点生成是好的(也许你可以使用一种类似于上面链接的博客文章中提供的方法,或者看看上面的算法),导致整个屏幕上的平滑路径

    避免其他昆虫 为了避免其他昆虫,我想到了三种不同的方法

    • 错误算法
    • 布雷滕堡汽车公司
    • 势场的一个应用
    对于潜在的领域,我建议阅读。它来自机器人技术,但也很容易应用于你的问题。您可以使用机器人的下一个样条线点作为目标,并将其速度设置为0以应用此方法。然而,对于您的简单游戏来说,这可能有点太多了

    可以找到关于Braitenberg车辆的讨论。最初的想法更多的是一种技术方法(根据您的电机与光电接收器的耦合方式,朝向或远离光源),并且通常是