明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1803|回复: 8

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

[复制链接]
发表于 2011-4-17 13:12:57 | 显示全部楼层 |阅读模式
比如如图所示的图形,图形已表示成一个统一的整体,做整体偏移。

该贴已经同步到 Jully的微博

本帖子中包含更多资源

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

x
发表于 2011-4-17 14:06:02 | 显示全部楼层
本帖最后由 mandala 于 2011-4-17 14:08 编辑

如果你的偏移是指offset的话,那么比较直观的办法是将此线变成一条连续的多段线pl,再将其变成顺时针走向,最后(vla-offset plename d)。或者就是找出形心来offset,要么就干脆求最小包围圆的圆心来offset。
 楼主| 发表于 2011-4-17 16:06:16 | 显示全部楼层
我想沿一定方向的偏移和offset是有区别的吧?我所要的偏移是:假如知道这个图形的极坐标方程ρ(θ),则所求的是ρ(θ)-d
注:图形形心坐标是可求的。
发表于 2011-4-17 21:44:57 | 显示全部楼层
楼主给出的图形的形心是一个点,根据标题要沿其几何中心方向偏移,那到底是哪个方向呢?
发表于 2011-4-17 22:17:24 | 显示全部楼层
本帖最后由 highflybird 于 2011-4-17 22:20 编辑

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

 楼主| 发表于 2011-4-18 09:15:59 | 显示全部楼层
回复 highflybird 的帖子

对,会出现这种效果。请问你知道它的算法吗?
发表于 2011-4-18 10:55:33 | 显示全部楼层
本帖最后由 highflybird 于 2011-4-18 11:25 编辑

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


  1. (defun c:test(/ DIS ENT I LST OBJ PNT PTS SEL X)
  2.   (setq sel (ssget))
  3.   (setq i 0)
  4.   (setq pnt (getpoint "\n请输入形心:"))
  5.   (setq pnt (trans pnt 1 0))
  6.   (setq dis (getdist "\n请输入偏移距离:"))
  7.   (repeat (sslength sel)
  8.     (setq ent (ssname sel i))
  9.     (setq obj (vlax-ename->vla-object ent))
  10.     (setq lst (get-spline-vertexs ent 100))
  11.     (setq pts (mapcar '(lambda (x) (polar pnt (angle pnt x) (- (distance pnt x) dis))) lst))
  12.     (Make-Poly pts)
  13.     (setq i (1+ i))
  14.   )
  15. )
  16. ;;;取得曲线的点
  17. (defun get-spline-vertexs (ent n / DIST ENDPAR I LEN OBJ PT PTS SEG)
  18.   (setq obj (vlax-ename->vla-object ent))
  19.   (setq endpar  (vlax-curve-getEndParam obj))
  20.   (setq len (vlax-curve-getDistAtParam obj endpar))
  21.   (setq seg (/ len n))
  22.   (setq dist 0)
  23.   (while (< dist len)   
  24.     (setq pt (vlax-curve-getPointAtDist obj dist))
  25.     (setq pts (cons pt pts))
  26.     (setq dist (+ seg dist))   
  27.   )
  28.   (if (not (vlax-curve-isClosed obj))
  29.     (setq pt (vlax-curve-getEndPoint obj)
  30.    pts (cons pt pts)
  31.     )
  32.   )
  33.   (reverse pts)
  34. )
  35. ;;;绘制多段线
  36. (defun Make-Poly (pp / x)
  37.   (entmakeX        ;画凸包
  38.     (append
  39.       '((0 . "LWPOLYLINE")
  40. (100 . "AcDbEntity")
  41. (100 . "AcDbPolyline")
  42.        )
  43.       (list (cons 90 (length pp)))     ;顶点个数
  44.       (mapcar
  45. (function (lambda (x) (cons 10 x)))
  46. pp
  47.       )         ;多段线顶点
  48.       (list (cons 70 1))      ;闭合的
  49.       (list (cons 62 1))      ;红色的
  50.     )
  51.   )
  52. )



 楼主| 发表于 2011-4-19 16:09:39 | 显示全部楼层
谢谢!
发表于 2011-4-24 16:38:48 | 显示全部楼层
学习了。初学者。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-10 13:32 , Processed in 0.176997 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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