已知四边形ABCD的边长AB,BC,CD,DA,以及面积S,求AC的长度。
本帖最后由 虫洞 于 2013-1-27 00:39 编辑已知值
AB长度$AB
BC长度$BC
CD长度$CD
DA长度$DA
四边形ABCD的面积$S
请问怎么计算出AC的长度
我先给出面积计算公式,假设AC长度为$AC($AC是最后要求的)
$p1 = ($AB+$BC+$AC)/2
$sABC = Sqrt($p1*($p1-$AB)*($p1-$BC)*($p1-$AC));三角形ABC的面积
$p2 = ($AB+$BC+$AC)/2
$sACD = Sqrt($p2*($p2-$DA)*($p2-$CD)*($p2-$AC));三角形ABC的面积
$S = $sABC + $sACD
请问才能求出AC的长度,根据已知条件,AC的长度一般有三种,1:不存在符合AC的条件;2:存在一个符合AC的条件;3:存在两个符合AC的条件
不好意思,之前公式给错,但应该不影响大家的思考,我有个思路,就是用步长位0.0000001,循环算出最近接近的两个值出来,但是假如精度再提高呢? MS海伦公式给错了~~ 这完全是数学题嘛
如果要用编程干脆用迭代试错 本帖最后由 netegg 于 2013-1-26 12:59 编辑
海伦公式似乎算不了,平方根去不掉
大体思路,做两个相交圆,相交弦长为ac,并以ac为三角形一条边,分别在两个圆内做内置三角形,并在符合边长条件下求面积和
满足条件的情况可能是曲线,未必是定值 再一看,不止海伦公式错了(周长$p少了个1/2),$P2也错了,甚至连后面的注释都错了~
{:face (288):} http://www.e-tutor.com/et2/graphing
里面输下 sqrt(((2+x)/2)*(((2+x)/2)-1)*(((2+x)/2)-1)*(((2+x)/2)-x))+sqrt(((4+x)/2)*(((4+x)/2)-2)*(((4+x)/2)-2)*(((4+x)/2)-x))
点graph 随便换几个参数 发现出来的图型很有型啊
我一直怀疑这个方程在特定值上有4个解 本人出一个,等大神们的代码~
Dim $AB, $BC, $CD, $AD
Dim $S
Dim $AC
Dim $P1, $p2
Dim $flag = 0
GUICreate("求对角线", 400, 300)
$ABl = GUICtrlCreateInput("3", 100, 50)
$BCl = GUICtrlCreateInput("4", 100, 90)
$CDl = GUICtrlCreateInput("3", 100, 130)
$ADl = GUICtrlCreateInput("4", 100, 170)
$Ss = GUICtrlCreateInput("12", 100, 210)
$B = GUICtrlCreateButton("计算", 100, 260, 80)
GUICtrlCreateLabel("输入AB的长", 20, 50)
GUICtrlCreateLabel("输入BC的长", 20, 90)
GUICtrlCreateLabel("输入CD的长", 20, 130)
GUICtrlCreateLabel("输入AD的长", 20, 170)
GUICtrlCreateLabel("输入面积S", 20, 210)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $B
$AB = GUICtrlRead($ABl)
$BC = GUICtrlRead($BCl)
$CD = GUICtrlRead($CDl)
$AD = GUICtrlRead($ADl)
$S = GUICtrlRead($Ss)
count()
EndSwitch
WEnd
Func count()
For $AC = $AB To ($AB + $BC)
$P1 = ($AB + $BC + $AC) / 2
$p2 = ($AD + $CD + $AC) / 2
If Sqrt($P1 * ($P1 - $AB) * ($P1 - $BC) * ($P1 - $AC)) * 2 = $S Then
MsgBox(0, "", "对角线AC的长度为:" & $AC)
$flag = 1
Else
If $AC = ($AB + $BC) And $flag = 0 Then MsgBox(0, "", "该尺寸的四边形不存在!")
EndIf
Next
$flag = 0
EndFunc ;==>count
本帖最后由 netegg 于 2013-1-26 15:17 编辑
不是四个值,目前已经就剩两个了,估计还能少一个 本帖最后由 netegg 于 2013-1-26 15:31 编辑
回复 7# haijie1223
步长都没有,算出来的可能性太小了m1 = (a + b)^2
m2 = (a - b)^2
n1 = (c + d)^2
n2 = (c - d)^2
k =e^2
((m1+m2+n1+n2)^2- 4*4 * s^2 + (m1 * m2 + n1 * n2))*k^2+2*(m1+m2+n1+n2)*(4 * s^2 + (m1 * m2 + n1 * n2))*k +(4 * s^2 + (m1 * m2 + n1 * n2)=0k大于0的值 回复 9# netegg
嗯,是啊 回复 7# haijie1223
这样不行吧??比如说一个边长为1的正方形~~
问题在于如何准确地表达一个无理数~
你这里
( For $AC = $AB To ($AB + $BC))
步进值为1,显然是不合理的~ 回复 11# annybaby
嗯言之有理~ http://zh.numberempire.com/derivativecalculator.php
在线求导
函数 1/4*sqrt((a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c)) 的导数,关于 c求导 :
-(c^3+(-b^2-a^2)*c)/(2*sqrt(-c+b+a)*sqrt(c-b+a)*sqrt(c+b-a)*sqrt(c+b+a))
然后用牛顿迭代计算
代码试验中 本帖最后由 netegg 于 2013-1-26 18:38 编辑
Ak^2+Bk+C=0
;其中
;A=5*a^4+6*a^2*b^2+5*b^4+8*a^2*c^2+8*b^2*c^2+5*c^4+8*a^2*d^2+8*b^2*d^2+6*c^2*d^2+5*d^4-4*s^2
;B=4*(a^2+b^2+c^2+d^2)*(a^4-2*a^2*b^2+b^4+c^4-2*c^2*d^2+d^4+4*s^2)
;或者4*( a^2 + b^2 + c^2 + d^2) ((a^2 - b^2)^2 + (c^2 - d^2)^2 + 4 s^2)
;C=a^4-2*a^2*b^2+b^4+c^4-2*c^2*d^2+d^4+4*s^2
;或者(a^2 - b^2)^2 + (c^2 - d^2)^2 + 4 s^2s是面积,abcd分别为四条边长,k是对角线的平方
页:
[1]