找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1237|回复: 9

[编程申请]:已知三个弧,求弧上三点构成正三角形

[复制链接]
发表于 2006-12-14 11:51:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
已知R1、R2、R3分别为三个同心园半径,求顶点分别在这三个园上构成的正三角形的边长。如何作图?如何编程?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-12-14 12:59:49 | 显示全部楼层
已知条件不充分!因为R1、R2、R3是任意的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-12-14 16:28:45 | 显示全部楼层
加载程序,运行 3arc即可看到结果。
[php]
(defun C:3arc (/ oce cenpt r01 r02 r03 rlst rmin rmid rmax r1 r2 a1 b1 c1 d1 d2 l1 l2 l e1 e2 e3 e4 e5 quapt
                 obj1 obj2 obj3 obj4 obj5 intpts11 intpts12 intpts21 intpts22 pt11 pt12 pt13 pt21 pt22 pt23)
  (vl-load-com)
  (setq oldmode (getvar "osmode"))
  (setq oce (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (if (setq cenpt (getpoint "\n请输入圆心:"))
    (if        (and (setq r01 (getdist "\n请输入圆1半径:")))
      (if (and (setq r02 (getdist "\n请输入圆2半径:")))
        (if (and (setq r03 (getdist "\n请输入圆3半径:")))
          (setq        rlst (sort r01 r02 r03) rmin (car rlst) rmid (cadr rlst) rmax (caddr rlst))
        )
      )
    )
  )
  (if (and cenpt (> r01 1e-8) (> r02 1e-8) (> r03 1e-8))
    (progn
      (setq r1 (/ rmid rmax))
      (setq r2 (/ rmin rmax))
      (setq a1 (+ (sqr r1) (sqr r2) 1))
      (setq b1 (* (sqr (- (sqr r1) (sqr r2)))))
      (setq c1 (* 3 (- (* 2 a1) b1 3)))
      (setvar "osmode" 0)
      (command ".circle" cenpt rmin)
      (setq e1 (entlast))
      (setq obj1 (vlax-ename->vla-object e1))
      (command ".circle" cenpt rmid)
      (setq e2 (entlast))
      (setq obj2 (vlax-ename->vla-object e2))
      (command ".circle" cenpt rmax)
      (setq e3 (entlast))
      (setq obj3 (vlax-ename->vla-object e3))
      (if (>= c1 0)
        (progn
          (setq d1 (* 0.5 (+ a1 (sqrt c1))) d2 (* 0.5 (- a1 (sqrt c1))))
          (if (> d2 1e-8)
            (setq l1 (sqrt d1) l2 (sqrt d2) l (list (* rmax l1) (* rmax l2)))
            (setq l (list (* rmax (sqrt d1))))
          )
          (setq quapt (list (+ (car cenpt) rmax) (cadr cenpt)))
          (command ".circle" quapt (car l))
          (setq e4 (entlast))
          (setq obj4 (vlax-ename->vla-object e4))
          (setq intpts11 (vla-intersectwith obj4 obj1 acextendNone)
                intpts11 (vlax-variant-value intpts11)
                intpts11 (vlax-safearray->list intpts11)
                pt11 (list (car intpts11) (cadr intpts11))
                intpts12 (vla-intersectwith obj4 obj2 acextendNone)
                intpts12 (vlax-variant-value intpts12)
                intpts12 (vlax-safearray->list intpts12)
                pt12 (list (car intpts12) (cadr intpts12))
                pt13 (list (nth 3 intpts12) (nth 4 intpts12))
          )
          (if (equal (abs (- (angle quapt pt13) (angle quapt pt11))) (/ Pi 3) 1e-8) (setq pt12 pt13))
          (command ".Line" pt11 pt12 quapt "C")
          (command ".erase" e4 "")
          (if (= (length l) 2)
            (progn
              (command ".circle" quapt (cadr l))
              (setq e5 (entlast))
              (setq obj5 (vlax-ename->vla-object e5))
              (setq intpts21 (vla-intersectwith obj5 obj1 acextendNone)
                    intpts21 (vlax-variant-value intpts21)
                    intpts21 (vlax-safearray->list intpts21)
                    pt21 (list (car intpts21) (cadr intpts21))
                    intpts22 (vla-intersectwith obj5 obj2 acextendNone)
                    intpts22 (vlax-variant-value intpts22)
                    intpts22 (vlax-safearray->list intpts22)
                    pt22 (list (car intpts22) (cadr intpts22))
                    pt23 (list (nth 3 intpts22) (nth 4 intpts22))
              )
              (if (equal (abs (- (angle quapt pt23) (angle quapt pt21))) (/ Pi 3) 1e-8) (setq pt22 pt23))
              (command ".Line" pt21 pt22 quapt "C")
              (command ".erase" e5 "")
            )
          )          
          (setvar "osmode" oldmode)
          (setvar "cmdecho" oce)
          (princ)
        )
        (progn
          (princ "\n无解")
          (setvar "osmode" oldmode)
          (setvar "cmdecho" oce)
          (princ)
        )
      )
    )
  )   
)
(defun sqr (x) (* x x))
[/php]
首先说明的是,满足要求的这样的顶点可能有无数个,也可能不存在。如果解存在的话,其正三角形的边长确实完全可以确定的。(最多有两个解),而且完全可以用几何法确定。
我这里给出的程序不是圆弧,而是三个同心圆,程序画出了顶点分别在这三个圆上构成的正三角形。程序容易编写,但还是要考虑很多情况,以防止程序出错。
不足之处请指出了来,不知道这个lisp做什么用的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-12-14 18:01:56 | 显示全部楼层
to highflybird
代码中少了sort这个函数,能请补上么,谢谢
还不大看的明白您的解题原理,不知道对于同心圆和非同心圆时候能否通用。

这种问题感觉很象阿波尼斯问题,应该是有几何解法的,可能可以用射影几何的方法。

程序无解的情况可能有许多,比如对于三个直径很小的圆,类似点一样,只要点不形成等边三角形的时候就是无解的,也可能有无穷多的解,比如三个直径相同,圆心形成等边三角形的圆。

可能采用其他如proe,catia等可以施加约束条件的CAE程序求解会好一些。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-12-15 09:44:29 | 显示全部楼层
to snoopychen:
怪事得很,sort这个函数是个排序函数
例如 (sort  1 2 4 4 3 1)  返回值为:(1 1 2 3 4 4) ---是一个表。
从小到大排序后不删除同样大小的。
在CAD2004中不用定义的,是可直接用的。我试验了下,在cad2007中的确没有定义,只好用其他函数排序得出结果了。好象2004以后的版本删除了一些内定的函数,例如:SORT ,MIDP,等。
郁闷,该删的没有删除,不该删除的反而删除了。

关于这个问题的解,如下:
设大圆半径为1 ,其他两个圆半径为r1 ,r1则解得其正三角形的边长为:
sin(Pi/4)*sqrt( (r1^2+r2^2+1)-sqrt(-3(r1^2-r2^2)^2+6r1^2+6r^2-3))
因而从最后结果看,最大根次为二次,完全可以用作图法得出。

另外,我想说的是:顶点的位置的确可以有无穷多个解,但这个等边三角形的边长确实最多只有两个解。即使对于三个直径相同的同心圆,其等边三角形也只有一个边长,而不是无数个。

当然用 proe之类的CAE软件,完全不用这么复杂了,可惜我不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-15 14:02:34 | 显示全部楼层
感谢各位高手的解答和讨论。3ARC.lsp运行错误,如何解决?能把程序调整一下吗?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-12-15 15:42:59 | 显示全部楼层
请楼主说明是什么运行错误。

如果是sort函数的错误,你把下面一段代码加上即可:

(defun sort (a b c / lst lst1)
  (setq lst (list a b c))
  (setq lst1 (vl-sort-i lst '<))
  (mapcar '(lambda (x) (nth x lst)) lst1)
)

实属画蛇添足。想必楼主有更好的方法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-12-15 15:46:41 | 显示全部楼层
to highflybird
:)看了r14~R2004的帮助,也没有sort这个函数啊:)

请怪我看错问题了,我只是匆忙的看到了三弧,没有注意同心圆。

下面先给出几何做法
1)如图1,在大圆中先作出等边三角形OAB
2)把小圆从O处拷贝到B处,该圆和中圆交于C和C'(正如highflybird说的,有两个解或者一个解或者无解,则交与不交)
3)则以CA和C'A为所求的等边三角形边长

这个可以通过三角形AOD和ABC全等很简单地证明

对于非同心圆,个人感觉要复杂许多,如图2,有无穷多解,无解,及有解但可能得用循环求解等几种情况,所以个人当时建议是采用在其他软件中添加约束的方法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-12-15 16:00:28 | 显示全部楼层
to  snoopychen:

你的方法很好,很妙。又学了一招。
如果有空的话,不妨去明经通道论坛上的几何算法版块去看看。

是的,在cad2004帮助中的确找不到关于sort函数
其实还有个函数 sort1也是cad2004内定的,到现在我都弄不清它的用法呢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-22 16:41:18 | 显示全部楼层
谢谢!他的解题思路是什么呀!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:48 , Processed in 0.273487 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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