明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2940|回复: 9

[讨论] 曲线按特定方式拟合

[复制链接]
发表于 2014-7-12 21:11:25 | 显示全部楼层 |阅读模式
本帖最后由 风树 于 2014-7-12 21:29 编辑

如何实现用多段线拟合样条曲线和圆的lisp
希望能实现的是:将一条曲线用一条多段线近似表示,多段线由与x轴夹角为0,x,90度(x大于0,小于90)的线段(共四种形态)构成
参数输入为:
1:k,,k单位为1个图形单位,不小于0,代表构成多段线的子线段的最小长度,
子线段等长,非等长均可。
2:x

拟合精度控制不考虑数学指标,通过调整参数可以基本在视觉上过得去即可。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-7-12 21:16:09 来自手机 | 显示全部楼层
这个早就人写过,ET工具也有,晓东上的newer版主写了很多曲线相互转化
 楼主| 发表于 2014-7-12 21:20:14 | 显示全部楼层
自贡黄明儒 发表于 2014-7-12 21:16
这个早就人写过,ET工具也有,晓东上的newer版主写了很多曲线相互转化

固定角度的
发表于 2014-7-13 01:22:21 | 显示全部楼层
本帖最后由 wzg356 于 2014-7-13 01:30 编辑

很抱歉,记不清原帖子的位置了
适用范围比较大
曲线、椭圆、圆、圆弧等转换的数学指标按相似度调整,如果是直线、未拟合的多线段不受相似度影响
  1. ;;将各种线段转为多线段,将多线段上的弧线段也转为多线段
  2. ;;(CurveToPoline en);;参数:图元名;;示例(CurveToPoline (car(entsel "\n选择对象: ")))
  3. ;;适用"line,lwpolyline,polyline,spline,circle,arc,ellipse"
  4. (defun CurveToPoline ( en / c2 C ob a n pt D l m  q p b o r F )
  5.         (vl-load-com)                        
  6.         (setq C2 0.65)        ;;可理解为相似度,不要小于0.65,不能为1
  7.         (setq C(/(- 1.0 C2)2))        
  8.     (setq ob (vlax-ename->vla-object en)
  9.               a 0
  10.               n 1
  11.               pt nil
  12.               D (vla-get-objectname ob)
  13.               l (vlax-curve-getdistatparam ob(vlax-curve-getendparam ob))
  14.              m (cond((= D"AcDb3dPolyline")3)((= D"AcDb2dPolyline")2)((= D"AcDbPolyline")2))
  15.         )
  16.         (if(or(= D"AcDb3dPolyline")(= D"AcDbPolyline"))
  17.           (if(vl-catch-all-error-p(vl-catch-all-apply 'vla-get-Coordinates(list ob)))(setq Pt(StarEnd ob))
  18.                   (progn
  19.                           (setq q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates ob))))
  20.                           (repeat(/(length q)m)
  21.                                     (cond
  22.                                           ((= m 2)(setq p(list(nth a q)(nth(+ a 1)q))))
  23.                                           ((= m 3)(setq p(list(nth a q)(nth(+ a 1)q)(nth(+ a 2)q))))
  24.                                         )
  25.                                         (setq a(+ a m)
  26.                                                   Pt(if(or(null Pt)(>(distance p(cdr(car(reverse Pt))))0.00005))
  27.                                                       (append Pt(list(append(list(vlax-curve-getparamatpoint ob p))p)))pt)
  28.                                         )
  29.                                 )
  30.                         )
  31.                 )
  32.                 (setq Pt(StarEnd ob))
  33.         )
  34.         (while(< n(length Pt))
  35.                 (setq m(1- n)
  36.                           a(vlax-curve-getdistAtparam ob(car(nth m Pt)))
  37.                           b(-(vlax-curve-getdistAtparam ob(car(nth n Pt)))a)
  38.                 )
  39.                 (if(<= b 0)(setq b(- l a)))
  40.                 (setq o(vlax-curve-getparamatdist ob(+(/ b 2)a))
  41.                           r(append(list o)(vlax-curve-getpointatparam ob o))
  42.                           F(count-f ob (* b c2)(cdr(nth m Pt))(cdr r)(cdr(nth n Pt))c)
  43.                 )
  44.                 (cond
  45.                         ((= F 1)(setq n(1+ n)))
  46.                         ((= F 2)(setq Pt(insertlist Pt r n)))
  47.                 )
  48.         )
  49.         (setq F(if(vlax-curve-isClosed ob)1 0)
  50.                   b(entget(vlax-vla-object->ename ob)'("*"))
  51.                   Pt(if(and(= F 1)(NULL(vl-string-search "Polyline" D)))(reverse(cdr(reverse Pt)))Pt)
  52.         )
  53.         (setq a (list(cons 0 "LWPOLYLINE")
  54.                        (cons 8(cdr(assoc 8 b)))
  55.                        (cons 6(if(assoc 6 b)(cdr(assoc 6 b))"Bylayer"))
  56.                        (cons 62(if(assoc 62 b)(cdr(assoc 62 b))256))
  57.                        (cons 370(if(assoc 370 b)(cdr(assoc 370 b))0))
  58.                        (cons 48(if(assoc 48 b)(cdr(assoc 48 b))1))
  59.                        (cons 100 "AcDbEntity")
  60.                        (cons 100 "AcDbPolyline")
  61.                        (cons 90(-(length Pt)F))
  62.                        (cons 70 (+ 128 F))
  63.                        (cons 43(if(assoc 43 b)(cdr(assoc 43 b))0))
  64.                        (cons 38(caddr(vlax-curve-getstartpoint ob)))
  65.                        (cons 39(if(assoc 39 b)(cdr(assoc 39 b))0))
  66.                     )
  67.                   a (append a(foreach b Pt(setq Pt(subst(subst 10(car b)b)b Pt))))
  68.         )
  69.     (entmake(if(assoc -3 b)(append a(list(assoc -3 b)))a))
  70.     (prin1)
  71. )
  72. ;;以下为3个子函数
  73. (defun StarEnd(ob)
  74.    (list(append(list(vlax-curve-getstartparam ob))(vlax-curve-getstartpoint ob))
  75.    (append(list(vlax-curve-getendparam ob))(vlax-curve-getendpoint ob)))
  76. )

  77. (defun count-f (OBJ l p q o C / F)
  78.   (setq F (if(and (>(+(distance p q)(distance q o))l)
  79.                 (<(abs(*(distance p q)(sin(-(angle p q)(angle p o)))))C)
  80.                 )
  81.                 1
  82.                 2
  83.               )
  84.         )
  85. )

  86. (defun insertlist(Lst en n / l m s)
  87.         (cond
  88.                 ((= n 0)(setq s(append(list en)LST)))
  89.                 ((= n(setq l(length LST)))(setq s(append LST(list en))))
  90.                 (T(setq m 1 s(list(car LST)))
  91.                         (while(< m n)(setq s(append s(list(nth m LST)))m(1+ m)))
  92.                         (setq s(append s (list en)))
  93.                         (while(< m l)(setq s(append s(list(nth m LST)))m(1+ m)))
  94.                 )
  95.         )
  96.         (setq Lst s)
  97. )

评分

参与人数 1明经币 +1 收起 理由
风树 + 1 赞一个!

查看全部评分

发表于 2014-7-13 06:41:17 来自手机 | 显示全部楼层
曲线拟和,整理

评分

参与人数 1明经币 +1 收起 理由
风树 + 1 赞一个!

查看全部评分

发表于 2014-7-13 07:38:56 来自手机 | 显示全部楼层
楼主想输出pat还是shp?
 楼主| 发表于 2014-7-13 16:58:15 | 显示全部楼层
ivde 发表于 2014-7-13 07:38
楼主想输出pat还是shp?

想大致试试制作填充的一种方向
发表于 2014-7-13 17:05:39 | 显示全部楼层
发表于 2014-7-23 17:31:27 | 显示全部楼层
wzg356 发表于 2014-7-13 01:22
很抱歉,记不清原帖子的位置了
适用范围比较大
曲线、椭圆、圆、圆弧等转换的数学指标按相似度调整,如果 ...

这个程序的命令不是“CurveToPoline”吗,为什么我显示未知命令啊。
发表于 2015-5-1 09:57:20 | 显示全部楼层
同楼上,显示未知命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-14 19:28 , Processed in 0.171019 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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