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_Geometry_Collision Detection - Fatal编程技术网

Algorithm 橡皮筋和钉子游戏

Algorithm 橡皮筋和钉子游戏,algorithm,geometry,collision-detection,Algorithm,Geometry,Collision Detection,我必须制作一个这样的flash游戏: 有一块板上有洞(超过1000个)。最初,有3个钉子放在板上,周围有一个橡皮筋。 我们有3种可能的操作: 1.添加钉-在板上添加钉 2.移除销钉-移除销钉(如果有超过3个销钉)-橡皮筋必须采用剩余销钉的形状。 3.移动销钉-必须使用销钉的当前位置更新橡皮筋 您如何解决找到最佳橡胶带形状的问题 我有两个想法,但我必须努力一点。主要的想法是,我们只能在“移动”操作时改变橡皮筋的形状,我们使用相同数量的销钉,只有一个销钉在改变位置: 凸壳算法的一种推导。我们必须知道

我必须制作一个这样的flash游戏: 有一块板上有洞(超过1000个)。最初,有3个钉子放在板上,周围有一个橡皮筋。 我们有3种可能的操作: 1.添加钉-在板上添加钉 2.移除销钉-移除销钉(如果有超过3个销钉)-橡皮筋必须采用剩余销钉的形状。 3.移动销钉-必须使用销钉的当前位置更新橡皮筋

您如何解决找到最佳橡胶带形状的问题

我有两个想法,但我必须努力一点。主要的想法是,我们只能在“移动”操作时改变橡皮筋的形状,我们使用相同数量的销钉,只有一个销钉在改变位置:

  • 凸壳算法的一种推导。我们必须知道哪个钉子在橡皮筋里面,哪个在橡皮筋外面。可能会有点复杂

  • 我们只使用3个桩:2个锚和1个中间桩。2个锚固件形成1个中间桩相互作用的边界线。在线路的活动侧,橡皮筋作为2个锚栓和中间栓之间的2段。在非活动侧,1个中间销钉可自由移动,而橡胶带在2个锚栓之间起直线作用。需要注意的是,在某些情况下,边界线活动侧的1个中间销钉的移动可能会导致2个管段中的一个与第4个销钉接触。程序必须检测到这种情况,并相应地更新新的锚栓。这些只是从这一概念的有限经验中得出的建议。开发人员应根据其经验和判断确定最佳方法

  • 您还有其他想法或建议吗?

    “开发人员应根据自己的经验和判断确定最佳方法。”-您是否从提供的规范中复制并粘贴了此内容?:)

    你要求一个“最佳”的解决方案,但如果我是你,我的目标是一个“正确的,足够快的”解决方案。你有一个合同要履行,你可以把渐近解留给学者

    不管怎么说,你的计划只是在玩家移动一个木钉时才更新乐队,这看起来是个不错的计划。我们需要记住所有与橡皮筋接触的钉子,对于每个钉子,我们必须记住橡皮筋的哪一侧(以便正确地绘制橡皮筋)

    现在,假设玩家将peg A从A移动到A'

    作为一般原则,值得记住的是,即使你的时间段很短,从a到a的距离很小,但是可能会发生多种情况。因此,你必须考虑在那个时间段可能发生的所有事件,选择最早的此类事件,相应地更新你的数据结构,然后继续剩余的时间段。 那么有什么样的活动呢

    • 佩格“拾起”乐队。(如果销钉A不在带上,且线A–A'穿过带上销钉之间的一条线,则会执行此操作。)
    • Peg A“放下”乐队。(如果peg A位于带上,相邻B和C,且线A–A'穿过线B–C,则会这样做。)
    • 在乐队中,佩格赢得了一个邻居。(当销钉A在带上,B是A的邻居,三角形A–A'–B包含另一个销钉C时,会发生这种情况。)
    • 佩格在乐队里失去了一个邻居。(当销钉A位于带上,带上的相邻销钉位于A–B–C,销钉B位于三角形A–A’–C中时,会发生这种情况。)
    所以你应该决定所有这些事件;计算出每个事件发生的时间;将事件按时间排序;处理最早的事件(仅限);在时间段的剩余部分重复此操作

    (如果两个事件同时发生,该怎么办?我将根据您的经验和判断。)

    编辑添加:一个复杂的情况是,一个销钉可能出现在橡皮筋的多个部分上(例如,橡皮筋可能会出现a-B–a-C-a)。但我认为上面的算法草图仍然有效


    另一个问题是,即使用少量的钉子,你也可以使带子任意扭曲。例如,假设带在销钉B和C之间拉伸。现在取销钉A,并将其沿销钉B和C的方向以8字形移动(例如,顺时针绕B,逆时针绕C)。每绕一圈,佩格A都会拿起另外两个乐队的曲子。您不能让配置的复杂性毫无限制地增长,因此需要某种方法来阻止事情失控。我建议对带子的长度施加最大限度的限制,这样任何试图把带子拉得太长的行为都会导致它折断(当然,在这种情况发生之前,你会有警告信号,例如带子变薄、颜色变化、不祥的吱吱声)。

    你如何有效地检测这些事件?最糟糕的情况是,你有
    999
    行组成了这个波段,在某些情况下,你不需要在每次移动(时间段)时重复所有这些行来检查你的事件吗?在确保正确性的同时,应该可以大量减少这些检查+1如果你稍微详细一点,它就缺少了“足够快”的部分:)。我处理这类问题的个人方法是先找到正确的解决方案,然后再担心以后会更快。您可能会发现,迭代1000个PEG已经足够快了(在C这样的语言中,当然是这样,但Flash可能非常慢)。但如果不是这样的话,通常可以通过空间分区来加快几何查询的速度:在本例中是四叉树。但更重要的是,为什么不限制木桩的数量呢?对任何人来说,放下1000个钉子都不是一件有趣的事。我发现很难想象拥有超过15个钉子会有多大的乐趣,所以限制在50个就足够了