用于查找最大点数的算法

时间:2018-05-13 04:13:49

标签: algorithm computational-geometry point

设p = {P1(x1,y1),P2(x2,y2),.... 。 。 ,Pn(xn,yn)}是位于矩形内的一组n个点,使得没有一个点接触其边界。矩形的左上角位于原点O(0,0)。平面镜沿着矩形的下边缘放置(如图所示)。点光源位于O.光源可以以任何角度θ发射单一光线。

enter image description here

编写一个算法(伪代码)来计算θ的值,对应的光线及其反射一起通过集合P的最大点数。

例如,在该图中,角度θ1(由实线表示)的光线R1通过3个点,而角度θ2(由虚线表示)的光线R2仅通过2个点。只有当您的算法需要O(n log n)时间时,您才能获得完全的功劳。

...............................................

如果要找到θ的值使得平面上的最大点数位于入射光线上,我会做到这个问题。

那时我会通过将光线聚焦在每个点上来计算每个点的θ值,并存储数组中点的θ值。

然后我们的问题将减少到找到数组中重复元素的最大数量。这可以在O(n)时间内解决。

但我不知道如何处理反射光线。我在网上搜索但是徒劳无功。请帮忙。

2 个答案:

答案 0 :(得分:4)

一种方法是使用method of images,它通过引入镜像点来取代反射的效果。在反射表面的另一侧。

假设镜像由平面y=-b定义,则每个点(x_i, y_i)将用于生成自身的反射版本。该额外点将具有相同的x坐标,但在与镜子对称相对的距离上具有y坐标,即-b - (y_i + b),即-2b - y_i。 (在您的情况下,所有y_i都是负数。)每个点的这个反射版本精确地模拟了从镜子反射后到达原点的光线的几何形状。此后,我们可以忽略镜像,只需使用2N点。

因此,算法的伪代码可能会运行如下:

  • 使用在镜面下方生成一组额外的N个点 图像方法
  • 计算距离原点的每个2N点的角度, 使用atan2(y_i, x_i)。这需要时间N。
  • 按原点的角度对点进行分组,这是等效的 排序它们并检测列表中相邻值之间的变化, 这需要时间N(log N)。
  • 计算每组中的点数。 (这需要时间少于N.)
  • 找到成员人数最多的群组。

答案 1 :(得分:1)

镜子的位置未指定,因此我们假设y = -1具体。要将光线反射到(x, y)y > -1,我们需要从(0, 0) (x/(y+1), -1)开始。这一点可以从观察得出,原点和反射点产生的直角三角形与目标和反射点产生的直角三角形相似。