找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: eachy

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

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 15:54:27 | 显示全部楼层
最初由 陌生人 发布
[B]我是问是否是变体。好像vlax系列很多不是变体,直接处理成表或点表了。
而vla里面的解释则是变体
vla-get-Normal 函数
功能
      取得图元的三维法向单位矢量。
语法及参数
(vla-get-Normal Object )
Ob... [/B]


应该就是一个点表(三维数组)表示向量,你可以试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-2-14 18:25:10 | 显示全部楼层
刚刚到家,说说我的想法。

排序依据参数排,用 vlax-curve-getclosestpointto 获取点然后用 vlax-curve-getparamatpoint 获取参数,参数和原始点构造表,然后用 vl-sort-i 对参数排序

  1. [php]
  2. (defun sort_real (a /)
  3.   (mapcar '(lambda (x) (nth x a)) (vl-sort-i a '<))
  4. )[/php]

其中有几个问题:

1 点集的BOX很大,曲线短的情况下,我的本意是“延伸”曲线的起始点和终点与点集的BOX相交

2 有延伸时某些点排序就不是参数了,要投影到“延伸”部分

3 出错处理部分增加哪些

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

使用道具 举报

发表于 2004-2-14 19:29:23 | 显示全部楼层
先把晓东的关于一般点坐标的要求实现:
[php]

;|
================================================
将点表沿着曲线排序.
================================================
+ 2004.2.13 qlin 初稿
+ 2004.2.13 修改:陌生人
+ 2004.2.14 修改:Qlin
|;

;|
ptlst输入点表,坐标值为UCS坐标系.
ent为lisp格式的曲线实体名
|;
(defun SortPts@Curve (en plst / lst)
  (setq lst (Pts->Trans plst 1 en)
        lst (x@SortPts en lst)
        lst (Pts->Trans lst en 1)
  );setq  
);end

;|
ptlst输入点表,坐标值均为实体内部坐标系.
ent为lisp格式的曲线实体名 or vla曲线实体.
|;
(defun x@SortPts (ent ptlst / obj nor)
  (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-getClosestPointTo obj pt))
    (vlax-curve-getParamAtPoint obj @ptto)
    nil
  );if
);end

;点表坐标转换.
(defun Pts->Trans (ptlst from to /)
  (mapcar '(lambda (x)(trans x from to)) ptlst)
);defun

;测试函数.
(defun c:test1 (/ en plst pt)
  (setq en (car (entsel)))
  (redraw en 3)
  (while (setq pt (getpoint "\nPick Point: "))
    (setq plst (cons pt plst))
  );while
  (setq plst (SortPts@Curve en plst))
  (command "pline")
  (foreach p plst
    (command p)
  )
  (command "")
  (redraw en 4)
  (princ)
);end
        
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-14 20:34:55 | 显示全部楼层
很好,不过看演示,怎么好像有两个点漏了?不会是显示问题吧?
另外贴一张我前面帖子说的可能出错(或意料之外)的情况。
看来排序不适用这种情况
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-14 20:45:16 | 显示全部楼层
最初由 eachy 发布
[B]刚刚到家,说说我的想法。

排序依据参数排,用 vlax-curve-getclosestpointto 获取点然后用 vlax-curve-getparamatpoint 获取参数,参数和原始点构造表,然后用 vl-sort-i 对参数排序

[code][php]
(defun sor... [/B]



其中有几个问题:

1 不是所有曲线都可以“延伸”的,比如SPLINE,POLYLINE都不能延伸,如果点在曲线延伸方向的外部,getclosestpointto获得的是距离点最近的顶点。

4 只要保证点是在曲线上,一定可以获得“参数值”。对于第一种我说的情况,那么就是最近的“顶点”的参数值。


实际上这个函数最主要的作用还是求曲线是“直线”或者“弧线”的情况,这是实际应用中最多的。因此我建议对直线情况,可以处理用直线顶点表代替“临时直线实体”作为一个参数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-2-14 21:31:34 | 显示全部楼层
最初由 XDSoft 发布
[B][QUOTE]最初由 eachy 发布
[B]刚刚到家,说说我的想法。

排序依据参数排,用 vlax-curve-getclosestpointto 获取点然后用 vlax-curve-getparamatpoint 获取参数,参数和原始点构造表,然后用 vl-sort-i ?.. [/B]

延伸要用到 SeccondDeriv ,沿切线延伸即可。

16楼的图形用Param不会有什么问题吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-2-14 22:15:10 | 显示全部楼层
eachy的意思应该是:如果很多曲线外面的点,求出的最进点都是端点,就没意义了.

能不能这样,先按param排,如果排出的点param值相同,就再按 到这一参数值的点的距离排序.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-15 00:16:53 | 显示全部楼层
距离值不能等同于param,距离进未必param小,不如延伸曲线后求param,如果无法延伸,那么按曲线排序这个命题也就不存在了,因为不能“按”曲线了。这些点应该略去。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-2-15 00:48:54 | 显示全部楼层
最初由 陌生人 发布
[B]距离值不能等同于param,距离进未必param小,不如延伸曲线后求param,如果无法延伸,那么按曲线排序这个命题也就不存在了,因为不能“按”曲线了。这些点应该略去。 [/B]


参数曲线的参数值是从0开始的线性增大,对于起点,距离(点沿着曲线到起点的距离,不是直线距离)远,参数值就一定大。

1、可以延伸的曲线包括:LINE,ARC等
2、不能延伸的曲线外的点,无实际意义了,因为我们是为了应用去构造数据。因此如果对不能延伸的曲线排序,那么这个曲线就一定是我们需要的,是前提。他的外面的点不应该在我们的数据参数里面。比如对POLYLINE排序。

3、这个问题的具体常用应用就是已知一些点,然后按照某个直线(或两顶点表)或者弧线进行排序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-15 03:07:16 | 显示全部楼层
补充:lwpline,polyline是可以延伸的。
我上贴说的距离是针对aeo的描述的,我理解他说的“先按param排,如果排出的点param值相同,就再按 到这一参数值的点的距离排序”
这里的距离是指不能求param的点,它到曲线端点的直线距离.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-2-15 07:24:20 | 显示全部楼层
最近没有时间静下来写程序,把前段时间搜集来的一些网页提供给大家,有助于理解什么是参数,同时对一些算法可以有不同的理解。

22楼aeo和我的意思相同。你怎么也不加分加币呀:)
http://geocom.hhcc.net.cn/magz/wk0304/01.htm

  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  2.   <tr>
  3.     <td width="100%" height="489">
  4.       <iframe name="I1" width="100%" height="100%" src="http://geocom.hhcc.net.cn/magz/wk0304/01.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码

http://www.bipt.edu.cn/jpke/math/chapter7.htm


  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  2.   <tr>
  3.     <td width="100%" height="489">
  4.       <iframe name="I1" width="100%" height="100%" src="http://www.bipt.edu.cn/jpke/math/chapter7.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码

http://www.mathfan.com/article/Soft_Class.asp?ClassID=1

  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  2.   <tr>
  3.     <td width="100%" height="489">
  4.       <iframe name="I1" width="100%" height="100%" src="http://www.mathfan.com/article/Soft_Class.asp?ClassID=1">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-2-16 01:01:24 | 显示全部楼层
最初由 eachy 发布
[B]最近没有时间静下来写程序,把前段时间搜集来的一些网页提供给大家,有助于理解什么是参数,同时对一些算法可以有不同的理解。

22楼aeo和我的意思相同。你怎么也不加分加币呀:)
[/B]


最近时间太少:)过两天一起来.

再贴一次:
eachy有研究精神.还有几页也看看.



  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="800">
  2.   <tr>
  3.     <td width="100%" height="800">
  4.       <iframe name="I1" width="100%" height="100%" src="http://www.saltire.com/applets/advanced_geometry/spline/spline.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 22:36 , Processed in 0.193374 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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