明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: lgx9612

[讨论] 精确快速求spline线的最小点及最大点

  [复制链接]
发表于 2014-7-16 21:43:00 | 显示全部楼层
不知道lisp里有没有求极值点的函数
 楼主| 发表于 2014-7-17 12:30:30 | 显示全部楼层
自贡黄明儒 发表于 2014-7-16 20:41
你用了whi|e,是不是逼近法。G版写的那个更简洁

     while是计算的密度,也算是是逼近法.昨天在网上逛逛,得知兄弟是个大师,失敬!在此之前我一直都找关于spline曲线的最小包容盒子的计算但没有找到,不知G版写的那个更简洁的程序在哪,想学习学习(可否贴上代码?).我知道标准计算(vla-getboundingbox)对spline曲线和图块并不好.所以绞尽脑汁,出此下策,写出如此代码,多多指教.



发表于 2014-7-17 13:16:02 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2014-7-17 14:18:57 | 显示全部楼层
本帖最后由 Gu_xl 于 2014-7-18 13:15 编辑

  1. ;;(gxl-GetCurveBox curve) 精确取得曲线实体外矩形框对角点
  2. ;;2014.07.18 修正1阶SPLINE的错误
  3. (defun gxl-GetCurveBox (curve / obj p1 p2 p3 p4 lst pts)
  4.   (if (= 'ename (type curve))
  5.     (setq obj (vlax-ename->vla-object curve))
  6.     (setq obj curve)
  7.   )
  8.   (if (and (= "AcDbSpline" (vla-get-objectname obj))
  9.            (< (vla-get-Degree obj) 2)
  10.       )
  11.     (progn
  12.       (setq pl (vlax-safearray->list
  13.                  (vlax-variant-value (vla-get-ControlPoints obj))
  14.                )
  15.       )
  16.       (while pl
  17.         (setq pts (cons (list (car pl) (cadr pl) (caddr pl)) pts)
  18.               pl  (cdddr pl)
  19.         )
  20.       )
  21.       (setq p1 (apply 'mapcar (cons 'min pts))
  22.             p3 (apply 'mapcar (cons 'max pts))
  23.             p2 (list (car p1) (cadr p3) (caddr p1))
  24.             p4 (list (car p3) (cadr p1) (caddr p1))
  25.       )
  26.     )
  27.     (progn
  28.       (vla-GetBoundingBox obj 'p1 'p3)
  29.       (setq p1 (vlax-safearray->list p1)
  30.             p3 (vlax-safearray->list p3)
  31.             p2 (list (car p1) (cadr p3) (caddr p1))
  32.             p4 (list (car p3) (cadr p1) (caddr p1))
  33.       )
  34.     )
  35.   )
  36.   (SETQ        lst
  37.          (mapcar '(lambda (a b)
  38.                     (vlax-curve-getClosestPointToProjection curve a b t)
  39.                   )
  40.                  (list p1 p2 p3 p4)
  41.                  '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
  42.          )
  43.   )
  44.   (list
  45.     (apply 'mapcar (cons 'min lst))
  46.     (apply 'mapcar (cons 'max lst))
  47.   )
  48. )
 楼主| 发表于 2014-7-17 19:51:28 | 显示全部楼层
Gu_xl 发表于 2014-7-17 14:18

   Gu_xl兄弟,非常感谢你的代码,很多高级的函数我都不会,你的程序确实很值得我学习,但spline的情况很多,只要vla-getboundingbox得出的最小及最大没有包住曲线就不能得出最正确的结果.之前我做按区域自动生成块的程序时就这个困扰我很久,spline放大或缩小都会有不同的结果,可能是我的cad版本问题,附上我试验代码gif和cad图档.
      本着学习的态度向你请教,试验代码并不是次次正确,我是不是哪里错了?

本帖子中包含更多资源

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

x
发表于 2014-7-17 20:10:18 | 显示全部楼层
lgx9612 发表于 2014-7-17 19:51
Gu_xl兄弟,非常感谢你的代码,很多高级的函数我都不会,你的程序确实很值得我学习,但spline ...

你是要考我眼力吗?太花,看不明白你的意思!
 楼主| 发表于 2014-7-17 20:32:22 | 显示全部楼层
本帖最后由 lgx9612 于 2014-7-17 20:45 编辑
Gu_xl 发表于 2014-7-17 20:10
你是要考我眼力吗?太花,看不明白你的意思!

在这个图中不能得出正确包容盒子我只是在你的代码中加了一句
  (command "rectang" (apply 'mapcar (cons 'min lst)) (apply 'mapcar (cons 'max lst)))


(gxl-GetCurveBox (car (entsel)))执行
  1. (defun gxl-GetCurveBox (curve / obj p1 p2 p3 p4 lst)
  2.   (if (= 'ename (type curve))
  3.     (setq obj (vlax-ename->vla-object curve))
  4.     (setq obj curve)
  5.   )
  6.   (vla-GetBoundingBox obj 'p1 'p3)
  7.   (setq        p1 (vlax-safearray->list p1)
  8.         p3 (vlax-safearray->list p3)
  9.         p2 (list (car p1) (cadr p3) (caddr p1))
  10.         p4 (list (car p3) (cadr p1) (caddr p1))
  11.   )
  12.   (SETQ        lst
  13.          (mapcar '(lambda (a b)
  14.                     (vlax-curve-getClosestPointToProjection curve a b t))
  15.                  (list p1 p2 p3 p4)
  16.                  '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
  17.                  )
  18.         )
  19.   (list
  20.     (apply 'mapcar (cons 'min lst))
  21.     (apply 'mapcar (cons 'max lst))
  22.   )
  23.   (command "rectang" (apply 'mapcar (cons 'min lst)) (apply 'mapcar (cons 'max lst)))
  24. )

本帖子中包含更多资源

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

x
发表于 2014-7-17 21:29:18 | 显示全部楼层
cad那个函数有一定的误差,如果向外偏移个百分之五左右不知道能不能在这种情况下补救一下

 楼主| 发表于 2014-7-17 21:43:07 | 显示全部楼层
风树 发表于 2014-7-17 21:29
cad那个函数有一定的误差,如果向外偏移个百分之五左右不知道能不能在这种情况下补救一下

这个函数对spline线和图块毫无能力
发表于 2014-7-17 22:14:15 | 显示全部楼层
lgx9612 发表于 2014-7-17 20:32
在这个图中不能得出正确包容盒子我只是在你的代码中加了一句
  (command "rectang" (apply 'mapcar (con ...

G版挺高级的一个函数,运行正确无误,被你加了一句command代码给糟蹋了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 15:40 , Processed in 0.161751 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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