我只是想知道是否有一个很好的(已经实现/记录的)算法来做以下事情
boo! http://img697.imageshack.us/img697/7444/sdfhbsf.jpg
给定任何形状(没有交叉边)和该形状内部的两个点,计算两个点之间的所有路径,使所有反射都是完美的反射。路径长度应该限制在一定的长度内,否则会有无限多的解。我不感兴趣的仅仅是射出光线来尝试猜测我可以接近的距离,我感兴趣的是可以完美做到这一点的算法。基于搜索,而不是基于猜测/改进。
发布于 2010-04-20 09:27:20
不是从光线的角度考虑,而是从粉丝的角度考虑。扇子就是所有从一点射出的光线打在墙上的光线。然后,您可以检查风扇是否包含第二个点,如果包含,则可以确定是哪条射线击中了它。一旦风扇撞到墙上,你可以通过将其原点转置到墙上来计算反射的风扇-通过这样做,所有的风扇基本上都是三角形的。当风扇部分撞到墙上时,会有一些复杂的情况,必须将风扇打碎才能继续。无论如何,由于限制了总距离,所以可以先遍历广度优先或深度优先的反射扇树。
您可能还想研究光能传递方法,这可能类似于我刚才描述的方法,但通常是在3d中完成的。
发布于 2010-04-20 11:44:56
我认为你可以比计算粉丝做得更好。称你的点数为A和B。您希望找到从A到B的反射路径。
首先在边上反射反射,然后调用A A1。你能画一条从A1到B的线,只碰到那条边吗?如果是,这意味着您有一条从A到B的路径在边缘上反射。对所有的边都这样做,你就会得到所有存在的单一反射路径。使用反射的属性构建这些路径应该很容易。在此过程中,您需要检查路径是否合法,即它们不会与其他边相交。
通过在所有边中反射A的所有第一代反射,并检查是否可以通过反射边从这些点绘制一条线到B,可以继续查找由两个反射组成的路径。继续执行此搜索,直到反射点与B的距离超过阈值。
我希望这是有意义的。这应该比追逐粉丝和处理他们的分手要容易得多,即使你仍然需要做一些工作。
顺便说一句,这是一个研究得很好的台球场的一角,桌上有各种几何形状的桌子。当然,台球从桌子侧面反弹的方式与光线从镜子上反弹的方式相同,所以这只是思考反射的另一种方式。你可以使用像polygonal billiards unfolding illumination这样的搜索词来深入研究这个问题,尽管数学家倾向于寻找在多边形表上的两个点之间没有台球的情况,而不是直接解决你提出的问题。
发布于 2010-04-20 08:55:46
我不知道任何现有的解决方案来解决这个问题。祝你好运,如果你找到了一个,但如果你没有找到一个完整的指数(关于行数)的第一步将是把它分成两部分:
给出墙A,B,C的有序子集和点P1,P2,计算是否有可能的路径(要么没有解,要么一个唯一的solution).
第一部分可以通过一组简单的方程来求解,以找到每次光线反弹所需的角度。然后,检查每条线路与现有线路的冲突,就会告诉您该路径是否可行。
方程式系统的参数为
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每个参数都受到命中下一行的约束,这可能不是线性的(我还没有检查过)。如果它们不是,那么您可能不得不选择合适的数值非线性求解器。
https://stackoverflow.com/questions/2671826
复制相似问题