newer 发表于 2025-5-11 21:15:00

XD::GEOM:LIST-EXTENTS



;; ------------------------------------------------------------------------
;;; 函数名称 / 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 ) (xmax ymax ))
;;;
;;; 【依赖函数 / 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)
)

bghyu 发表于 2025-12-25 13:55:30

:o:loveliness::L
页: [1]
查看完整版本: XD::GEOM:LIST-EXTENTS