编写一个算法(伪代码)来计算θ的值,对应的光线及其反射一起通过集合P的最大点数。
例如,在该图中,角度θ1(由实线表示)的光线R1通过3个点,而角度θ2(由虚线表示)的光线R2仅通过2个点。只有当您的算法需要O(n log n)时间时,您才能获得完全的功劳。
...............................................
如果要找到θ的值使得平面上的最大点数位于入射光线上,我会做到这个问题。
那时我会通过将光线聚焦在每个点上来计算每个点的θ值,并存储数组中点的θ值。
然后我们的问题将减少到找到数组中重复元素的最大数量。这可以在O(n)时间内解决。
但我不知道如何处理反射光线。我在网上搜索但是徒劳无功。请帮忙。
答案 0 :(得分:4)
一种方法是使用method of images,它通过引入镜像点来取代反射的效果。在反射表面的另一侧。
假设镜像由平面y=-b
定义,则每个点(x_i, y_i)
将用于生成自身的反射版本。该额外点将具有相同的x坐标,但在与镜子对称相对的距离上具有y坐标,即-b - (y_i + b)
,即-2b - y_i
。 (在您的情况下,所有y_i都是负数。)每个点的这个反射版本精确地模拟了从镜子反射后到达原点的光线的几何形状。此后,我们可以忽略镜像,只需使用2N点。
因此,算法的伪代码可能会运行如下:
atan2(y_i, x_i)
。这需要时间N。答案 1 :(得分:1)
镜子的位置未指定,因此我们假设y = -1
具体。要将光线反射到(x, y)
点y > -1
,我们需要从(0, 0)
(x/(y+1), -1)
开始。这一点可以从观察得出,原点和反射点产生的直角三角形与目标和反射点产生的直角三角形相似。