找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 519|回复: 0

[原创]:马尔法蒂问题的lisp求解

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-11-10 15:07:54 | 显示全部楼层 |阅读模式

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

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

×
所谓的马尔法蒂问题是:
在一个已知三角形内画三个圆,每个圆与其它两个圆以及三角形的两边相切。
这个问题有几何解,即用纯几何法来完成。
我这里编写了一个lisp程序求解。
加载程序,在CAD下运行mal 即可。

  1. ;;*****************************************************************************
  2. ;;马尔法蒂问题lisp求解---------------------------------------------------------
  3. (defun C:Mal (/           pa        pb   pc          a    b    c         p    xa   xb        xc
  4.               ya   yb        yc   aga  agb  agc  ang         ta   tb   tc        ja
  5.               jb   jc        ha   hb          hc   vpa  vpb         vpc  cen  ra        rb
  6.               rc   la        lb   lc          cena cenb cenc
  7.              )
  8. ;;(defun C:Mal ()
  9.   (graphscr)
  10.   (setq oldmode (getvar "osmode"))
  11.   (setq oce (getvar "cmdecho"))
  12.   (setvar "cmdecho" 0)
  13.   ;;输入数据
  14.   (command ".ucs" "W")
  15.   (setq pa (getpoint "请输入第一点:\n"))
  16.   (setq pb (getpoint "请输入第二点:\n"))
  17.   (setq pc (getpoint "请输入第三点:\n"))
  18.   (command ".ucs" "O" pa)
  19.   (setq        pa (trans pa 0 1)
  20.         pb (trans pb 0 1)
  21.         pc (trans pc 0 1)
  22.   )
  23.   ;;求三角形边长和半周长  
  24.   (setq        a (distance pb pc)
  25.         b (distance pc pa)
  26.         c (distance pa pb)
  27.         p (/ (+ a b c) 2)
  28.   )
  29.   ;;计算切线长
  30.   (setq        xa (sqrt (abs (- (* p p) (* p a))))
  31.         xb (sqrt (abs (- (* p p) (* p b))))
  32.         xc (sqrt (abs (- (* p p) (* p c))))
  33.   )
  34.   (setq        ya (sqrt (* p a))
  35.         yb (sqrt (* p b))
  36.         yc (sqrt (* p c))
  37.   )
  38.   (setq        aga (angle '(0 0) (list xa ya))
  39.         agb (angle '(0 0) (list xb yb))
  40.         agc (angle '(0 0) (list xc yc))
  41.   )
  42.   (setq ang (/ (+ aga agb agc) 2))
  43.   (setq ta (* p (* (sin (- ang aga))) (* (sin (- ang aga)))))
  44.   (setq tb (* p (* (sin (- ang agb))) (* (sin (- ang agb)))))
  45.   (setq tc (* p (* (sin (- ang agc))) (* (sin (- ang agc)))))
  46.   ;;***************************************************************************
  47.   ;;求三角形内心---------------------------------------------------------------
  48.   (defun cen_incir (pa pb pc)
  49.     (setq jc (angle pa pb)
  50.           ja (angle pb pc)
  51.           jb (angle pc pa)
  52.     )
  53.     (setq ha (/ (+ jb jc pi) 2)
  54.           hb (/ (+ jc ja pi) 2)
  55.           hc (/ (+ ja jb pi) 2)
  56.     )
  57.     (setq vpa (polar pa ha p)
  58.           vpb (polar pb hb p)
  59.           vpc (polar pc hc p)
  60.     )
  61.     (inters pa vpa pb vpb nil)
  62.   )
  63.   (setq cen (cen_incir pa pb pc))
  64.   ;;***************************************************************************
  65.   ;;求每个圆的半径,圆心位置---------------------------------------------------
  66.   (defun tan (x)
  67.     (/ (sin x) (cos x))
  68.   )
  69.   ;;定义正切函数
  70.   (if (> 1e-16
  71.          (abs (* (sin (- jb jc)) (sin (- jc ja)) (sin (- ja jb))))
  72.       )
  73.     (progn
  74.       (alert "你输入的三点在一条直线上,请重新输入!")
  75.       (command ".UCS" "P")
  76.       (command ".UCS" "P")
  77.       (setvar "osmode" oldmode)
  78.       (setvar "cmdecho" oce)
  79.       (princ)
  80.     )
  81.     ;;判断输入的三点是否在同一条直线上
  82.     (progn
  83.       (setq ra (* ta (/ 1 (abs (tan (/ (- jb jc) 2))))))
  84.       (setq rb (* tb (/ 1 (abs (tan (/ (- jc ja) 2))))))
  85.       (setq rc (* tc (/ 1 (abs (tan (/ (- ja jb) 2))))))
  86.       (if (or nil (< (abs ra) 1e-8) (< (abs ra) 1e-8) (< (abs ra) 1e-8))
  87.         (progn
  88.           (princ "你输入的三点在一条直线上,请重新输入!")
  89.           (command ".UCS" "P")
  90.           (command ".UCS" "P")
  91.           (setvar "cmdecho" oce)
  92.           (setvar "osmode" oldmode)
  93.           (princ)
  94.         )
  95.         ;;判断圆的半径是否为零
  96.         (progn
  97.           (defun gougu (x y)
  98.             (sqrt (+ (* x x) (* y y)))
  99.           )
  100.           (setq        la (gougu ta ra)
  101.                 lb (gougu tb rb)
  102.                 lc (gougu tc rc)
  103.           )
  104.           (setq        cena (polar pa (angle pa cen) la)
  105.                 cenb (polar pb (angle pb cen) lb)
  106.                 cenc (polar pc (angle pc cen) lc)
  107.           )
  108.           ;;*******************************************************************
  109.           ;;画圆---------------------------------------------------------------
  110.           (setvar "osmode" 0)
  111.           (command ".line" pa pb pc "C")
  112.           (command ".CIRCLE" cena ra)
  113.           (command ".CIRCLE" cenb rb)
  114.           (command ".CIRCLE" cenc rc)
  115.           (command ".UCS" "P")
  116.           (command ".UCS" "P")
  117.           (setvar "osmode" oldmode)
  118.           (setvar "cmdecho" oce)
  119.           (princ)
  120.         )
  121.       )
  122.     )
  123.   )
  124. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 04:21 , Processed in 0.176782 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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