我有以下任务:
激光:
在平面上排列的编号非常薄的双面镜。从激光束发出的一点 - 你的任务是看哪些镜子将反射光束。
入口:
在第一行中有4个浮点数lx
,ly
,dx
,dy
定义激光束来自的点的序列坐标以及遵循的方向。下一行是镜像n
的数量。在以下n
行中,有4个浮点数x1
,y1
,x2
,y2
指定了开头和结尾的适当坐标镜子。编号从镜像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
图片方式:
我试图确定垂直线,并解决方程但它没有帮助。有人可以帮助我并指导我解决方案吗?
答案 0 :(得分:0)
如此薄的东西建立在线段/射线测试之上。有几种方法可以执行此操作,但最简单的方法是将段的起点转换为0,0(减去所有点但不减去dx,dy)。然后旋转系统,使dy = 1.0。然后检查lx是否在段0上与翻译并旋转x2。
然后你需要回到真正的坐标空间,并创建一个新的光线,在交叉点处使用lx,并且dx,dy沿着镜像的法线反射(旋转法线使得ny为1并用它旋转dx,dy,翻转dy的符号,然后向后旋转)。然后你进行另一次迭代,直到你的所有交叉点测试都失败并且射线射到无限远。