如何从Java中的其他给定点中找到最远的点

时间:2019-05-29 20:10:15

标签: java math optimization geometry

我有给定的 S 点(在图表上为红色)和其他n个点(在图表上为黑色)。我想找到一个点 P ,该点与 S 的距离为1,这是距离所有黑点最远的点(在这种情况下,< strong> P ,每个点应该是最高的)。

graph

由于 P S 相距1,我们可以说y = √(1 - x^2)

我个人使用的剖析方法是:

  1. 计算距离之和
    • Q - P = √((Qx - Sx - x)^2 + (Qy - Sy - √(1 - x^2))^2)(重复所有n点并求和),
  2. 计算获得的表达式的导数,
  3. 计算导数的根并找到最大值(在域中)
  4. 计算域中间隔末尾的值,
  5. 选择正确的X。

在Java中最有效的方法是什么?可以使用哪些库?我听说有图书馆允许进行这种分析,但是听起来很复杂而且很慢,所以我一直在寻找任何数字思想,但找不到任何。

3 个答案:

答案 0 :(得分:1)

以小增量跟随圆的路径。计算沿圆的每个点的距离总和。找到距离总和最大的位置。做完了 java.lang.Math就足够了。无需额外的库。查找三角函数。

SP段的角度为phi。您从0到2 * pi(请记住它使用弧度)。在循环中增加phi的数量。

类似的东西:

  • phi = 0.0;
  • maxSumDistance = 0.0;
  • phiAtMaxValue = 0.0;
  • 进行循环:phi从0.0变为2 * pi,每次都会向phi添加一个小数字
  • 在循环内:如果(currentSumDistance> maxSumDistance),则 maxSumDistance = currentSumDistance;和 phiAtMaxValue = phi的当前值(循环变量);

在循环结束时,您将获得phi角度的值,其中距离总和最大。然后从phi重新计算P的坐标以及SP的距离。

这可能是蛮力的方法,但是为此计算导数似乎过大了,而且太复杂了。

答案 1 :(得分:0)

首先,对于这个问题,在最坏的情况下,O(N ^ 2)似乎还不错。因为每次调用成本函数的成本为O(N)。考虑这种情况:N个黑点位于另一个圆上(R> 1,S的中心),并将这个新圆分成N个相等的弧。在这种对称情况下,我们有N个最大值。仅检查它们就需要O(N ^ 2)-计算每个点的成本函数。因此,我认为在所有情况下检查所有局部极值的算法在最坏的情况下至少将具有O(N ^ 2)。

这是我的一般情况的解决方案草图:

  • 如果{Q_j}是黑点,让我们定义{O_j},以便每个O_j是最接近Q_j的点,它位于S周围的红色圆圈上。点{O_j}将圆圈分成n个弧。我们可以轻松地计算出每个O_j坐标。

  • 似乎我们要优化的成本函数在每个弧内只有一个局部极值(这部分需要更准确的证明),因此我们可以通过三元搜索找到这些极值-线性运算的复杂性。我们还需要检查O_j的局部极值-线性复杂度。

  • 总共,我们必须检查O(NlogN)点,每次检查花费O(N)。至少此方法比用小epsil检查圆上的每个点更方便。

答案 2 :(得分:0)

编辑:下面的算法无法按照注释中的说明运行。我将其保留在此处作为参考。

这可能有点天真,但是怎么样:

  • 找到所有黑点的平均值。这可以像 sum(x-coord)/ n和sum(y-coord)/ n。这个“平均”点很可能 不在圈子中。我们将此点称为“ A”
  • 从此画一条线 朝向S的平均点= | AS |
  • 沿同一行继续 直到到达S另一侧的圆为止 这一点O(对面)。您现在有了| ASO |行。
  • 可以计算
  • O,因为您知道圆的半径为1,并且根据定义,该点是红色圆上远离平均点A的最远点,并且从此处开始,圆上没有其他点是 远离所有黑点。

转角情况:如果所有黑点在原点周围都是点对称的(例如,一个点在-2,-2和一个点在2,2;那么上面的解将没有答案,因为A(平均点)等于S(原点0,0)。您可以再次检查A是否等于S,然后抛出异常。