明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2857|回复: 7

[基础] [讨论]画四边形如何改进

[复制链接]
发表于 2010-6-16 13:49 | 显示全部楼层 |阅读模式
  1. (defun c:4j()
  2. (setq pa (getpoint "\n 请输入三角形左下角点:"))
  3. (setq da (getreal "\n 请输入三角形底边:"))
  4. (setq db (getreal "\n 请输入三角形第二边:"))  ;请输入三角形第二边:与"之间不能有空格,否则输入错误。
  5. (setq dc (getreal "\n 请输入三角形第三边:"))
  6. (setq de (getreal "\n 请输入三角形第四边:"))
  7. (setq dd (getreal "\n 请输入三角形第五边:"))
  8. (setq s (/ (+ da db dc) 2))             ;求S=(da+db+dc)/2
  9. (setq earea (sqrt (* s (- s da) (- s db) (- s dc))))  ;求面积area=s*(s-da)*(s-db)*(s-dc)^0.5
  10. (setq h  (/ (* 2 earea) da))                 ;求三角形高 h=2*area/da
  11. (setq pab (sqrt (-(* dc dc) (* h h))))        ;求高将底边分成的两部分的长度
  12. (setq pba (sqrt (-(* db db) (* h h))))
  13. (cond ((and  (< pab pba) (> pba da)) (setq angb (atan (/ h pab))) (setq angfinal (- pi angb)))
  14.       ((and  (> pab da) (> pab pba)) (setq angb (atan (/ h pab))) (setq angfinal angb))
  15.       ((and  (< pab da) (< pba da))  (setq angb (atan (/ h pab))) (setq angfinal angb))
  16. )
  17. (setq s1 (/ (+ de db dd) 2))             ;求S=(da+db+dc)/2
  18. (setq earea1 (sqrt (* s1 (- s1 db) (- s1 de) (- s1 dd))))  ;求面积area=s*(s-da)*(s-db)*(s-dc)^0.5
  19. (setq h1  (/ (* 2 earea1) db))                 ;求三角形高 h=2*area/da
  20. (setq pac (sqrt (-(* dd dd) (* h1 h1))))        ;求高将底边分成的两部分的长度
  21. (setq pca (sqrt (-(* de de) (* h1 h1))))
  22. (cond ((and  (< pab pba) (> pba da)) (setq angb1 (atan (/ h pba))) (setq angfinal2 angb1))
  23.       ((and  (> pab da) (> pab pba)) (setq angb1 (atan (/ h pba))) (setq angfinal2 (- pi angb1)))
  24.       ((and  (< pab da) (< pba da))  (setq angb1 (atan (/ h pba))) (setq angfinal2 angb1))
  25. )
  26. (cond ((and  (< pac pca) (> pca db)) (setq angc (atan (/ h1 pca))) (setq angfinal1 angc))
  27.       ((and  (> pac db) (> pac pca)) (setq angc (atan (/ h1 pca))) (setq angfinal1 (- pi angc)))
  28.       ((and  (< pac db) (< pca db))  (setq angc (atan (/ h1 pca))) (setq angfinal1 angc))
  29. )
  30. (setq ang1 (+ angfinal2 angfinal1))
  31. (setq ang2 (- pi ang1))
  32. (setq pb (polar pa 0 da))       ;求pb点
  33. (setq pc (polar pa angfinal dc))
  34. (setq pg (polar pb ang2 de))
  35. (command "line" pa pb  "")
  36. (command "line" pb pc  "")
  37. (command "line" pc pa  "")
  38. (command "line" pc pg  "")
  39. (command "line" pb pg  "")
  40. (princ ang1)
  41. )

通过网上的代码修改成四边形的

如何简化?

有人提出说可以用圆,不过不会取 交点
发表于 2010-6-16 14:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2010-6-17 21:30 | 显示全部楼层
 不明白楼主的意思。
直接点点就行了
(defun    c:4j ()
   (setq pa (getpoint "\n 请输入四边形第一个角点:"))
   (setq pb (getpoint pa"\n 请输入四边形第二个角点:"))
   (setq pc (getpoint pb"\n 请输入四边形第三个角点:"))
   (setq pd (getpoint pc"\n 请输入四边形第四个角点:"))
   (command "line" pa pb pc pd "c")
   (princ)
  )
发表于 2010-6-18 23:05 | 显示全部楼层
我的第一个程序就是四边形
发表于 2012-7-12 16:17 | 显示全部楼层
露水2 发表于 2010-6-18 23:05
我的第一个程序就是四边形

悄悄给我看看你的程序吧。
发表于 2012-7-12 17:21 | 显示全部楼层
发表于 2012-7-12 18:38 | 显示全部楼层

  1. ;画四边形  yshf
  2. ;以四边形对角线的第一点为准,四条边顺时针排列
  3. (defun c:4b()
  4.     (defun jj(a b c / p s h)
  5.        (setq p (* 0.5 (+ a b c))
  6.              s (sqrt (* p (- p a) (- p b) (- p c)))
  7.              h (/ (* 2.0 s) c)
  8.              d (sqrt (- (* a a) (* h h)))
  9.              p (atan h d)
  10.        )
  11.     )

  12.     (setq cm (getvar "cmdecho")
  13.           os (getvar "osmode")
  14.     )
  15.     (setvar "cmdecho" 0)
  16.     (setvar "osmode" 33)
  17.     (while (setq p1 (getpoint "\n四边形对角线的第一点<回车退出>:"))
  18.         (if (setq p3 (getpoint p1 "\n四边形对角线的另一点所在方向:"))
  19.             (if (and (setq djx (getdist "\n四边形对角线长度:"))
  20.                      (setq a1 (getdist "\n四边形第1条边长度:"))
  21.                      (setq b1 (getdist "\n四边形第2条边长度:"))
  22.                      (setq a2 (getdist "\n四边形第3条边长度:"))
  23.                      (setq b2 (getdist "\n四边形第4条边长度:"))
  24.                 )
  25.                 (progn
  26.                     (setq aa (angle p1 p3)
  27.                           p3 (polar p1 aa djx)
  28.                           p2 (polar p1 (+ aa (jj a1 b1 djx)) a1)
  29.                           p4 (polar p1 (- aa (jj b2 a2 djx)) b2)
  30.                     )
  31.                     (setvar "osmode" 0)
  32.                     (command "_pline" p1 p2 p3 p4 "c")
  33.                 )
  34.            )
  35.         )
  36.         (setvar "osmode" 33)
  37.     )
  38.     (setvar "osmode" os)
  39.     (setvar "cmdecho" cm)
  40.     (princ)                          
  41. )
发表于 2015-6-17 11:16 | 显示全部楼层
yshf 发表于 2012-7-12 18:38

给力,很好用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 17:06 , Processed in 0.185063 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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