我有一个有趣的问题,我在过去的一段时间里一直在努力解决:
我在2D xy平面上有3个圆,每个圆都具有相同的已知半径。我知道三个中心的坐标(它们是任意的,可以在任何地方)。
可以画的最大的三角形是什么,使得三角形的每个顶点都位于一个单独的圆上,这些顶点的坐标是什么?
我已经研究这个问题好几个小时了,问了很多人,但到目前为止,只有一个人能提出一个合理的解决方案(尽管我没有办法证明这一点)。
我们提出的解决方案包括首先创建一个围绕三个圆心的三角形。接下来,我们分别查看每个圆,并计算通过该圆的中心并垂直于相对边的直线的方程。然后我们计算圆的两个交点。然后,对接下来的两个圆执行此操作,结果为6点。我们迭代这6个点创建的8个可能的3点三角形(限制是大三角形的每个点必须在一个单独的圆上),并找到最大尺寸。
结果看起来是合理的(至少当绘制在纸上时是这样),并且它通过了当圆的中心都落在一条直线上的特殊情况(给出了一个已知的最大三角形)。不幸的是,我无法证明这是正确的还是错误的。
我想知道是否有人遇到过类似的问题,如果有,你是如何解决的?
注意:我理解这主要是一个数学问题,而不是编程,但它将在代码中实现,它必须进行优化,以非常快和有效的运行。事实上,我已经有了上面的解决方案的代码,并且测试是有效的,如果你想看一看,请让我知道,我选择不张贴它,因为它都是矢量形式的,几乎不可能弄清楚到底发生了什么(因为它已经被压缩以提高效率)。
最后,是的,这是为了学校作业,尽管它不是一个家庭作业问题/作业/项目。这是我的毕业论文的一部分(我想这是非常非常小的一部分,但从技术上讲仍然是其中的一部分)。
谢谢你的帮助。
编辑:这是我不久前想出的一个新算法。
从一个圆的中心开始,画一条线到另外两个中心。计算将创建的角度一分为二的直线,并计算圆与通过圆中心的直线之间的交点。您将获得2个结果。对其他两个圆重复此操作,总共得到6个点。迭代这6个点,得到8个可能的解决方案。找到8个解决方案中的最大值。
如果你在围绕这三个点的一个“方向”上画线,这个算法将处理共线的情况。
从我尝试使用CAD软件为我找出几何形状的几次随机试验中,这种方法似乎优于前面提到的所有其他方法,然而,它已经被维克多的一个反例证明不是最佳解决方案。
我将在明天编写代码,由于某些原因,我失去了对我的大学计算机的远程访问,大多数东西都在上面。
发布于 2010-04-07 07:31:02
我的第一个想法是,你应该能够找到一个解析的解决方案。
那么圆的方程式是:
(x1-h1)^2 + (y1-k1)^2 = r^2
(x2-h2)^2 + (y2-k2)^2 = r^2
(x3-h3)^2 + (y3-k3)^2 = r^2三角形的顶点是(x1,y1)、(x2,y2)和(x3,y3)。三角形的边长是
A = sqrt((x1-x2)^2 + (y1-y2)^2)
B = sqrt((x1-x3)^2 + (y1-y3)^2)
C = sqrt((x2-x3)^2 + (y2-y3)^2)所以三角形的面积是(使用Heron's formula)
S = (A+B+C)/2
area = sqrt(S(S-A)(S-B)(S-C))所以面积是6个变量的函数。
在这一点上,我意识到这不是一条富有成效的推理路线。这更像是我放入模拟退火系统中的东西。
因此,我的第二个想法是选择圆上以A为中心的点,如下所示:构建连接其他两个圆的圆心的直线BC,然后构建垂直于BC并通过A的线AD。三角形的一个顶点是AD和以A为中心的圆的交点。其他顶点也是如此。我无法证明这一点,但我认为它给出的结果不同于简单的“离所有圆圈的中心最远”的方法,而且出于某种原因,它对我来说感觉更好。我知道,数学不是很好,但我是个程序员。
https://stackoverflow.com/questions/2588943
复制相似问题