找回密码
 加入
搜索
查看: 9620|回复: 13

[效率算法] 已知四边形ABCD的边长AB,BC,CD,DA,以及面积S,求AC的长度。

 火.. [复制链接]
发表于 2013-1-26 11:49:37 | 显示全部楼层 |阅读模式
悬赏100金钱未解决
本帖最后由 虫洞 于 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,循环算出最近接近的两个值出来,但是假如精度再提高呢?

附件: 您需要 登录 才可以下载或查看,没有账号?加入
发表于 2013-1-26 12:39:18 | 显示全部楼层
MS海伦公式给错了~~

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10 确实是

查看全部评分

发表于 2013-1-26 12:40:41 | 显示全部楼层
这完全是数学题嘛

如果要用编程干脆用迭代试错

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10 感谢指点

查看全部评分

发表于 2013-1-26 12:46:36 | 显示全部楼层
本帖最后由 netegg 于 2013-1-26 12:59 编辑

海伦公式似乎算不了,平方根去不掉
大体思路,做两个相交圆,相交弦长为ac,并以ac为三角形一条边,分别在两个圆内做内置三角形,并在符合边长条件下求面积和
满足条件的情况可能是曲线,未必是定值

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10 看起来有点难度

查看全部评分

发表于 2013-1-26 12:49:25 | 显示全部楼层
再一看,不止海伦公式错了(周长$p少了个1/2),$P2也错了,甚至连后面的注释都错了~

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10

查看全部评分

发表于 2013-1-26 13:17:43 | 显示全部楼层
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个解

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10 多谢

查看全部评分

发表于 2013-1-26 13:48:36 | 显示全部楼层
本人出一个,等大神们的代码~
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

评分

参与人数 1金钱 +10 收起 理由
虫洞 + 10 感谢

查看全部评分

发表于 2013-1-26 14:27:54 | 显示全部楼层
本帖最后由 netegg 于 2013-1-26 15:17 编辑

不是四个值,目前已经就剩两个了,估计还能少一个
发表于 2013-1-26 15:19: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)=0
k大于0的值
发表于 2013-1-26 15:24:34 | 显示全部楼层
回复 9# netegg


    嗯,是啊
发表于 2013-1-26 15:24:49 | 显示全部楼层
回复 7# haijie1223

这样不行吧??比如说一个边长为1的正方形~~
问题在于如何准确地表达一个无理数~
你这里
( For $AC = $AB To ($AB + $BC))
步进值为1,显然是不合理的~
发表于 2013-1-26 15:27:48 | 显示全部楼层
回复 11# annybaby


    嗯  言之有理~
发表于 2013-1-26 16:24:36 | 显示全部楼层
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))  


然后用牛顿迭代计算
代码试验中
发表于 2013-1-26 18:08:13 | 显示全部楼层
本帖最后由 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^2
s是面积,abcd分别为四条边长,k是对角线的平方
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 00:55 , Processed in 0.080173 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表