312735894 发表于 2013-12-1 16:17:01

知道三角形的三边边长,然后画这个三角形,我写了代码,画出来不对,求大神解答!

如题,知道三角形的三边边长,然后自动画出三角形!下面是我写的代码,求大神帮着看看,哪里不对!
(defun c:tt()
(setq pt1 (getpoint "\n请指定三角形在屏幕中的位置:"))
(setq a (getreal "\n请输入三角形第一条边长:"))
(setq b (getreal "\n请输入三角形第二条边长:"))
(setq c (getreal "\n请输入三角形第三条边长:"))
(setq qq (/ (+ a b c) 2))
(setq s (sqrt (* qq (- qq a) (- qq b) (- qq c))))
(setq h (/ (* s 2) c))
(setq d (sqrt (- (* b b) (* h h))))
(setq jj (atan (/ h d)))
(setq pt2 (polar pt1 0 c))
(setq pt3 (polar pt1 jj b))
(command "pline" pt1 pt2 pt3 "")
)

Andyhon 发表于 2013-12-1 18:37:25

Ref:
http://bbs.mjtd.com/thread-76229-1-1.html

more info:
http://bbs.mjtd.com/thread-100047-1-1.html

edata 发表于 2013-12-1 21:00:11

本帖最后由 edata 于 2013-12-1 21:52 编辑

(defun c:tt(/ pt1 a b c qq s h d jj pt2 pt3);局部变量要设置
(setq pt1 (getpoint "\n请指定三角形在屏幕中的位置:"))
(setq a (getreal "\n请输入三角形第一条边长:"))
(setq b (getreal "\n请输入三角形第二条边长:"))
(setq c (getreal "\n请输入三角形第三条边长:"))
(if (and pt1 a b c (> (+ a b ) c)(< (- a b) c))(princ "\n是三角形")(princ "\n不是三角形"));判断方式一
(if (and pt1 a b c (> (+ b c) a)(> (+ a c) b)(> (+ a b) c) );判断方式二
    (progn
(setq qq (/ (+ a b c) 2.0))
(setq s (sqrt (* qq (- qq a) (- qq b) (- qq c))))
(setq h (/ (* s 2.0) c))
(setq d (sqrt (- (* b b) (* h h))))
(setq jj (atan (/ h d)))
(setq pt2 (polar pt1 0.0 c))
(setq pt3 (polar pt1 jj b))
(command "pline" "non" pt1 "non" pt2 "non" pt3 "c" );指定点的时候加"non"是临时取消捕捉,避免因为捕捉造成绘图失败
)
    (cond ;判断那一个输入值出错的一种方式
      ((null pt1)(princ "\n未指定点"))
      ((or (null a)(null b)(null c ))(princ "\n未输入边长"))
    (t (princ "\n不是三角形"))
    )
    )
(princ)
)

edata 发表于 2013-12-1 21:41:39

本帖最后由 edata 于 2013-12-1 21:52 编辑

再加一种算法,还有一种可以用圆的交点来求三点,平时画图就是用圆交点来画的,有空再弄。(defun c:tt(/ pt1 a b c qq s h d jj pt2 pt3 xd xh ptx1 ptx2 ptxd);局部变量要设置
(setq pt1 (getpoint "\n请指定三角形在屏幕中的位置:"))
(setq a (getreal "\n请输入三角形第一条边长:"))
(setq b (getreal "\n请输入三角形第二条边长:"))
(setq c (getreal "\n请输入三角形第三条边长:"))
(if (and pt1 a b c (> (+ a b ) c)(< (- a b) c))(princ "\n是三角形")(princ "\n不是三角形"));判断方式一
(if (and pt1 a b c (> (+ b c) a)(> (+ a c) b)(> (+ a b) c) );判断方式二
    (progn
      (setq xd(/ (- (+ (* a a) (* c c))(* b b) ) (* a 2.0)));三角形算法二开始
      (setq xh(sqrt (- (* c c) (* xd xd))))
      (princ xd )(princ "\n")(princ xh)
      (setq ptx1(polar pt1 0 a)
            ptxd(polar pt1 0 xd)
            ptx2 (polar ptxd (* pi 0.5) xh));三角形算法二结束
      (command "line" "non" pt1 "non" ptx1 "non" ptx2 "c")
(setq qq (/ (+ a b c) 2.0))
(setq s (sqrt (* qq (- qq a) (- qq b) (- qq c))))
(setq h (/ (* s 2.0) c))
(setq d (sqrt (- (* b b) (* h h))))
(setq jj (atan (/ h d)))
(setq pt2 (polar pt1 0.0 c))
(setq pt3 (polar pt1 jj b))
(command "pline" "non" pt1 "non" pt2 "non" pt3 "c" );指定点的时候加"non"是临时取消捕捉,避免因为捕捉造成绘图失败
)
    (cond ;判断那一个输入值出错的一种方式
      ((null pt1)(princ "\n未指定点"))
      ((or (null a)(null b)(null c ))(princ "\n未输入边长"))
    (t (princ "\n不是三角形"))
    )
    )
(princ)
)

312735894 发表于 2013-12-1 21:59:44

呵呵 谢谢大大帮助!
页: [1]
查看完整版本: 知道三角形的三边边长,然后画这个三角形,我写了代码,画出来不对,求大神解答!