求助:把一个图形沿它的几何中心(形心)方向偏移一定的距离d?? lisp 如何编程??
比如如图所示的图形,图形已表示成一个统一的整体,做整体偏移。http://space.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 Jully的微博 本帖最后由 mandala 于 2011-4-17 14:08 编辑
如果你的偏移是指offset的话,那么比较直观的办法是将此线变成一条连续的多段线pl,再将其变成顺时针走向,最后(vla-offset plename d)。或者就是找出形心来offset,要么就干脆求最小包围圆的圆心来offset。 我想沿一定方向的偏移和offset是有区别的吧?我所要的偏移是:假如知道这个图形的极坐标方程ρ(θ),则所求的是ρ(θ)-d
注:图形形心坐标是可求的。 楼主给出的图形的形心是一个点,根据标题要沿其几何中心方向偏移,那到底是哪个方向呢? 本帖最后由 highflybird 于 2011-4-17 22:20 编辑
楼主可能自己都还不清楚那样的效果是什么。
如果真的是沿着极心偏移,牵涉到极坐标变换,那样直线段会映射成曲线,弧形可能会映射成非圆曲线,这可是你要的效果?
如果你不清楚的话,可以在 CAD中画画,看是不是这样?
回复 highflybird 的帖子
对,会出现这种效果。请问你知道它的算法吗? 本帖最后由 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)) ;红色的
)
)
)
谢谢! 学习了。初学者。
页:
[1]