明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 773|回复: 1

[自我挑战] O-tree表示法

[复制链接]
发表于 2020-10-12 21:11 | 显示全部楼层 |阅读模式
本帖最后由 mahuan1279 于 2020-10-15 17:42 编辑

根据O-tree表示法随机生成排版图形。
(defun c:tt()
(setvar "osmode" 0)
(setq rlst '(
(1 5.3 5.1)
(2 7.4 6.5)
(3 3.3 10.3)
(4 8.5 4.6)
(5 9.2 6.2)
(6 7.4 6.9)
(7 4.4 11.4)
(8 14.4 3.6)
(9 9.2 5.6)
))
(setq area_sum (apply '+ (mapcar '(lambda (x) (* (cadr x) (caddr x))) rlst)))
(setq n (length rlst) xmax (max (apply 'max (mapcar 'cadr rlst)) (apply 'max (mapcar 'caddr rlst))))
(defun rnd ()
  (*(rem (getvar "cputicks") 1e4) 1e-4)
)
(defun rnd_n (NN)
  (fix (* NN (rnd)))
)
(defun tfun (n)
(setq lst '(-1) i 1 flag t)
(while (and flag (< i n))
  (setq sum (apply '+ lst))
  (if (= sum 0)
      (setq lst (cons -1 lst))
          (if (= sum (- i n))
              (progn
                      (setq flag nil)
                          (repeat (- n i)
                             (setq lst (cons 1 lst))
                           )
                   )
                   (if (= (rem (rnd_n 1000) 2) 1)
                       (setq lst (cons -1 lst))
                       (setq lst (cons 1 lst))
                   )
                )
        )
        (setq i (+ i 1))
)
(mapcar '(lambda (x) (/ (1+ x) 2)) (reverse lst))
)
(defun qfun(n)
(setq vlst nil)
(repeat n
   (setq vlst (cons (rnd_n 1000) vlst))
)
(mapcar '(lambda (y) (if (= (rem (rnd_n 1000) 2) 1)  y (* -1 y))) (mapcar '1+ (vl-sort-i vlst '<)))  
)
(setq tlst (tfun (* 2 n)) qlst (qfun n) j 0 dblst (list (list 0 0 (* n xmax))) pt '(0 0))
(foreach en tlst
   (if (= en 0)
       (progn
              (setq jnum (nth j qlst))
          (setq rect_now (nth (- (abs jnum) 1) rlst))
                  (if (< jnum 0)
                      (setq newrect (list (caddr rect_now) (cadr rect_now)))
              (setq newrect (list (cadr rect_now) (caddr rect_now)))
                  )
          (setq vflst (car (vl-remove nil (mapcar '(lambda (x) (if (= (car pt)(car x)) x nil)) dblst))))
          (setq vvflst (vl-remove nil (mapcar '(lambda (x) (if (< (car x)  (+ (car pt) (car newrect))) x nil))(member vflst dblst))))
          (setq ymax (cadr (car (vl-sort vvflst '(lambda (ea eb) (> (cadr ea) (cadr eb)))))) ptlst (last vvflst))
          (if (< (+ ymax (cadr newrect)) (cadr pt))
                      (progn
                        (setq pt (list  (car pt)  (- (cadr pt) (cadr newrect))))
                (command "rectang" pt "d" (car newrect) (cadr newrect) (polar pt 0 10))
                           )
                          (progn
                            (setq pt (list (car pt) ymax))
                (command "rectang" pt "d" (car newrect) (cadr newrect) (polar pt 0 10))
                           )
                  )
          (foreach ee vvflst
                 (setq dblst (vl-remove ee dblst))
          )
         (if (= (+ (car ptlst) (cadr ptlst)) (+ (car pt) (car newrect)))
                (setq dblst (cons (list (car pt) (+ (cadr pt)(cadr newrect)) (car newrect)) dblst))
                    (setq dblst (cons (list (+ (car pt) (car newrect)) (cadr ptlst) (- (+ (car ptlst) (caddr ptlst)) (car newrect))) (cons (list (car pt) (+ (cadr pt)(cadr newrect)) (car newrect)) dblst)))
              )
                  (setq dblst (vl-sort dblst '(lambda (ea eb) (< (car ea) (car eb)))))
                  (setq pt (polar pt 0 (car newrect)))
                  (setq j (+ j 1))
           )
           (progn
              (setq vflst (car (vl-remove nil (mapcar '(lambda (x) (if (= (car pt)(+ (car x) (caddr x))) x nil))  dblst))))
                  (setq pt (list (car vflst) (cadr vflst)))
           )
   )
  )
)
 楼主| 发表于 2020-11-16 09:23 | 显示全部楼层
本帖最后由 mahuan1279 于 2020-11-16 09:24 编辑

(defun drawrect()
(setvar "osmode" 0)
(setq ens (ssget '((0 . "LWPOLYLINE"))) n (sslength ens) i 0 vlst nil)
(while (< i n)
    (setq lst (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object (ssname ens i)) 'Coordinates))))
    (setq vlst (cons (list (abs (- (+ (car lst) (cadddr lst)) (+ (cadr lst) (caddr lst))))
                               (abs (- (+ (car lst) (last  lst)) (+ (cadr lst) (cadr (reverse lst)))))                     
                                          )
                                     vlst
                                )
        )
    (setq i (+ i 1))
)
(setq lst (vl-sort (mapcar '(lambda (x) (if (> (car x) (cadr x)) x (reverse x))) vlst) '(lambda (ea eb) (> (car ea) (car eb)))))
(setq pt '(0 0))
(foreach en lst
   (command "rectang" pt "d" (car en) (cadr en) (setq pt (polar pt (/ pi 2) (cadr en))))  
)
)
(drawrect)

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-4-26 08:43 , Processed in 1.732614 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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