橡皮筋和钉游戏

时间:2010-11-06 22:11:49

标签: algorithm geometry collision-detection

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

您如何解决最佳找到橡皮筋形状的问题?

我有2个想法,但我必须对它们进行一些处理。主要的想法是我们必须仅在“移动”操作时改变橡皮筋的形状,并且我们使用相同数量的钉子,只有一个是在改变位置:

  1. 凸包算法的推导。我们必须知道橡皮筋内部有钉子,外面是钉子。它可能会有点复杂。

  2. 我们只使用3个钉:2个锚和1个中间。 2个锚点形成1个中间桩的相互作用的边界线。在该生产线的活动侧,橡皮筋在2个锚钉和中间栓钉之间起到2段的作用。在非活动侧,1个中间栓可自由移动,而橡皮筋在2个锚钉之间起直线作用。对上述情况的警告是,存在这样的情况:在边界线的活动侧中的1个中间栓的移动可以导致2个段中的一个接触第4个栓钉。程序必须检测到这种情况并相应地更新新的锚钉。这些只是来自这个概念的一些有限经验的建议。开发人员应根据自己的经验和判断确定最佳方法。

  3. 你还有其他想法或建议吗?

1 个答案:

答案 0 :(得分:3)

“开发商应该根据他的经验和判断来确定最佳方法。” - 你从你给出的规范中复制并粘贴了这个吗? :)

你要求一个“最佳”的解决方案,但如果我是你,我的目标是“正确,快速”的解决方案。你已经签订了合同,你可以将渐近线留给学者们。

无论如何,你只有在玩家移动钉子时才更新乐队的计划看起来很好。我们需要记住所有接触橡皮筋的钉子,对于每个钉子,我们必须记住它所在的橡皮筋的哪一侧(为了正确地绘制带子)。

现在,假设玩家将钉子A从 a 移动到 a'

作为一般原则,值得注意的是,即使你的时间段很短,而且从 a a'的距离很小,但仍有可能发生多种事情。因此,您将不得不考虑该时间段中可能发生的所有事件,选择最早此类事件,相应地更新您的数据结构,然后继续剩余的时间段。

那有什么样的活动?

  • Peg A“拿起”乐队。 (如果挂钩A不在乐队中,那么它就会这样做,并且 a-a'线穿过乐队上钉之一的线。)
  • Peg A“放下”乐队。 (如果挂钩A在乐队上,邻居B和C,行 a-a'穿过B-C线,就会这样做。)
  • Peg A获得乐队的邻居。 (当钉子A在带子上时,会发生这种情况,B是A的邻居,而三角形 a-a' -B包含另一个钉子C。)
  • Peg A失去了乐队的邻居。 (当钉子A在乐队上时,这种情况就会发生,乐队上的相邻钉子会进入A-B-C,而钉子B则位于三角形中 a-a' -C。)

所以你应该确定所有这些事件;计算每个事件发生的时间;按时间排序事件;处理最早的事件(仅限);重复剩下的时间段。

(如果两个事件同时发生怎么办?我会根据你的经验和判断来做到这一点。)

编辑补充说:一个复杂因素是钉子可能出现在橡皮筋的多个部分上(例如,乐队可能会出现A-B-A-C-A)。但我认为上面的算法草图仍然有用。

进一步的皱纹是,即使使用少量钉子,您也可以对乐队进行任意扭曲的配置。例如,假设带子在钉子B和C之间拉伸。现在取钉子A并将其移动到钉子B和C周围的8字形(顺时针绕B,顺时针绕C,比方说)。每次围绕循环,钉子A拾取另外几个乐队。你不能让配置的复杂性无限制地增长,所以需要一些方法来阻止事情失控。我建议对乐队的长度施加一个最大限制,这样任何将它拉得太远的尝试都会使它突然消失(当然,在此之前你会有警告标志,例如乐队变得更薄,颜色变化,不祥的吱吱声)。