找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2766|回复: 26

[讨论]:Lisp方式点集沿曲线排序

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-13 19:46:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
用过xdapi的不会陌生,探讨下lisp实现的可能,感兴趣的一起参与。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-2-13 20:50:37 | 显示全部楼层
能把问题论述详细点么?是沿曲线排序还是阵列?最好有个图例
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2004-2-13 22:41:31 | 显示全部楼层
这些给定的点是都在某个curve上的吗?
用相对距离可不可以解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-13 23:52:18 | 显示全部楼层
用vlax求点与起点距离的排序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 01:10:16 | 显示全部楼层
前一段时间改轴网程序时写的,可能不很简练,不过能工作。
[PHP]
;将点表沿着曲线排序..
; ptlis输入点表,坐标值均为实体内部坐标系.
; ent为lisp格式的曲线实体名.
(defun QAEC_Curve_SortPts (ent ptlist / lst_dis p dis lst_dis lst_out e1 e2)
  (foreach p ptlist
    (setq dis (QAEC_Curve_GetDistAtPoint ent p)
          lst_dis (cons (list dis p) lst_dis))
  );foreach
  (setq lst_dis
        (vl-sort lst_dis (function (lambda (e1 e2)(> (car e1) (car e2))))))
  (foreach p lst_dis
    (setq lst_out (cons (cadr p) lst_out))
  );foreach
  lst_out
);end

;返回曲线上一点到曲线起点的距离.
(defun QAEC_Curve_GetDistAtPoint (ent pt / objx PtonCurve)
  (setq objx (vlax-ename->vla-object ent))
  (if (setq PtonCurve (vlax-curve-getClosestPointTo objx pt))
    (vlax-curve-getDistAtPoint objx PtOnCurve)
    nil
  );if
);end
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 01:13:57 | 显示全部楼层
最初由 cy956 发布
[B]用vlax求点与起点距离的排序? [/B]


求距离就费劲了,可以直接用曲线上点的“参数值”做关键字排序,参数值是唯一的。

这个问题引深可以求不在曲线上的任意多点到曲线垂直投影进行排序,这样应用面更广。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 01:45:02 | 显示全部楼层
最初由 XDSoft 发布
[B]

求距离就费劲了,可以直接用曲线上点的“参数值”做关键字排序,参数值是唯一的。

这个问题引深可以求不在曲线上的任意多点?.. [/B]

这个参数值的几何意义怎么理解?
是否可以用这个函数:vlax-curve-getparamatpoint?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2004-2-14 10:00:59 | 显示全部楼层
参数值的具体含义和解释在帮助文件中有的好像,我看的是"mastering AutoCAD object"这本书上的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 10:11:58 | 显示全部楼层
最初由 Qlin 发布
[B]
这个参数值的几何意义怎?.. [/B]


对,就用这个函数获得点的参数值。

ACAD里面的曲线对象都是“参数曲线”,ACAD用参数方程来描述曲线,任何曲线都可以用一次的参数方程来描述出来。参数值就是“曲线参数方程”的自变量。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 11:32:05 | 显示全部楼层
qlin:(vlax-curve-getClosestPointTo objx pt)
这样对有自相交的曲线,或有葫芦口样的曲线,会不会存在出错的可能?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 14:45:01 | 显示全部楼层
改写的用参数值排序的函数:
[PHP]
;将点表沿着曲线排序..
; ptlis输入点表,坐标值均为实体内部坐标系.
; ent为lisp格式的曲线实体名.
(defun QAEC_Curve_SortPts (ent ptlist / lst_dis p dis lst_dis lst_out e1 e2)
  (foreach p ptlist
    (setq dis (QAEC_Curve_getParamAtPoint ent p)
          lst_dis (cons (list dis p) lst_dis))
  );foreach
  ;表排序.
  (setq lst_dis
        (vl-sort lst_dis (function (lambda (e1 e2)(> (car e1) (car e2))))))
  (foreach p lst_dis
    (setq lst_out (cons (cadr p) lst_out))
  );foreach
  lst_out
);end

;返回曲线上一点的param参数值..
(defun QAEC_Curve_getParamAtPoint (ent pt / objx PtonCurve)
  (setq objx (vlax-ename->vla-object ent))
  (if (setq PtonCurve (vlax-curve-getClosestPointTo objx pt))
    (vlax-curve-getParamAtPoint objx PtOnCurve)
    nil
  );if
);end
[/PHP]
最初由 陌生人 发布
[B]qlin:(vlax-curve-getClosestPointTo objx pt)
这样对有自相交的曲线,或有葫芦口样的曲线,会不会存在出错的可能? [/B]

vlax-curve-getClosestPointTo是保证点在曲线上的关键,否则由于计算精度的问题很难保证点坐标精度能符合曲线函数的要求,出错的机会很大;另外,用这个函数也很容易实现晓东说的“不在曲线上的任意多点到曲线垂直投影进行排序”,只要在调用排序函数前把任意ucs坐标下的点表用trans进行处理就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 14:51:46 | 显示全部楼层
最初由 Qlin 发布
[B]改写的用参数值排序的函数:
[PHP]
;将点表沿着曲线排序..
; ptlis输入点表,坐标值均为实体内部坐标系.
; ent为lisp格式的曲线实体名.
(defun QAEC_Curve_SortPts (ent ptlist / lst_dis p dis lst_dis lst_ou... [/B]


最好能根据投影后的点排序的结果,返回原始的点表,这样才最好,因为我们实际应用中,是要用原始的点排序的结果。QLIN,你再改改。

这个函数非常有用,可以解决很多问题,最好的办法是对于直线,可以根据两个顶点坐标作为直线,这样就不用在具体程序里面生成“临时的”LINE实体了。QLIN,你也可以改改。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 15:33:56 | 显示全部楼层
问: vlax-curve-getClosestPointToProjection 里面的normal应该是变体还是表?帮助里面说的不清楚
[PHP]
;|将点表沿着曲线排序.---------------------------------from qlin-----修改by:陌生人.2004.2
ptlst输入点表,坐标值均为实体内部坐标系.
ent为lisp格式的曲线实体名 or vla曲线实体.
extend=nil 不扩展曲线,非nil,扩展.
|;
(defun x@SortPts (ent ptlst extend / obj)
  (setq obj (if (= 'ENAME (type ent))(vlax-ename->vla-object ent) ent)
        nor (vla-get-normal obj))
  (mapcar '(lambda (x) (nth x ptlst))   ;表排序.不删除重复项.
           (vl-sort-i '(mapcar '(lambda (pt)(x@paramatpt obj pt)) ptlst) '<)
  )
)
;返回曲线上一点的param参数值.
(defun x@ParamAtPt (obj pt / @ptto)
  (if (setq @ptto (vlax-curve-getClosestPointToProjection obj pt nor extend))
    (vlax-curve-getParamAtPoint obj @ptto)
    nil
  );if
);end
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 15:39:29 | 显示全部楼层
最初由 陌生人 发布
[B]问: vlax-curve-getClosestPointToProjection 里面的normal应该是变体还是表?帮助里面说的不清楚
[code]
;将点表沿着曲线排序.-------------------------------by qlin-------修改:陌生人2004.2
; ptlst输入点表... [/B]


vlax-curve-getClosestPointToProjection  这个函数是向一个平面做投影,这在三维处理上应用到,normal 是这个平面的“法线向量”来确定这个平面。比如向量(0 0 1)表示笛卡尔坐标系的X,Y平面,(1 0 0)表示的是Y,Z平面。

如果你不处理三维,就用vlax-curve-getClosestPoint 这个函数就可以了。

另外需要记住的是,在ACAD里面,凡是出现  normal 这个参数的地方,都是代表平面的“法线向量”,这个是固定的写法。其他的向量可以任意命名。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 15:48:24 | 显示全部楼层
我是问是否是变体。好像vlax系列很多不是变体,直接处理成表或点表了。
而vla里面的解释则是变体
vla-get-Normal 函数
功能
      取得图元的三维法向单位矢量。
语法及参数
(vla-get-Normal Object )
Object PolygonMesh
  这个属性适用的对象
Normal 变体(双精度的三元素数组);读/写
  WCS表示的3S normal单位矢量
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 02:03 , Processed in 0.209451 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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