在接受采访后,我有了这个问题,现在我没有任何好主意来解决它。
在二维平面上给出一个圆圈 在与中心距离最大的圆的边界内或上的输出积分点。中心和半径的坐标是浮点数。 任何极客都可以给我一些建议吗?
答案 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
呈线性关系,因此我认为你不能做得更好。