找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1264|回复: 12

[LISP程序]:请教判断闭合PLINE点的两个算法问题

[复制链接]
发表于 2004-11-28 09:15:15 | 显示全部楼层 |阅读模式

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

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

×
问题1:

一条闭合PLINE线,怎么能判断出线是以顺时针方向走的?

问题2:

怎样能判断出一条闭合PLINE线的左上角?

以上问题用于测绘地藉图的宗地线

圆位左上角点,箭头位闭合线顺时针方向
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-11-28 09:44:00 | 显示全部楼层
1. 一般来说多义线并没有顺时/逆时这种属性, 对于简单的多义线得给出充分的已知条件, 最好贴个图或详细说明一下.
2. 能否用通俗的CAD语言来描绘什么是"PLINE线的左上角" ? 否则非测绘专业的朋友想帮你也爱莫能助.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-11-28 18:00:02 | 显示全部楼层
这是小狼的图:

                               
登录/注册后可看大图




两个问题都不严密,不过给定一些条件,倒也可以变通。
1.对于地块,一般可以认为是闭合的,且线形没有扭曲的(“8”字形),可以将各个点坐标平均求一个假定中心,然后根据各点与此点的关系判别顺逆,此种方法对包含凹边的、形状怪异的地块就不行了,这里就当作抛砖引玉吧。
2.所谓左上角,无非就是说“X坐标较小,Y坐标较大”,单单这个条件是不足以判断较复杂图形的,还需要设定另外的条件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-28 18:49:02 | 显示全部楼层
关键是做这些有什么意义吗?地籍我也做过,好象不需要判断这些吧?它是根据第一个点来判断序号,后面的顺序正、反都没有特定的要求!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-11-28 21:04:49 | 显示全部楼层
地藉点好要以左上角一个点按顺时针方向排序啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-11-29 05:10:20 | 显示全部楼层
试试这个:
判断多义线是否顺时针走向(只适用于单纯走向的多义线)
[php]
(defun c:test (/ pp)
  (setq ent (car (entsel "\nSelect a Polyline:")))
  (setq pp (acet-geom-vertex-list ent))
  (setq ang (angle (car pp)(cadr pp)))
  (if (or (and (>= ang 0)(< ang (/ pi 2)))
          (and (> ang (* 1.5 pi))(<= ang (* 2 pi))))
   T
   nil
  )
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-12-1 20:29:01 | 显示全部楼层
最初由 自由的鱼 发布
[B]你用的是什么做图系统? [/B]


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

使用道具 举报

发表于 2004-12-1 22:45:31 | 显示全部楼层
最初由 小狼 发布
[B]

我用的MAP6,也就是CAD2002 [/B]


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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-12-2 00:07:37 | 显示全部楼层
摘录 XD 工具箱函数

  1. ;|
  2.    返回点表的Y最小,X最小
  3. |;
  4. (defun $XDLSP_Points_MinY->MinX        (pts / box n disy disx old new ptl)
  5.   (setq        box (apply
  6.               'xdrx_pointsbox
  7.               pts
  8.             )
  9.   )
  10.   (foreach n pts
  11.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  12.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  13.           disx (atof (rtos disx 2 3))
  14.           disy (atof (rtos disy 2 3))
  15.     )
  16.     (if        (setq old (assoc disy ptl))
  17.       (progn
  18.         (setq new (list disy (cons (list disx n) (cadr old)))
  19.               ptl (subst
  20.                     new
  21.                     old
  22.                     ptl
  23.                   )
  24.         )
  25.       )
  26.       (progn
  27.         (setq ptl (cons (list disy (list (list disx n))) ptl))
  28.       )
  29.     )
  30.   )
  31.   (cadar (apply
  32.            'xdrx_rlistsort2
  33.            (cadar (apply
  34.                     'xdrx_rlistsort2
  35.                     ptl
  36.                   )
  37.            )
  38.          )
  39.   )
  40. )
  41. ;|
  42.    返回点表的Y最小,X最大
  43. |;
  44. (defun $XDLSP_Points_MinY->MaxX        (pts / ptl box n disy disx old new ptl)
  45.   (setq        box (apply
  46.               'xdrx_pointsbox
  47.               pts
  48.             )
  49.   )
  50.   (foreach n pts
  51.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  52.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  53.           disx (atof (rtos disx 2 3))
  54.           disy (atof (rtos disy 2 3))
  55.     )
  56.     (if        (setq old (assoc disy ptl))
  57.       (progn
  58.         (setq new (list disy (cons (list disx n) (cadr old)))
  59.               ptl (subst
  60.                     new
  61.                     old
  62.                     ptl
  63.                   )
  64.         )
  65.       )
  66.       (progn
  67.         (setq ptl (cons (list disy (list (list disx n))) ptl))
  68.       )
  69.     )
  70.   )
  71.   (cadr        (last (apply
  72.                 'xdrx_rlistsort2
  73.                 (cadar (apply
  74.                          'xdrx_rlistsort2
  75.                          ptl
  76.                        )
  77.                 )
  78.               )
  79.         )
  80.   )
  81. )
  82. ;|
  83.    返回点表的Y最大,X最小
  84. |;
  85. (defun $XDLSP_Points_MaxY->MinX        (pts / ptl box n disy disx old new ptl)
  86.   (setq        box (apply
  87.               'xdrx_pointsbox
  88.               pts
  89.             )
  90.   )
  91.   (foreach n pts
  92.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  93.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  94.           disx (atof (rtos disx 2 3))
  95.           disy (atof (rtos disy 2 3))
  96.     )
  97.     (if        (setq old (assoc disy ptl))
  98.       (progn
  99.         (setq new (list disy (cons (list disx n) (cadr old)))
  100.               ptl (subst
  101.                     new
  102.                     old
  103.                     ptl
  104.                   )
  105.         )
  106.       )
  107.       (progn
  108.         (setq ptl (cons (list disy (list (list disx n))) ptl))
  109.       )
  110.     )
  111.   )
  112.   (cadar (apply
  113.            'xdrx_rlistsort2
  114.            (cadr (last (apply
  115.                          'xdrx_rlistsort2
  116.                          ptl
  117.                        )
  118.                  )
  119.            )
  120.          )
  121.   )
  122. )
  123. ;|
  124.    返回点表的Y最大,X最大
  125. |;
  126. (defun $XDLSP_Points_MaxY->MaxX        (pts / ptl box n disy disx old new ptl)
  127.   (setq        box (apply
  128.               'xdrx_pointsbox
  129.               pts
  130.             )
  131.   )
  132.   (foreach n pts
  133.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  134.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  135.           disx (atof (rtos disx 2 3))
  136.           disy (atof (rtos disy 2 3))
  137.     )
  138.     (if        (setq old (assoc disy ptl))
  139.       (progn
  140.         (setq new (list disy (cons (list disx n) (cadr old)))
  141.               ptl (subst
  142.                     new
  143.                     old
  144.                     ptl
  145.                   )
  146.         )
  147.       )
  148.       (progn
  149.         (setq ptl (cons (list disy (list (list disx n))) ptl))
  150.       )
  151.     )
  152.   )
  153.   (cadr        (last (apply
  154.                 'xdrx_rlistsort2
  155.                 (cadr (last (apply
  156.                               'xdrx_rlistsort2
  157.                               ptl
  158.                             )
  159.                       )
  160.                 )
  161.               )
  162.         )
  163.   )
  164. )
  165. ;|
  166.    返回点表的X最大,Y最小
  167. |;
  168. (defun $XDLSP_Points_MaxX->MinY        (pts / ptl box n disy disx old new ptl)
  169.   (setq        box (apply
  170.               'xdrx_pointsbox
  171.               pts
  172.             )
  173.   )
  174.   (foreach n pts
  175.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  176.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  177.           disx (atof (rtos disx 2 3))
  178.           disy (atof (rtos disy 2 3))
  179.     )
  180.     (if        (setq old (assoc disx ptl))
  181.       (progn
  182.         (setq new (list disx (cons (list disy n) (cadr old)))
  183.               ptl (subst
  184.                     new
  185.                     old
  186.                     ptl
  187.                   )
  188.         )
  189.       )
  190.       (progn
  191.         (setq ptl (cons (list disx (list (list disy n))) ptl))
  192.       )
  193.     )
  194.   )
  195.   (cadar (apply
  196.            'xdrx_rlistsort2
  197.            (cadr (last (apply
  198.                          'xdrx_rlistsort2
  199.                          ptl
  200.                        )
  201.                  )
  202.            )
  203.          )
  204.   )
  205. )
  206. ;|
  207.    返回点表的X最大,Y最大
  208. |;
  209. (defun $XDLSP_Points_MaxX->MaxY        (pts / ptl box n disy disx old new ptl)
  210.   (setq        box (apply
  211.               'xdrx_pointsbox
  212.               pts
  213.             )
  214.   )
  215.   (foreach n pts
  216.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  217.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  218.           disx (atof (rtos disx 2 3))
  219.           disy (atof (rtos disy 2 3))
  220.     )
  221.     (if        (setq old (assoc disx ptl))
  222.       (progn
  223.         (setq new (list disx (cons (list disy n) (cadr old)))
  224.               ptl (subst
  225.                     new
  226.                     old
  227.                     ptl
  228.                   )
  229.         )
  230.       )
  231.       (progn
  232.         (setq ptl (cons (list disx (list (list disy n))) ptl))
  233.       )
  234.     )
  235.   )
  236.   (cadr        (last (apply
  237.                 'xdrx_rlistsort2
  238.                 (cadr (last (apply
  239.                               'xdrx_rlistsort2
  240.                               ptl
  241.                             )
  242.                       )
  243.                 )
  244.               )
  245.         )
  246.   )
  247. )
  248. ;|
  249.    返回点表的X最小,Y最大
  250. |;
  251. (defun $XDLSP_Points_MinX->MaxY        (pts / ptl box n disy disx old new ptl)
  252.   (setq        box (apply
  253.               'xdrx_pointsbox
  254.               pts
  255.             )
  256.   )
  257.   (foreach n pts
  258.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  259.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  260.           disx (atof (rtos disx 2 3))
  261.           disy (atof (rtos disy 2 3))
  262.     )
  263.     (if        (setq old (assoc disx ptl))
  264.       (progn
  265.         (setq new (list disx (cons (list disy n) (cadr old)))
  266.               ptl (subst
  267.                     new
  268.                     old
  269.                     ptl
  270.                   )
  271.         )
  272.       )
  273.       (progn
  274.         (setq ptl (cons (list disx (list (list disy n))) ptl))
  275.       )
  276.     )
  277.   )
  278.   (cadr        (last (apply
  279.                 'xdrx_rlistsort2
  280.                 (cadar (apply
  281.                          'xdrx_rlistsort2
  282.                          ptl
  283.                        )
  284.                 )
  285.               )
  286.         )
  287.   )
  288. )
  289. ;|
  290.    返回点表的X最小,Y最小
  291. |;
  292. (defun $XDLSP_Points_MinX->MinY        (pts / ptl box n disy disx old new ptl)
  293.   (setq        box (apply
  294.               'xdrx_pointsbox
  295.               pts
  296.             )
  297.   )
  298.   (foreach n pts
  299.     (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
  300.           disx (abs (xdrx_p2ldist n (car box) (last box)))
  301.           disx (atof (rtos disx 2 3))
  302.           disy (atof (rtos disy 2 3))
  303.     )
  304.     (if        (setq old (assoc disx ptl))
  305.       (progn
  306.         (setq new (list disx (cons (list disy n) (cadr old)))
  307.               ptl (subst
  308.                     new
  309.                     old
  310.                     ptl
  311.                   )
  312.         )
  313.       )
  314.       (progn
  315.         (setq ptl (cons (list disx (list (list disy n))) ptl))
  316.       )
  317.     )
  318.   )
  319.   (cadar (apply
  320.            'xdrx_rlistsort2
  321.            (cadar (apply
  322.                     'xdrx_rlistsort2
  323.                     ptl
  324.                   )
  325.            )
  326.          )
  327.   )
  328. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 01:14:20 | 显示全部楼层

  1. ;; 返回点表 (x最小点 x最大点 y最小点 y最大点)
  2. (defun ttt (pts / ps1 ps2)
  3.   (setq ps1 (vl-sort pts '(lambda(x y)(<(car x)(car y))))
  4.         ps2 (vl-sort pts '(lambda(x y)(<(cadr x)(cadr y)))))
  5.   (list (car ps1)(last ps1)(car ps2)(last ps2))
  6. )

  7. (setq pts '((0. 1.2)(5.1 3.3)(2.5 6.3)(1.2 3.6)(2.3 3.1)(5.0 1.4)(0.2 4.3)(0.9 0.5)))
  8. (ttt pts) ;->((0.0 1.2) (5.1 3.3) (0.9 0.5) (2.5 6.3))

  9. ;; 返回点表 (x最小值 x最大值 y最小值 y最大值)
  10. (defun ttt2 (pts /)
  11.   (setq lst (ttt pts))
  12.   (list (car(nth 0 lst)) (car(nth 1 lst)) (cadr(nth 2 lst)) (cadr(nth 3 lst)))
  13. )
  14. (ttt2 pts);->(0.0 5.1 0.5 6.3)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 09:48:12 | 显示全部楼层
不懂2楼长老的意思,7楼的程序能适合闭合PLINE吗?顺逆时针走向直接关系3D贴图(但现在大家都使运算庞大的实体了)
10楼的斑竹的程序好长,我有些吃不消~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 11:07:27 | 显示全部楼层
最初由 xxxyzxx 发布
[B]不懂2楼长老的意思,7楼的程序能适合闭合PLINE吗?。。。[/B]

7楼的程序可用于闭合或非闭合的多义线。其实,你试一下不就知道了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 15:26 , Processed in 0.416145 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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