只是想知道是否有一个很好的(已经实现/记录)算法来执行以下操作
boo! http://img697.imageshack.us/img697/7444/sdfhbsf.jpg
给定任何形状(没有交叉边缘)和该形状内的两个点,计算两个点之间的所有路径,使得所有反射都是完美的反射。路径长度应限制在一定长度,否则会有无限的解决方案。我对拍摄光线不感兴趣,试图猜测我能接近多远,我对可以完美做到的算法感兴趣。基于搜索,而不是基于猜测/改进。
答案 0 :(得分:3)
我认为你可以比计算粉丝做得更好。拨打您的积分A
和B
。您想要查找从A
到B
的反射路径。
首先在边缘反映A
,然后调用反射A1
。你可以画一条从A1
到B
只能击中那条边的线吗?如果是,则表示您拥有从A
到B
的路径,该路径反映在边缘。对所有边缘执行此操作,您将获得所有存在的单个反射路径。使用反射属性构建这些路径应该很容易。在此过程中,您需要检查路径是否合法,即它们不会跨越其他边缘。
您可以通过反映A
在所有边缘的所有第一代反射,并检查是否可以从这些点通过反射边缘绘制线条来继续查找包含两个反射的路径{ {1}}。继续进行此搜索,直到B
的反射点距离超过阈值。
我希望这是有道理的。它应该比追逐粉丝和处理他们的分手更容易,即使你仍然需要做一些工作。
顺便说一句,这是一个在各种几何形状的桌子上研究良好的台球领域的一个角落。当然,台球从桌子的侧面反弹,就像光从镜子反射一样,所以这只是思考反射的另一种方式。您可以使用B
之类的搜索词来深入研究这个问题,尽管数学家倾向于寻找多边形桌上两点之间没有池射击的情况,而不是直接解决您提出的问题。
答案 1 :(得分:2)
不要考虑光线而是粉丝。风扇将是从一个点发出并撞击墙壁的所有光线。然后,您可以检查风扇是否包含第二个点,如果是,您可以确定哪个光线击中了它。一旦风扇撞到墙壁,你可以通过将它的原点转移到墙的外面来计算反射的风扇 - 通过这样做,所有风扇基本上都是三角形的。当风扇部分撞到墙壁并且必须被分成碎片以继续时,存在一些复杂性。无论如何,由于你限制了总距离,所以这个反射扇的树可以先穿过宽度,也可以先穿过深度。
您可能还想查看光能传递方法,这可能与我刚才描述的方法类似,但通常用3d完成。
答案 2 :(得分:0)
我不知道这个问题的任何现有解决方案。如果你找到一个,祝你好运,但是如果你没有迈出完整但指数的第一步(关于行数)会将它分成两部分:
给定墙A,B,C和点P1,P2的有序子集,计算路线是否可行(无解决方案或单一唯一解决方案)。
然后生成你的墙壁的排列,直到你超出你想到的任何限制。
第一部分可以通过一组简单的方程来求解,以找到每条射线反弹所需的角度。然后根据现有线路检查每条线路是否有冲突,可以告诉您路径是否可行。
方程组的参数将是
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
每个参数都受限于下一行的约束,这可能不是线性的(我没有检查过)。如果它们不是那么你可能不得不选择合适的数字非线性求解器。
答案 3 :(得分:0)
回应脑筋急转弯
你还需要楔子......
alt text http://img72.imageshack.us/img72/6959/ssdgk.jpg
在这种情况下,你怎么知道不做第二次反思?你怎么知道哪些墙壁有意义反映过来?