三角形内的最大曲面

时间:2013-04-23 14:33:35

标签: algorithm math geometry computational-geometry

我在准备a时遇到了以下有趣的问题 比赛。

你有一个长度为a, b, c的长三角形和一条长度为L的绳索。你需要找到 表面由绳索包围,具有最大的表面积,并且必须完全在三角形内。

所以,如果是L = a + b + c,那么它就是三角形的区域。

否则,我们知道圆圈的周长面积最大,所以如果L小于或等于三角形内切圆的周长,则该区域将是圆的面积周长L.

所以,剩下的情况是alfa < L < a + b + c,其中alfa是内切圆的周长。

任何想法都会很棒!

EDIT:我想知道是否应该专注于某种算法来解决这个问题 或试图找出一个数学公式。比赛包含两者的组合。边长度可以长达100,a,b,c,L的精度在小数点后是4位数。

4 个答案:

答案 0 :(得分:3)

由于圆圈具有最大的面积/周长,因此从inscribed circle开始。如果L小于该周长,则适当收缩。如果L更长,则增长3个弧中的任何一个使dA / dL最大化。我不知道是否有一个封闭的形状,但是最大的弧将位于三角形的第3个,并且两侧最接近平行。

在算法上解决这个问题应该是微不足道的。精度为4位小数,递增0.0001检查每个弧,看哪个弧的dA / dL最大。

我在一夜之间绘制了几何图形: Triangle with incircle 通过将每个角度二等分并找到平分线的交点来构造内切圆。我标记了半角“a1”(并且所有相关变量都为'1')。非圆形部分的面积是两个梯形(一个用红色轮廓表示)。我们可以将单个梯形的面积计算为L1 *(m1 + R)/ 2(注意,当L1,L2,L3都为零时,这些梯形都为零,我们只得到内切圆区域)。圆形帽的半径为m1,以保持与三角形边相切。对于给定的L1选择,m1 = R(x1-L1)/ x1。

从这里,您可以轻松计算三个扇区中每个扇区的周长和面积,并以数字方式求解。

我无法证明这是最大的区域,只是这是如何计算这种结构的面积和周长。

答案 1 :(得分:3)

在阅读了这个问题的答案后:https://math.stackexchange.com/questions/4808/why-circle-encloses-largest-area,我同意n.m.,并认为最佳曲线验证:

  • 当曲率接触三角形时,曲率要么是常数要么是平的,这意味着曲率由三角形边上的线段和圆弧组成,它们共用相同的半径。
  • 没有角度,这意味着弧线与三角形边相切。

利用这些条件,通过三个相同半径R的圆获得解,每个圆与三角形的两边相切(见下文)。当R在0和内切圆的半径之间变化时,我们从三角形本身开始,并结束到内切圆,其中所有三个圆都重合。曲线的长度是半径R的圆周长+较小三角形的周长(p):L = 2 * Pi R + p。该区域是较小三角形的区域(a)+半径为R的一个圆盘+剩余的矩形:A = Pi R ^ 2 + p * R + a。

The described supposed solution

答案 2 :(得分:2)

如果绳子的周长太小或太大,答案是微不足道的。有趣的情况是具有6个顶点的形状,其呈线 - 弧 - 线 - 弧 - 线 - 弧。弧与它们的相邻线相切并且它们的半径相等。我没有严格的证据,但想象一个充满空气并挤在三角形两侧之间的2D气球。

很容易表示整体形状,因此给出半径的周长;然后,在数字上很容易找到相反的方向(周长到半径)。

答案 3 :(得分:2)

..回答我自己的评论/问题,可以证明半径必须相等,

这是一个有用的公式:

enter image description here

灰色区域A是

A = r^2 ( alpha - Pi + 2/tan(alpha/2) ) /2

但更有用......弧长只是:

s = 2 ( b - A/r )
从这里可以直接看出三个半径必须相等:

书写绳索长度和封闭区域:

ropelength = trianglelength  - 2  Sum[r[i]  a[i]  ]
ropearea = trianglearea -  Sum[r[i]^2  a[i] /2 ]

,其中

 a[i]=( alpha[i] - Pi + 2/tan(alpha[i]/2) )
经过一些操作后,最大化区域会导致所有r [i]相等。注意三个a [i],ropelength,trainglearea,trianglelength都是你不需要计算的常量。小心翼翼地将r[l] = f( constants, r[2],r[3] ) sub解析为第二个表达式并解析为d ropearea /d r[2] = 0d /d r[3] = 0的结果:

r =(1/2) (triangle_length - rope_length) /(Sum(1/tan(alpha[i]/2)) - Pi)    

(a [i]的凌乱表达式最后只在最后一步被替换)。

ropearea = trianglearea - (trianglelength-ropelength)^2/(8 Sum[a[i])
     = trianglearea - (1/2)(trianglelength-ropelength)  r

编辑 - 一个有用的身份..与a,b,c,边长。

Sum(1/tan(alpha[i]/2))  = Sqrt( S^3 / ((S-a)(S-b)(S-c)) )
S = 1/2 (a+b+c)   ! S is semiperimeter not to be confused with arc length s 

以上表达式可用于再现内切圆的公式

 rinscribed = Sqrt( ((S-a)(S-b)(S-c))  / S )