马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - ;; ------------------------------------------------------------------------
- ;;; 函数名称 / Function Name: XD::GEOM:LIST-EXTENTS
- ;;;
- ;;; 【功能说明 / Description】
- ;;; 计算点列表的边界范围,返回包含所有点的最小包围盒的两个对角点。
- ;;; 输入为二维或三维点列表,自动判断点维度,分别计算最小和最大坐标。
- ;;;
- ;;; 【参数说明 / Parameters】
- ;;; lst - (list) 点列表,每个点为二维或三维坐标列表,如 ( (x1 y1) (x2 y2) ... ) 或 ( (x1 y1 z1) (x2 y2 z2) ... )
- ;;;
- ;;; 【返回值 / Return Value】
- ;;; (list) 包含两个点的列表,分别为边界盒的左下角(最小坐标)和右上角(最大坐标)。
- ;;; 例如 ((xmin ymin [zmin]) (xmax ymax [zmax]))
- ;;;
- ;;; 【依赖函数 / Dependencies】
- ;;; - car, cadr, caddr : 访问点坐标分量
- ;;; - apply, min, max : 计算最小值和最大值
- ;;;
- ;;; 【使用示例 / Example Usage】
- ;;; (XD::GEOM:LIST-EXTENTS '((1 2) (3 4) (0 5)))
- ;;; => ((0 2) (3 5))
- ;;;
- ;;; (XD::GEOM:LIST-EXTENTS '((1 2 3) (3 4 5) (0 5 1)))
- ;;; => ((0 2 1) (3 5 5))
- ;;;
- ;;; 【备注 / Notes】
- ;;; - 如果点为二维,返回二维边界;如果为三维,返回三维边界。
- ;;; - 该函数适用于计算点云或图形对象的包围盒。
- ;;;
- (defun XD::GEOM:LIST-EXTENTS (lst / lst1 lst2 lst3 a b c p1 p2)
- ;; 提取所有点的第1、2、3坐标分量列表
- (setq lst1 (mapcar 'car lst))
- (setq lst2 (mapcar 'cadr lst))
- (setq lst3 (mapcar 'caddr lst))
- (setq lst nil)
- ;; 判断是否存在第三维坐标(即三维点)
- (if (apply 'and lst3)
- (progn
- ;; 三维点,计算各坐标分量的最小值和最大值
- (setq a (apply 'min lst1))
- (setq b (apply 'min lst2))
- (setq c (apply 'min lst3))
- (setq p1 (list a b c))
- (setq a (apply 'max lst1))
- (setq b (apply 'max lst2))
- (setq c (apply 'max lst3))
- (setq p2 (list a b c))
- )
- (progn
- ;; 二维点,计算X和Y的最小值和最大值
- (setq a (apply 'min lst1))
- (setq b (apply 'min lst2))
- (setq p1 (list a b))
- (setq a (apply 'max lst1))
- (setq b (apply 'max lst2))
- (setq p2 (list a b))
- )
- )
- ;; 返回边界盒的两个对角点
- (list p1 p2)
- )
|