我正在研究一个基本上减少到以下问题的问题:
假设:
(x,y)
分。集合中可能有0个点。x
以及y
值,其中最小值始终为非负值。r
确定是否可以在平面上的任何位置放置一个半径为r的圆,使圆圈在入界处,不包含任何点,如果是,则返回该位置。
允许交叉点 - 集合中的点可以与圆相交,但圆不能包含它们。圆可以切向接触最小和最大x和y值,但不能超出范围。
如果没有这样的位置,结果将是圆圈中心的(x,y)
点,或者一些虚拟结果(即(-1,-1)
)/失败。如果有多个有效的解决方案,则返回任何一个都没问题。
有关解决此类位置的算法的任何想法?我最终会在java中实现,但我可以使用psuedocode。
答案 0 :(得分:0)
答案
如果n是点数,我将告诉案例n >= 2
的解决方案。
你可以找到两个通过选定的2个点的圆圈。
如果圆圈在一个范围内并且它包含正好零点,则可以输出圆圈。
因此,您可以选择一对积分(p[i], p[j])
并检查所有圈子。
如果您不知道获得两个圈子的解决方案,请阅读此内容。
Circle of given radius through two points
您可以这样实现:
for i = 0 to n-1
for j = 0 to n-1
if dist(p[i], p[j]) <= 2 * r
circle c1, c2 = circle that goes through p[i] and p[j]
bool f1 = true
for k = 0 to n-1
if p[k] is in c1 -> f1 = false
if f1 is true -> return center of c1
bool f2 = true
for k = 0 to n-1
if p[k] is in c2 -> f2 = false
if f2 is true -> return center of c2
如果找不到,可以使用Monte Carlo Algorithm。
如果你无法在随机选择的数千个点中找到,我认为&#34;找不到&#34;没关系。
答案 1 :(得分:0)
构建{point}的Delaunay triangulation。对于每个点,请执行以下步骤。
在您的点周围画一个半径为2r的圆。如果所有相邻点都在圆圈内,则此点不好,继续下一个点。
如果不是,请考虑具有此顶点的所有三角形。它们形成一些凸多边形。如有必要,将其修剪到您所在地区的边界(它仍然很复杂)。现在,您需要找到半径为r的圆,该圆位于此多边形内部且不包含当前点。这是一个简单的几何练习(绘制一个与每对相邻边相切的半径为r的圆;如果任何这样的圆不包含点集中的任何点,则完成)。
你可以用各种方式加速它(例如,如果任何三角形的外接圆完全在你的矩形内,并且半径是r或更大,你就完成了。)