Jully 发表于 2011-4-17 13:12:57

求助:把一个图形沿它的几何中心(形心)方向偏移一定的距离d?? lisp 如何编程??

比如如图所示的图形,图形已表示成一个统一的整体,做整体偏移。

http://space.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 Jully的微博

mandala 发表于 2011-4-17 14:06:02

本帖最后由 mandala 于 2011-4-17 14:08 编辑

如果你的偏移是指offset的话,那么比较直观的办法是将此线变成一条连续的多段线pl,再将其变成顺时针走向,最后(vla-offset plename d)。或者就是找出形心来offset,要么就干脆求最小包围圆的圆心来offset。

Jully 发表于 2011-4-17 16:06:16

我想沿一定方向的偏移和offset是有区别的吧?我所要的偏移是:假如知道这个图形的极坐标方程ρ(θ),则所求的是ρ(θ)-d
注:图形形心坐标是可求的。

ZZXXQQ 发表于 2011-4-17 21:44:57

楼主给出的图形的形心是一个点,根据标题要沿其几何中心方向偏移,那到底是哪个方向呢?

highflybird 发表于 2011-4-17 22:17:24

本帖最后由 highflybird 于 2011-4-17 22:20 编辑

楼主可能自己都还不清楚那样的效果是什么。
如果真的是沿着极心偏移,牵涉到极坐标变换,那样直线段会映射成曲线,弧形可能会映射成非圆曲线,这可是你要的效果?
如果你不清楚的话,可以在 CAD中画画,看是不是这样?

Jully 发表于 2011-4-18 09:15:59

回复 highflybird 的帖子

对,会出现这种效果。请问你知道它的算法吗?

highflybird 发表于 2011-4-18 10:55:33

本帖最后由 highflybird 于 2011-4-18 11:25 编辑

如果真是那样的话,那只有分点,把边界线分成n个点,对每个点映射,(polar函数)然后由映射后的点表构成多段线。
以下代码仅供参考。


(defun c:test(/ DIS ENT I LST OBJ PNT PTS SEL X)
(setq sel (ssget))
(setq i 0)
(setq pnt (getpoint "\n请输入形心:"))
(setq pnt (trans pnt 1 0))
(setq dis (getdist "\n请输入偏移距离:"))
(repeat (sslength sel)
    (setq ent (ssname sel i))
    (setq obj (vlax-ename->vla-object ent))
    (setq lst (get-spline-vertexs ent 100))
    (setq pts (mapcar '(lambda (x) (polar pnt (angle pnt x) (- (distance pnt x) dis))) lst))
    (Make-Poly pts)
    (setq i (1+ i))
)
)
;;;取得曲线的点
(defun get-spline-vertexs (ent n / DIST ENDPAR I LEN OBJ PT PTS SEG)
(setq obj (vlax-ename->vla-object ent))
(setq endpar(vlax-curve-getEndParam obj))
(setq len (vlax-curve-getDistAtParam obj endpar))
(setq seg (/ len n))
(setq dist 0)
(while (< dist len)   
    (setq pt (vlax-curve-getPointAtDist obj dist))
    (setq pts (cons pt pts))
    (setq dist (+ seg dist))   
)
(if (not (vlax-curve-isClosed obj))
    (setq pt (vlax-curve-getEndPoint obj)
   pts (cons pt pts)
    )
)
(reverse pts)
)
;;;绘制多段线
(defun Make-Poly (pp / x)
(entmakeX      ;画凸包
    (append
      '((0 . "LWPOLYLINE")
(100 . "AcDbEntity")
(100 . "AcDbPolyline")
       )
      (list (cons 90 (length pp)))   ;顶点个数
      (mapcar
(function (lambda (x) (cons 10 x)))
pp
      )         ;多段线顶点
      (list (cons 70 1))      ;闭合的
      (list (cons 62 1))      ;红色的
    )
)
)



Jully 发表于 2011-4-19 16:09:39

谢谢!

434939575 发表于 2011-4-24 16:38:48

学习了。初学者。
页: [1]
查看完整版本: 求助:把一个图形沿它的几何中心(形心)方向偏移一定的距离d?? lisp 如何编程??