Algorithm 橡皮筋和钉子游戏
我必须制作一个这样的flash游戏: 有一块板上有洞(超过1000个)。最初,有3个钉子放在板上,周围有一个橡皮筋。 我们有3种可能的操作: 1.添加钉-在板上添加钉 2.移除销钉-移除销钉(如果有超过3个销钉)-橡皮筋必须采用剩余销钉的形状。 3.移动销钉-必须使用销钉的当前位置更新橡皮筋 您如何解决找到最佳橡胶带形状的问题 我有两个想法,但我必须努力一点。主要的想法是,我们只能在“移动”操作时改变橡皮筋的形状,我们使用相同数量的销钉,只有一个销钉在改变位置:Algorithm 橡皮筋和钉子游戏,algorithm,geometry,collision-detection,Algorithm,Geometry,Collision Detection,我必须制作一个这样的flash游戏: 有一块板上有洞(超过1000个)。最初,有3个钉子放在板上,周围有一个橡皮筋。 我们有3种可能的操作: 1.添加钉-在板上添加钉 2.移除销钉-移除销钉(如果有超过3个销钉)-橡皮筋必须采用剩余销钉的形状。 3.移动销钉-必须使用销钉的当前位置更新橡皮筋 您如何解决找到最佳橡胶带形状的问题 我有两个想法,但我必须努力一点。主要的想法是,我们只能在“移动”操作时改变橡皮筋的形状,我们使用相同数量的销钉,只有一个销钉在改变位置: 凸壳算法的一种推导。我们必须知道
- 佩格“拾起”乐队。(如果销钉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中时,会发生这种情况。)
另一个问题是,即使用少量的钉子,你也可以使带子任意扭曲。例如,假设带在销钉B和C之间拉伸。现在取销钉A,并将其沿销钉B和C的方向以8字形移动(例如,顺时针绕B,逆时针绕C)。每绕一圈,佩格A都会拿起另外两个乐队的曲子。您不能让配置的复杂性毫无限制地增长,因此需要某种方法来阻止事情失控。我建议对带子的长度施加最大限度的限制,这样任何试图把带子拉得太长的行为都会导致它折断(当然,在这种情况发生之前,你会有警告信号,例如带子变薄、颜色变化、不祥的吱吱声)。你如何有效地检测这些事件?最糟糕的情况是,你有
999
行组成了这个波段,在某些情况下,你不需要在每次移动(时间段)时重复所有这些行来检查你的事件吗?在确保正确性的同时,应该可以大量减少这些检查+1如果你稍微详细一点,它就缺少了“足够快”的部分:)。我处理这类问题的个人方法是先找到正确的解决方案,然后再担心以后会更快。您可能会发现,迭代1000个PEG已经足够快了(在C这样的语言中,当然是这样,但Flash可能非常慢)。但如果不是这样的话,通常可以通过空间分区来加快几何查询的速度:在本例中是四叉树。但更重要的是,为什么不限制木桩的数量呢?对任何人来说,放下1000个钉子都不是一件有趣的事。我发现很难想象拥有超过15个钉子会有多大的乐趣,所以限制在50个就足够了