乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 124|回复: 9

[讨论]有關自動旋轉對象到最小包絡框的處理方法

[复制链接]

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-10-5 18:31:00 | 显示全部楼层 |阅读模式
程序如下:;;;程序名: BDY:SmallRectang
;;;程序负责的工作: 把所选的对象自动转到最小的包络框.
;;;设计:BDYCAD
;;;时间:2004-10-04
;;;使用举例  (BDY:SmallRectang (SSGET))
(defun BDY:SmallRectang (sel-ssget / pparear i pt pparear smmm ptc)
         (SETQ pparear nil i 0)
         (repeat 90
                         (setq pt (LRCenterPoint sel-ssget))
                         (vl-cmdf ".area" (car pt) (list (car (cadr Pt) ) (cadr pt1))
                                         (cadr Pt)         (list (car pt1 ) (cadr (cadr Pt))) "")
                         (setq pparear (append pparear (list(list (getvar "area") i))))
                         (vl-cmdf ".rotate" sel-ssget "" (caddr pt) 1)
                         (SETQ i (+ i 1)))
         (setq smmm (cadr(CAR (vl-sort pparear (function (lambda (e1 e2)(vla-object ENT) 'LL 'UR)
         (mapcar 'vlax-safearray->list (list LL UR)))
         (setq n 0)
         (repeat (sslength ss)
                         (setq PT_LIST (append PT_LIST (LRCenterPoint-a (ssname ss n))))
                         (setq n (1+ n)))
         (setq pt1a(CAR (vl-sort PT_LIST (function (lambda (e1 e2)((cadr e1) (cadr e2)) ) ) )))
         (setq pt2b(CAR (vl-sort PT_LIST(function (lambda (e1 e2)(>(car e1) (car e2)) ) ) )))
         (setq pt1 (list (car pt1b) (cadr pt1a)) pt2 (list (car pt2b) (cadr pt2a)))
         (setq pt_x1 (car pt1) pt_x2 (car pt2))
         (setq pt_xc (+ (abs (/ (- pt_x2 pt_x1) 2)) pt_x1))
         (setq pt_y1 (cadr pt1) pt_y2 (cadr pt2))
         (setq pt_yc (+ (abs (/ (- pt_y2 pt_y1) 2)) pt_y1))
         (setq pt_xy (list pt_xc pt_yc))
         (list pt1 pt2 pt_xy)
         )
回复

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

铜币
973
发表于 2004-10-5 18:54:00 | 显示全部楼层
挺好的。有一点想问一问,你程序中好像是将选择集往一个方向旋转90度,你能肯定就在这个范围内吗?
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-10-5 18:54:00 | 显示全部楼层
应用举例
        

gmvadoyfxhx.jpg

gmvadoyfxhx.jpg

回复

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

铜币
973
发表于 2004-10-5 18:58:00 | 显示全部楼层
应该是了。
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-10-5 19:02:00 | 显示全部楼层
Alin, 程序的一次一次的转好慢的, 你有方法提高吗?
回复

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

铜币
973
发表于 2004-10-5 19:17:00 | 显示全部楼层
我想不出还有什么更好的方法。不过有一点你要注意,如果选择对象是的spline,有些情况下getboundingbox方法得出的结果不准确。
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-10-5 19:50:00 | 显示全部楼层
没空慢慢看程序了,BDYCAD请你介绍一下思路
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-10-6 09:05:00 | 显示全部楼层
程序主要是通过使用循环90次每次旋转一度, 把选到的对象每旋转一度时把所占包络框的面积加入变量名 pparear         去. 循环完了就提取变量pparear 的面积最小值为smmm         , 再把对象旋转到面占面积最小值的角度去,
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2004-10-7 13:05:00 | 显示全部楼层
下列好像有错pt1??
(vl-cmdf ".area" (car pt) (list (car (cadr Pt) ) (cadr pt1))
                                         (cadr Pt)         (list (car pt1 ) (cadr (cadr Pt))) "")
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-10-7 23:08:00 | 显示全部楼层
好像有个趋势.对比旋转前后的面积大小,如果从小变大反向旋转.如果从大变小就就继续,如果由大->小->大,就确定中间这部是最大.
也许可以减少些计算.
只是猜测,有待证实
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-20 11:38 , Processed in 2.513979 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表