乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 119|回复: 9

再发两曲线求交点函数(终结版)!

[复制链接]

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-8-14 17:06:00 | 显示全部楼层 |阅读模式
(defun test(/ m_ent1 m_ent2 m_jdtab)
         (setq m_ent1 (car (entsel "\n请选择第一条曲线: ")))
         (setq m_ent2 (car (entsel "\n请选择第二条曲线: ")))
         (setq m_jdtab (m_IntersectWith m_ent1 m_ent2))
         (princ"\n交点表: ")(princ m_jdtab)
         (princ)
)
(defun m_IntersectWith(m_ent1 m_ent2 / m_obj1 m_obj2 m_objcopy1 m_objcopy2 m_jdtab m_jdtab1 i)
         ;;适用对象: Line、Polyline、LWPolyline、Circle、Arc、Ellipse、3dPolyline、Spline
         ;;支持求空间虚交点,但Z坐标始终为0.0,要求Z坐标,请用(vlax-curve-getClosestPointToProjection)函数
         (setq m_obj1 (vlax-ename->vla-object m_ent1))
         (setq m_obj2 (vlax-ename->vla-object m_ent2))
         
         (setq m_objcopy1 (vla-copy m_obj1));;复制第一条曲线实体
         (setq m_objcopy2 (vla-copy m_obj2));;复制第二条曲线实体
         
         (setq m_objcopy1 (m_ShadowToXY m_objcopy1));;得到投影实体
         (setq m_objcopy2 (m_ShadowToXY m_objcopy2));;得到投影实体
               
         (setq m_jdtab1 (vla-intersectwith m_objcopy1 m_objcopy2 acExtendnone));;得到交点集
         
         (if (> (vlax-safearray-get-u-bound (vlax-variant-value m_jdtab1) 1) 1);;判断有无交点
                                         (progn
        (setq m_jdtab1 (vlax-safearray->list (vlax-variant-value m_jdtab1)));;safearray数组转换为list表
        (setq i 0)
        (repeat        (/ (length m_jdtab1) 3)
                 (setq        m_jd (list (nth i m_jdtab1) (nth (+ 1 i) m_jdtab1) (nth (+ 2 i) m_jdtab1)));;取得一个交点
                 (setq m_jdtab (cons m_jd m_jdtab));;构造交点表((第一个交点) (第二个交点)。。。)
                 (setq i (+ 3 i))
        )
                                         )
                                         (princ"\n两曲线无交点!")
         )
         
         (vla-delete m_objcopy1);;删除复制的第一条曲线实体
         (vla-delete m_objcopy2);;删除复制的第二条曲线实体
         
         (setq m_jdtab m_jdtab);;返回交点表,无交点返回nil
)
(defun m_ShadowToXY(m_obj / m_objname m_pts m_pts1 i)
         ;;对曲线实体m_obj创建一个投影至xy平面的曲线实体,即对曲线实体上每个控制点的z坐标值置为0.0
         ;;输入曲线实体(vla对象)
         ;;返回投影实体(vla对象)
         (setq m_objname (vla-get-objectname m_obj));;取得实体的类型名称
         (m_princ "\nObjectName:" m_objname)
         (cond
                         ((= "AcDbSpline" m_objname);;样条曲线(Spline)
                                 (setq i 0)
                                 (setq m_pts (vlax-variant-value (vla-get-fitpoints m_obj)));;取得样条曲线的拟合点
                                 (setq m_pts1 (vlax-variant-value (vla-get-controlpoints m_obj)));;取得样条曲线的控制点
                                 (repeat (vla-get-numberoffitpoints m_obj);;循环
                                                 (vlax-safearray-put-element m_pts (+ i 2) 0.0);;改变每个拟合点的z值为0.0
                                                 (setq i (+ i 3))
                                 )
                                 (vla-put-fitpoints m_obj m_pts);;更改曲线拟合点属性
                                 (setq i 0)
                                 
                                 (repeat (vla-get-numberofcontrolpoints m_obj);;循环
                                                 (vlax-safearray-put-element m_pts1 (+ i 2) 0.0);;改变每个控制点的z值为0.0
                                                 (setq i (+ i 3))
                                 )
                                 (vla-put-controlpoints m_obj m_pts1);;更改曲线控制点属性
                         )
                         
                         ((= "AcDb3dPolyline" m_objname);;三维多段线(3dpolyline)
                                 (setq i 0)
                                 (setq m_pts (vlax-variant-value (vla-get-coordinates m_obj)));;取得3维多段线的控制点
                                 (repeat (/ (length (vlax-safearray->list m_pts)) 3)
                                                 (vlax-safearray-put-element m_pts (+ i 2) 0.0)
                                                 (setq i (+ i 3))
                                 )
                                 (vla-put-coordinates m_obj m_pts)
                         )
                         
                         ((= "AcDbLine" m_objname);;直线(line)
                                 (setq i 0)
                                 (setq m_pts (vlax-variant-value (vla-get-startpoint m_obj)));;取得直线的起点座标
                                 (setq m_pts1 (vlax-variant-value (vla-get-endpoint m_obj)));;取得直线的端点座标
                                 (vlax-safearray-put-element m_pts 2 0.0);;改变起点座标z值为0.0
                                 (vlax-safearray-put-element m_pts1 2 0.0)
                                 (vla-put-startpoint m_obj m_pts)
                                 (vla-put-endpoint m_obj m_pts1)
                         )
                         ((or (= "AcDbCircle" m_objname);;园(circle)
         (= "AcDbArc" m_objname);;圆弧(arc)
         (= "AcDbEllipse" m_objname);;椭圆及椭圆弧(ellipse)
                                 )
                                 (setq m_pts (vlax-variant-value (vla-get-center m_obj)));;取得中心点座标
                                 (vlax-safearray-put-element m_pts 2 0.0);;改变中心点座标z值为0.0
                                 (vla-put-center m_obj m_pts)
                         )
                         
                         ((or (= "AcDbPolyline" m_objname);;多段线(polyline、lwpolyline)
         (= "AcDb2dPolyline" m_objname);;拟合的2维多段线(polyline、lwpolyline)
                                 )
                                 (vla-put-elevation m_obj 0.0);;改变标高值为0.0
                         )
         )
         (setq m_obj m_obj)
)
呵呵,这应该差不多了吧!
回复

使用道具 举报

14

主题

270

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
326
发表于 2004-8-14 21:51:00 | 显示全部楼层
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-8-14 22:35:00 | 显示全部楼层
注意:(m_princ "\nObjectName:" m_objname)是本人测试时用的,没意义。(m_princ msg var)是自己定义的显示函数,目的是不想输入两个princ!使用时请删掉!
回复

使用道具 举报

wmz

50

主题

247

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
447
发表于 2004-8-15 12:22:00 | 显示全部楼层
只是我有一个问题,如果一条曲线多次通过另一条曲线时就形成了两个以上的交点,该如何求这多个交点坐标呢?
回复

使用道具 举报

13

主题

72

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
124
发表于 2004-8-16 11:29:00 | 显示全部楼层
试试看
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-8-16 12:07:00 | 显示全部楼层
这样投影对SPLINE是有误差的

45my4hpy1xa.bmp

45my4hpy1xa.bmp

回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-8-17 20:14:00 | 显示全部楼层
meflying 版主太厉害了啊!我正要问问这个问题呢,在Lisp里面有什么更好的办法吗?
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-8-17 21:46:00 | 显示全部楼层
用move压平如何?
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-8-18 09:31:00 | 显示全部楼层

                 IntersectWith函数求出的就是所有交点组成的表!
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-8-18 09:37:00 | 显示全部楼层

                 请问具体怎么做?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-19 15:01 , Processed in 1.003105 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表