找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1514|回复: 19

[有奖答题] 大家画下把矩形用正方形填满的图形

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-10-24 20:57:40 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 newer 于 2016-10-24 21:00 编辑

QQ截图20161024205432.png


输入长、宽参数, 尽可能把矩形用正方形填满。


下面是长667,宽123的矩形,划分后的角部放大图


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

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-10-24 21:35:40 | 显示全部楼层
本帖最后由 newer 于 2016-10-24 22:30 编辑
(defun c:tt ()
  (defun eBox (ent / ll ur)
    (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
    (mapcar
      'safearray-value
      (list ll ur)
    )
  )
  (defun fgjx (e / box h p1 p2 w)
    (setq box (ebox e)
          p1 (car box)
          p2 (cadr box)
          w (- (car p2) (car p1))
          h (- (cadr p2) (cadr p1))
    )
    (if (/= w h)
      (if (> w h)
        (progn
          (vl-cmdf "rectang" p1 (mapcar
                                  '+
                                  p1
                                  (list h h)
                                )
          )
          (vl-cmdf "rectang" (polar p1 0 h) p2)
          (entdel e)
          (fgjx (entlast))
        )
        (progn
          (vl-cmdf "rectang" p1 (mapcar
                                  '+
                                  p1
                                  (list w w)
                                )
          )
          (vl-cmdf "rectang" (polar p1 (* 0.5 pi) w) p2)
          (entdel e)
          (fgjx (entlast))
        )
      )
    )
  )
  (vl-load-com)
  (setq *ACAD* (vlax-get-acad-object)
        *DOC* (vla-get-ActiveDocument *ACAD*)
  )
  (defun *error* (msg)
    (mapcar
      'setvar
      '("cmdecho" "osmode")
      odlst
    )
    (vlax-invoke-method *DOC* 'EndUndoMark)
    (princ msg)
  )
  (vlax-invoke-method *DOC* 'StartUndoMark)
  (setq odlst (mapcar
                'getvar
                '("cmdecho" "osmode")
              )
  )
  (mapcar
    'setvar
    '("cmdecho" "osmode")
    '(0 0)
  )
  (setq e (car (entsel "\n点取矩形:")))
  (fgjx e)
  (mapcar
    'setvar
    '("cmdecho" "osmode")
    odlst
  )
  (vlax-invoke-method *DOC* 'EndUndoMark)
)

评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1 及时回复奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-24 21:43:01 | 显示全部楼层

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

使用道具 举报

已领礼包: 8727个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-10-25 05:32:56 | 显示全部楼层

下线的点..看到简单才写的...如果复杂估计就是今天来研究了...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2016-10-25 08:30:47 来自手机 | 显示全部楼层
本帖最后由 cable2004 于 2016-10-25 23:24 编辑

  1. (defun c:zz  ( / *cc *kk p0  pts)   (setq pts (apply 'append(mapcar'(lambda ( a ) (if (= 10 (car a))(list (cdr a)))) (entget (car(entsel))))))
  2.    (setq p0  (car (vl-sort  (cddr (setq pts (vl-sort pts '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))) '(lambda (e1 e2) (< (car e1) (car e2))))))
  3.    (setq *cc (-(caar pts)(caadr pts)) *kk (- (car(cdaddr pts))(cadadr pts)) )
  4.    (while (> (min *cc *kk) 0.00001)
  5.    (if (< *cc *kk)  
  6.      (repeat (fix(/ *kk *cc))
  7.               (mk-zfx p0 *cc 1)
  8.               (setq p0 (polar p0 (* -0.5 pi) *cc)  *kk (- *kk *cc ))
  9.          )
  10.      (repeat (fix(/ *cc *kk))
  11.               (mk-zfx p0 *kk 2)
  12.              (setq p0 (polar p0 0 *kk) *cc (- *cc *kk))
  13.          )
  14.      )
  15.   )
  16. (princ))

  17. (defun mk-zfx(pt l col)
  18. (entmakex(list (cons 0 "LWPOLYLINE")(cons 100 "AcDbEntity")(cons 100 "AcDbPolyline")(cons 90 4 )(cons 70 1 )(cons 62 col)                                    
  19.                 (cons 10 pt)            
  20.                 (cons 10 (polar pt 0 l))            
  21.                 (cons 10 (polar (polar pt (* -0.5 pi) l) 0 l))            
  22.                 (cons 10 (polar pt (* -0.5 pi) l))            
  23.              ))
  24. )

评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1

查看全部评分

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

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2016-10-25 23:26:59 | 显示全部楼层
测试一下,行不行
wwwwww.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-26 00:15:21 | 显示全部楼层

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

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2016-10-26 00:27:35 | 显示全部楼层
命令zz,我这里可以!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-26 01:00:42 | 显示全部楼层

我这还不行,明天我到单位的机器试试。

探讨下:
你求多段线顶点方法挺特别的,

(setq pts (apply
            'append
            (mapcar' (lambda (a)
                       (if (= 10 (car a))
                         (list (cdr a))
                       )
                     ) (entget (car (entsel)))
            )
          )
)


你用APPEND去掉了NIL,改成下面的能好点?

(setq pts (mapcar
            'cdr
            (vl-remove-if-not '(lambda (x)
                                 (= (car x) 10)
                               ) (entget (car (entsel)))
            )
          )
)


或者直接用VL-REMOVE去掉NIL

(setq pts (vl-remove nil (mapcar' (lambda (a)
                                    (if (= 10 (car a))
                                      (cdr a)
                                    )
                                  ) (entget (car (entsel)))
                         )
          )
)


你为了APPEND,强制把点表给加个LIST操作,APPEND不是一个很好的函数,还多余了个LIST。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-26 10:28:45 | 显示全部楼层

不行,在单位电脑也没反应,按ZZ就结束了。检查下代码吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2016-10-26 11:16:34 | 显示全部楼层
试试
QQ截图20161026111406.png


  1. (defun c:tt (/ x y s p a q)
  2.   (if (and
  3.         (setq x (getint "\n输入矩形X长: "))
  4.         (setq y (getint "\n输入矩形Y长: "))
  5.         (setq p (getpoint "\n插入点: "))
  6.         (setq s        0
  7.               a        (* x y)
  8.         )
  9.       )
  10.     (while (< s a)
  11.       (setq q (min x y)
  12.             s (+ s (* q q))
  13.       )
  14.       (command "_rectangle" "_non"  p "_non"
  15.                (mapcar '+ p (list q q))
  16.       )
  17.       (if (= q x)
  18.         (setq y        (- y x)
  19.               p        (mapcar  '+ p (list 0 q))
  20.         )
  21.         (setq x        (- x y)
  22.               p        (mapcar  '+  p (list q 0))
  23.         )
  24.       )
  25.     )
  26.   )
  27.   (princ)
  28. )


评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2016-10-26 16:13:19 | 显示全部楼层
好久不写程序了,看到这个题目有点意思,手痒凑一点,没有前后处理。
切割次序是倒过来的,这样可以简化些。两种方法,递归和当循环,都受系统限制,对数据切割复杂时系统会出问题。
不贴演示了,大家有兴趣可以试试,代码思路也不复杂,很容易看懂的。
(defun mkpl (pt w h)
  (entmake
    (list '(0 . "LWPOLYLINE")
          '(100 . "AcDbEntity")
          '(100 . "AcDbPolyline")
          '(90 . 4)
          '(70 . 1)
          '(43 . 0.0)
          '(38 . 0.0)
          '(39 . 0.0)
          (list 10 (car pt) (cadr pt))
          (list 10 (+ (car pt) w) (cadr pt))
          (list 10 (+ (car pt) w) (+ (cadr pt) h))
          (list 10 (car pt) (+ (cadr pt) h))
          '(210 0.0 0.0 1.0)
    )
  )
)

(defun c:tt(/ d pt w h)  ;使用递归
  (defun d(pt w h)
    (cond
      ((> w h)
       (mkpl (polar pt 0.0 (- w h)) h h) 
       (setq w (- w h))
       (d pt w h)
      )
      ((< w h)
       (mkpl (polar pt (/ pi 2) (- h w)) w w)
       (setq h (- h w))
       (d pt w h)
      )
      (t (mkpl pt w h))
    )
  )
      
  (setq pt(getpoint "\n矩形插入点: ")
        w (getdist pt "\n输入矩形宽: ")
        h (getdist pt "\n输入矩形高: ")
  )
  (mkpl pt w h)
  (d pt w h)
)

(defun c:tt1(/ pt w h)  ;使用当循环
  (setq pt(getpoint "\n矩形插入点: ")
        w (getdist pt "\n输入矩形宽: ")
        h (getdist pt "\n输入矩形高: ")
  )
  (mkpl pt w h)
  (while (/= w h)
    (if (> w h)
      (progn
        (mkpl (polar pt 0.0 (- w h)) h h)
        (setq w (- w h))
      )
      (progn
        (mkpl (polar pt (/ pi 2) (- h w)) w w)
        (setq h (- h w))
      )
    )
  )
  (mkpl pt w h)
)

评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-26 16:38:01 | 显示全部楼层

教授,你的代码画出来了,而且放大了好多次还都在画,看不到头啊:)

能否设置个面积的阈值,差不多就终止呢?

点评

好久不动了,练练手的,不想多折腾了,就是一个思路  发表于 2016-10-26 16:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-10-26 16:40:10 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 16:37 , Processed in 0.477827 second(s), 71 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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