【问题标题】:reflection paths between points in2d二维中点之间的反射路径
【发布时间】:2010-04-20 00:42:27
【问题描述】:

只是想知道是否有一个很好的(已经实现/记录的)算法来执行以下操作
boo! http://img697.imageshack.us/img697/7444/sdfhbsf.jpg
给定任何形状(没有交叉边缘)和该形状内的两个点,计算两个点之间的所有路径,使得所有反射都是完美反射。路径长度应限制在一定长度,否则会有无限解。我对仅仅射出光线来猜测我能接近多远不感兴趣,我对可以完美做到这一点的算法感兴趣。基于搜索,而不是基于猜测/改进。

【问题讨论】:

    标签: algorithm math search geometry


    【解决方案1】:

    我认为你可以做得比计算爱好者更好。拨打您的积分AB。您想找到从AB 的反射路径。

    首先在边缘反射A,然后调用反射A1。你能从A1B 画一条只碰到那个边缘的线吗?如果是,则意味着您有一条从AB 的路径,该路径反映在边缘。对所有边缘执行此操作,您将获得所有存在的单个反射路径。使用反射的属性构建这些路径应该很容易。在此过程中,您需要检查路径是否合法,即它们不会跨越其他边缘。

    您可以通过在所有边缘反射A 的所有第一代反射,并检查是否可以从这些点通过反射边缘到B 绘制一条线,从而继续找到由两个反射组成的路径.继续搜索,直到反射点与B 的距离超过阈值。

    我希望这是有道理的。它应该比追粉丝和处理他们的分手更容易,即使你仍然需要做一些工作。

    顺便说一下,这是在各种几何形状的桌子上经过充分研究的台球领域的一角。当然,台球从桌子的一侧反弹,就像光线从镜子反弹一样,所以这只是思考反射的另一种方式。您可以使用 polygonal billiards unfolding illumination 之类的搜索词来深入研究这一点,尽管数学家倾向于寻找多边形表上两点之间没有泳池镜头的情况,而不是直接解决您提出的问题。

    【讨论】:

    • 起初这看起来很简单,但是一旦您反射 A 点,您就扩大了房间,当重复此操作时,您似乎可以创建与原始房间重叠的房间的反射副本。我想一些好的簿记可能会解决这个问题。
    • 同意,这并不像听起来那么容易。你是对的,从某种意义上说,整个房间都在反映这一点。但我相信你可以忽略这一点,只看从反射点到B 是否有一条直线穿过反射边缘。如果是这样,您将重构从AB 的反射路径。但那条路径可能会穿过房间的其他边缘,在这种情况下你会拒绝它。如果您反映了整个房间,您可能会更早发现这一点,但正如您所说,这可能涉及大量簿记。
    【解决方案2】:

    不要从光线的角度考虑,而是从风扇的角度考虑。扇形将是从一个点发出并撞击墙壁的所有光线。然后,您可以检查风扇是否包含第二个点,如果包含,您可以确定是哪条光线击中它。一旦风扇撞到墙壁,您可以通过将其原点转移到墙壁外部来计算反射风扇 - 通过这样做,所有风扇基本上都是三角形的。当风扇部分撞到墙上并且必须分解成碎片才能继续时,会出现一些并发症。无论如何,由于您限制了总距离,因此可以先遍历广度优先或深度优先的这棵反射扇形树。

    您可能还想研究光能传递方法,这可能与我刚刚描述的类似,但通常在 3d 中完成。

    【讨论】:

    • 是的。这就是我正在做的事情。这是相当乏味的代码。
    • @Akusete - 反射的扇形可以表示为截断的三角形 - 切成 4 面的图形......好吧 3 面,因为在您检查交叉点和裂口之前不知道远墙。
    【解决方案3】:

    我不知道此类问题的任何现有解决方案。如果你找到一个,祝你好运,但如果你没有迈出完整但指数(关于行数)的第一步,那就是将它分成两部分:

    1. 给定墙 A、B、C 和点 P1、P2 的有序子集,计算路线是否可行(无解或唯一解)。

    2. 然后生成你的墙的排列,直到你超过你想到的任何限制。

    第一部分可以通过一组简单的方程来求解,以找到每次光线反弹所需的角度。然后根据现有线路检查每条线路是否有冲突会告诉你该路径是否可行。

    方程组的参数是

    angle_1 = normal of line A with P1
    angle_2 = normal of line B with intersection of line A
    angle_3 = normal of line C with ...
    angle_n = normal of line N-1 with P2
    

    每个参数都受到下一行的约束,这可能不是线性的(我没有检查过)。如果不是,那么您可能必须选择合适的数值非线性求解器。

    【讨论】:

      【解决方案4】:

      对大脑堵塞的反应
      你仍然需要楔子......
      alt text http://img72.imageshack.us/img72/6959/ssdgk.jpg
      在这种情况下,你怎么知道不做第二次反思呢?你怎么知道什么墙可以反射?

      【讨论】:

      • 对于任何一代的反射点,考虑你反射它的边缘,看看你是否可以画一条线到只穿过那个边缘的水槽。对应于 I 和 II 的边是右下角和左下角 - 称它们为 E 和 EE。您不能从 I 画一条线到穿过 E 的水槽,II 和 EE 也是如此。所以他们不是候选人。但是,要回答您的问题,没有任何方法可以确定在墙上反射是否有意义 - 据我所知,您只需要尝试一下即可。 (继续下一条评论)
      • (接上一条评论)另一方面,如果您反射穿过右侧墙,然后穿过顶墙,您就成功了 - 但直到第二次反射您才知道。同样,当路径(即使成功)太长时,您也会停止思考。但除此之外,您只需按照搜索树即可。
      • 是的,要检查 M 个墙壁的 N 个反射,您必须检查 M^N 个“房间”。如果您使用扇形/楔形,您只会遍历反射树中实际可能的部分,因此 (kM)^N 其中 k 是扇形撞击墙壁的平均分数。
      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多