反射激光 - 算法任务

时间:2017-03-04 19:30:34

标签: c++ algorithm

我有以下任务:

激光:
在平面上排列的编号非常薄的双面镜。从激光束发出的一点 - 你的任务是看哪些镜子将反射光束。

入口:
在第一行中有4个浮点数lxlydxdy定义激光束来自的点的序列坐标以及遵循的方向。下一行是镜像n的数量。在以下n行中,有4个浮点数x1y1x2y2指定了开头和结尾的适当坐标镜子。编号从镜像1开始。

退出:
镜子的数量,随后从光束反射回来。选择测试使得光束总是从有限数量的镜子反射。

示例:

  

在:

     

1 1 1 0   
3   
4.5 0.5 5.5 1.5   
4 4 6 5   
5.5 2.5 4.5 3.5

  

输出:

     

1 3

图片方式:

Picture with way

我试图确定垂直线,并解决方程但它没有帮助。有人可以帮助我并指导我解决方案吗?

1 个答案:

答案 0 :(得分:0)

如此薄的东西建立在线段/射线测试之上。有几种方法可以执行此操作,但最简单的方法是将段的起点转换为0,0(减去所有点但不减去dx,dy)。然后旋转系统,使dy = 1.0。然后检查lx是否在段0上与翻译并旋转x2。

然后你需要回到真正的坐标空间,并创建一个新的光线,在交叉点处使用lx,并且dx,dy沿着镜像的法线反射(旋转法线使得ny为1并用它旋转dx,dy,翻转dy的符号,然后向后旋转)。然后你进行另一次迭代,直到你的所有交叉点测试都失败并且射线射到无限远。