明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6386|回复: 14

[源码] 点表偏移(模拟OFFSET命令对多线段的处理)

  [复制链接]
发表于 2013-10-30 14:04:09 | 显示全部楼层 |阅读模式
本帖最后由 llsheng_73 于 2014-12-10 22:23 编辑

       今天看到这个帖子请高手写个.不用command由点表求偏移指定距离后的点表.
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=100362&fromuid=202795 所以写了这个程序,想了一下,其实不难实现,首先明确需要我们计算什么,怎么计算,于是运行了几下OFFSET命令。直接偏移多线段,再把多线断炸开了一个个偏移,于是它真的不难了,不就相当于先给各段作一个平等线,再把它们延长出去相交?
         平行线对应的两个端点可以用(POLAR p ang distance)来计算出来,延长到相交也有个(inters pt1 pt2 pt3 pt4 [onseg])可以直接算出来,那么只差怎么设置循环和一些必要判断了 。唯一要处理的是考虑点表所代表的多线段是否闭合,因为这会影响第一点和最后一点的结果。
         由于处理对象是一个点表,所以也不用考虑曲线段的计算了,希望高人们弄出可以考虑曲线段的来,同时希望大家对其中的算法进行必要的优化,在此先行谢过
同时,大家想到了程序中没考虑的问题又确实可以处理或者有必要考虑的也多提宝贵意见哈

  1. (defun offsetpt(pt d flag / Pldir delselfinter fx m n pi2 d1 p1 p0 p q0 q2 q22 q1 q pt1 pt2);|falg nil闭合点表,T不闭合它;d<0向内>0向外(假定它有内外)
  2. pt内少于2个点坐标时不处理,直接返回原表,两个点时以前进方向右边为正(和VLA-OFFSET一样)|;
  3.   (defun Pldir(pts)
  4.     (<(apply'+(mapcar'(lambda(x y)(-(*(car x)(cadr y))(*(car y)(cadr x))))pts(append(cdr pts)(list(car pts)))))0));defun
  5.   (defun delselfinter(p / m n i j p1 p2 p3 q);;by Llsheng_73
  6.     (setq m 0 n(-(length p)3))
  7.     (while(< m n)
  8.       (setq p1(nth m p)p2(nth(setq m(1+ m))p)i(1+ m))
  9.       (foreach p3(vl-remove(last p)(cdrnlst i p))
  10. (if(setq i(1+(vl-position p3 p)) q(INTERS p1 p2 p3(nth i p)))
  11.    (setq p(append(midlstnm 1 m p)(list q)(cdrnlst i p))
  12.   n(-(length p)3)))))
  13.     p);defun
  14.   (setq m(length pt)fx(if(> m 2)(PlDir pt))pt(if fx(reverse pt)pt)
  15. d1(abs d)
  16. pi15(*(if(> d 0)1 -1)(* pi 1.5))
  17. pt2(mapcar'(lambda(y x z)
  18.        (if(setq ang1(+(angle y x)pi15)
  19.       ang2(+(angle x z)pi15)
  20.       q(inters(polar y ang1 d1)(polar x ang1 d1)(polar x ang2 d1)(polar z ang2 d1)nil))
  21.          q(polar x ang2 d1)))(append(list(last pt))pt)pt(cdr(append pt(list(car pt))))))
  22.   (delselfinter(cond((< m 2)pt)
  23.       ((= m 2)(list(polar(car pt)ang1 d1)(polar(last pt)ang1 d1)))
  24.       (flag(cons(polar(car pt)(+(angle(car pt)(cadr pt))pi15)d1)
  25.          (reverse(cons(polar(last pt)(+(angle(cadr(reverse pt))(last pt))pi15)d1)(cdr(reverse pt2))))))
  26.       (t pt2))))



     是不是发错地方的,本来想发到源码那的,结果没太注意,如果真发错了并影响版规的话,请版主帮忙移过去哈
         最初忘了点不够三个的情况以及不少于三个时方向性的问题,导致有时按定义该往外的它往内,所以又加上了方向的判断处理因为改了一个判断点在点表代表的线内外而导致到处都乱了,现在修改好了,如果有之前复制代码的,对不起了,只能重新复制去才能用哦
         其实只有两个点的时候没必要调用这个程序来处理,自己两句(POLAR...)就搞定了,所以我也不管2个点的时候它到底往哪边的了反正我自己碰到只有两个点也不会调用它的



本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 工具|主题: 71, 订阅: 4
发表于 2021-4-2 14:57:28 | 显示全部楼层
  1. (defun pts-offset (pts dis)
  2.   (mapcar '(lambda (x) (polar x (angle (pts-mids pts) x) dis))
  3.           pts
  4.   )
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-1 15:14:19 | 显示全部楼层
wkq004 发表于 2016-5-24 15:25
程序存在以下问题:
1.内外判断有时不正确
2.点密集处偏移后有交叉

好像还不能开捕捉
 楼主| 发表于 2013-10-30 15:50:15 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-10-30 15:51 编辑

沙发是我自己的,向内偏移相对于图形太大的话,好象它会乱七八糟的,因为先是没想到,现在想到了不知道怎么处理它,好在我自己基本用不到向内的情况,所以需要的想想办法吧
发表于 2013-11-1 07:18:11 | 显示全部楼层
感谢 llsheng_73  分享学习!
发表于 2013-11-2 13:58:44 | 显示全部楼层
44行之前代码怎么看不懂??
 楼主| 发表于 2013-11-2 15:45:11 | 显示全部楼层
q3_2006 发表于 2013-11-2 13:58
44行之前代码怎么看不懂??

部分隐藏结果就有了乱码,郁闷,谢谢指出,已上传附件,如果需要可下载
 楼主| 发表于 2013-11-2 15:46:25 | 显示全部楼层
yoyoho 发表于 2013-11-1 07:18
感谢 llsheng_73  分享学习!

额,共同探讨学习。。。
发表于 2014-8-29 12:15:53 | 显示全部楼层
感谢老大的无私
发表于 2014-8-29 12:50:07 | 显示全部楼层
老大,有BUG,能修正么?
当距离较大,不管是放大还是缩小,按正常情况应该减点的,你的程序不会减点,反而给出了一个不对的点表
发表于 2016-3-6 19:31:34 | 显示全部楼层
学习学习
发表于 2016-5-24 15:25:48 | 显示全部楼层
程序存在以下问题:
1.内外判断有时不正确
2.点密集处偏移后有交叉

附件中少两个空格,添加后上传在此,可正常测试.

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 06:54 , Processed in 0.189467 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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