输出距离中心距离最大的圆的边界内或边界上的积分点

时间:2015-09-29 13:51:16

标签: java c++ geometry point

在接受采访后,我有了这个问题,现在我没有任何好主意来解决它。

在二维平面上给出一个圆圈 在与中心距离最大的圆的边界内或上的输出积分点。中心和半径的坐标是浮点数。 任何极客都可以给我一些建议吗?

2 个答案:

答案 0 :(得分:0)

如果你正在寻找一个可以开始的地方,不要害怕思考一个可能会起作用的坏方法"。

这更像是一个数学/逻辑问题,而不是一个计算问题,一旦你知道如何做到这一点"手工"给予无限时间,用编程语言实现它应该是解决方案中更容易的部分。

例如......

我们的策略可能是:

列举所有"积分"这是在一个围绕圆圈的正方形(效率低下,但考虑到这将使你的大脑至少进入装备)。

1) 编写一个函数,输出该正方形中所有点的列表。 在C ++中,您可能希望实现

struct IntPoint{ int x; int y; };
std::vector<IntPoint> getPointsAroundCircle(float center, float radius);

2)循环遍历所有点。 弄清楚这些点中的哪些点实际上在(/上)圆圈中,并且&#34;记住&#34;哪一点距离最远。您可能希望实现以下辅助函数:

float distance(float center, float radius, const IntPoint & p);

提示:如何知道一个点与圆心的距离有助于我们判断它是否在圆圈内?

注意:涉及浮点数/双打数的计算(或更确切地说是比较)需要考虑舍入。您可能想要使用某种&#34; epsilon&#34;进行比较。作为宽容。 一些阅读材料,如果您有兴趣: Ruby's BigDecimal

3)完成所有要点之后,您就会知道要打印哪个点的x,y坐标。

答案 1 :(得分:0)

假设您的圈子位于(X,Y),半径为R

1)生成所有可能x的列表:

xList=[ceil(X-R):1:floor(X+R)]

2)搜索潜在的y s:

yUpperList=Y+sqrt(R^2 - (xList-X).^2)
yLowerList=Y-sqrt(R^2 - (xList-X).^2)

3)将y个候选者缩小为整数

yUpperList = floor(yUpperList)
yLowerList = ceil(yLowerList)

4)重新计算距离

distance=sqrt([yUpperList;yLowerList].^2 + [xList;xList].^2)

5)找到最大距离:

maxDistance = max(distance(:))

这会给你O(R)的复杂性。

我猜解决方案的大小与R呈线性关系,因此我认为你不能做得更好。