【发布时间】:2015-04-11 14:25:40
【问题描述】:
我有一个问题,我需要找到小于或等于给定距离 D 到二维欧几里得平面中绘制的直线的最大点数。为了解决这个问题,我编写了算法,如果直线与 x 轴或 y 轴正交,则该算法将计算可能的最大值。我的问题是只有一条对角线会产生最大的点数。
考虑到 x 和 y 的最小值为 -1000000 和最大值为 1000000 的约束。我编写了以下算法来尝试找出最大值。我似乎没有得到正确的答案。有人可以指导我哪里出错了。我也尝试过绘制回归线,但使用的垂直距离对我的目的不起作用。也许我错了,这个问题可以作为一个优化问题来解决。无论如何,非常感谢您对血统解释的任何帮助。
// diagonal sweep
for (int degree = 1; degree < 180; degree++) if (degree % 90 != 0)
{
int k = 1, degrees = degree;
double x1 = -1000000, x2 = 1000000;
if (degree > 90 && degree < 180)
{
degrees = 180 - degrees;
k = -1;
}
//slope
double m1 = Math.Tan(Math.PI * degrees * k / 180.0);
//Point A
Point A = new Point(x1, m1 * x1);
//Point B
Point B = new Point(x2, m1 * x2);
for (int i = 0; i < x.Length; i++)
{
//Point P = household that needs power
Point P = new Point(x[i], y[i]);
double normalLength = Math.Sqrt((B.X - A.X) * (B.X - A.X) + (B.Y - A.Y) * (B.Y - A.Y));
double segmentLength = 1d * Math.Abs((P.X - A.X) * (B.Y - A.Y) - (P.Y - A.Y) * (B.X - A.X)) / normalLength;
if (segmentLength <= D)
tempCnt++;
}
maxConnections = Math.Max(maxConnections, tempCnt);
tempCnt = 0;
}
return maxConnections;
【问题讨论】:
-
不完全确定我理解你的意图。您从 0 到 180 度数循环,然后以该角度创建一条线......但是通过哪个原点?
-
这是怎么回事?你在某处有很多点,必须通过它们回归一条线,然后选择距离它一定距离的所有点?因为 OP 文本和代码让我感到困惑(文本暗示你不知道点和代码是暴力破解点和线)所以什么是知道的,什么是未知的?如果点未知,它们是否在某个网格上? (我不是 C# 编码器,所以我可能会遗漏一些东西)
-
顺便说一句:stackoverflow.com/a/20888844/2521214 可能会有所帮助
-
@Spektre 这些点是已知的。我首先使用变量 x1 和 x2 分别为 A 点和 B 点创建线段 AB。点 P 是我要测量的与线段 AB 的垂直距离的点。唯一没有显示的是点类和数组 X 和 Y,它们的点 P 的坐标为 x[i] 和 y[i]
-
那么我上一条评论中的链接(从一组已知点中查找行)就是您所需要的。请注意,没有找到最佳解决方案,只是接近它。从中您可以添加关闭点选择...如果您想要最佳解决方案然后搜索线回归...
标签: c# algorithm geometry brute-force