找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4644|回复: 21

[点表] 对点表,根据其中存在的一个点PT为起点,逆时针重新排列

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-7 12:36:09 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::PntS:UnClockWise
调用格式: (XD::PntS:UnClockWise pts pt tol)
参数说明: pts --- 表
pt --- 表中点
tol --- 容差
返回值:
函数简介: 对点表,根据其中存在的一个点PT为起点,逆时针重新排l列
函数来源: 原创
函数作者: Lispboy
适用版本: 不限 
最后更新时间: 2013-06-07
备注: 非常实用的一个函数,比如对多段线取得顶点后,我们还不能定位这些顶点,先用 (XD::PntS:MinX->MinY pts pt tol)得到X最小,Y最小的点 P 后,再:(XD::Pnts:UnClockWise pts p tol),就获得的第一个顶点是X,Y最小,然后其他顶点逆时针排列的顶点表。
演示图片: -

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

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

×
本帖最后由 Lispboy 于 2013-6-7 12:55 编辑

  1. ;|
  2.    对点表,根据其中存在的一个点PT为起点,逆时针重新排序
  3.    参数
  4.       pts --- 表
  5.       pt  --- 表中点
  6.       tol --- 容差

  7.     返回值: 表
  8. |;
  9. (defun XD::PntS:UnClockWise (pts pt tol / _d)
  10.   (if (setq _d (vl-member-if '(lambda (x)
  11.                                 (equal x pt tol)
  12.                               ) pts
  13.                )
  14.       )
  15.     (progn
  16.       (if (< (XD::PntS:Area pts) 0.0)
  17.         (append
  18.           (vl-member-if '(lambda (x)
  19.                            (equal x pt tol)
  20.                          ) (reverse pts)
  21.           )
  22.           (reverse (cdr (vl-member-if '(lambda (x)
  23.                                          (equal x pt tol)
  24.                                        ) pts
  25.                         )
  26.                    )
  27.           )
  28.         )
  29.         (append
  30.           _d
  31.           (reverse (cdr (vl-member-if '(lambda (x)
  32.                                          (equal x pt tol)
  33.                                        ) (reverse pts)
  34.                         )
  35.                    )
  36.           )
  37.         )
  38.       )
  39.     )
  40.   )
  41. )



非常实用的一个函数,比如对多段线取得顶点后,我们还不能定位这些顶点,先用 (XD::PntS:MinX->MinY pts pt tol)得到X最小,Y最小的点 P 后,再:(XD::Pnts:UnClockWise pts p tol),就获得的第一个顶点是X,Y最小,然后其他顶点逆时针排列的顶点表,固定住多边形的顶点后,我们就可以做很多事情。

点的排序和定位非常重要,不管输入的数据时什么,在最终处理前都要能变成固定不变的数据给程序处理。

演示见下图:

QQ截图20130607125134.png

评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-7 12:46:40 来自手机 | 显示全部楼层
取得点后表分左右,该点和左表最后点及右表前几点求积,
另外,如果在一个直线上能判断吗?来自: Android客户端

点评

一条直线上,就直接 XD:nts:MinX->MinY 不就得了。  详情 回复 发表于 2013-6-7 12:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 12:48:51 | 显示全部楼层
Free-Lancer 发表于 2013-6-7 12:46
取得点后表分左右,该点和左表最后点及右表前几点求积,
另外,如果在一个直线上能判断吗?

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

使用道具 举报

发表于 2013-6-7 13:47:10 | 显示全部楼层
呵呵,和顺时针是一套函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-6-7 14:03:19 | 显示全部楼层
有这函数,求点就容易的多了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-6-18 07:53:29 | 显示全部楼层
收了顺时针,这个当然要支持,配套的嘛!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-30 19:37:01 | 显示全部楼层
本帖最后由 wowan1314 于 2013-7-30 19:55 编辑

没想明白,这个代码怎么能把点表逆时针排序呢?
  1. ;测试下排序的情况
  2. (defun c:t1 (/ ss a en p1 pts pts1 p lst1)
  3.     (setq ss (ssget '((0 . "TEXT"))) a -1)
  4.     (while (setq en (ssname ss (setq a (1+ a))))
  5.           (setq p1 (cdr(assoc 10 (entget en)))
  6.             pts (cons p1 pts)
  7.           )
  8.     )
  9.     (setq pts1 (xd::pnts:minx->miny pts 0.000001))
  10.     (setq p (car pts1))
  11.     (setq lst1 (xd::pnts:clockwise pts1 p 1e-5))
  12.     (command "PLINE")
  13.     (apply 'command lst1)
  14.     (command "")
  15. )
111.jpg

点评

顶点组成的多边形不能自交,自交就没什么逆顺时针的概念了。  详情 回复 发表于 2013-7-31 18:19
核心函数是 XD:ntS:Area , 这个在多边形逆(顺)时针的时候面积有正负。  详情 回复 发表于 2013-7-30 23:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-30 23:05:10 | 显示全部楼层
本帖最后由 Lispboy 于 2013-7-30 23:06 编辑
wowan1314 发表于 2013-7-30 19:37
没想明白,这个代码怎么能把点表逆时针排序呢?

核心函数是 XD::PntS:Area , 这个在多边形逆(顺)时针的时候面积有正负。

点评

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-31 18:19:41 | 显示全部楼层
wowan1314 发表于 2013-7-30 19:37
没想明白,这个代码怎么能把点表逆时针排序呢?

顶点组成的多边形不能自交,自交就没什么逆顺时针的概念了。

点评

哪些文字组成的多边形。正好是个长方形呀? 怎么会自交?提取出点表后 按你的函数排序后连线就成那样了。  详情 回复 发表于 2013-7-31 18:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-31 18:25:03 | 显示全部楼层
本帖最后由 wowan1314 于 2013-7-31 18:27 编辑
Lispboy 发表于 2013-7-31 18:19
顶点组成的多边形不能自交,自交就没什么逆顺时针的概念了。

哪些文字组成的多边形。正好是个长方形呀?
怎么会自交?提取出点表后 按你的函数排序后连线就成那样了。
感觉是MINX-MINY这个函数排序后的表不能用于求面积的函数。




点评

minx->miny只是求多边形顶点表中的X最小,Y最小点, 你的程序里面的pts1已经把点重新组合了。你后面的不能再用PTS1了,应该用原来的PTS啊, p是pts里面的最小点,然后根据这个最小点,还在你原来的构成多边形  详情 回复 发表于 2013-7-31 18:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-31 18:47:35 | 显示全部楼层
wowan1314 发表于 2013-7-31 18:25
哪些文字组成的多边形。正好是个长方形呀?
怎么会自交?提取出点表后 按你的函数排序后连线就成那样了 ...



minx->miny只是求多边形顶点表中的X最小,Y最小点, 你的程序里面的pts1已经把点重新组合了。你后面的不能再用PTS1了,应该用原来的PTS啊,

p是pts里面的最小点,然后根据这个最小点,还在你原来的构成多边形的顶点里面重新拍下。

(setq lst1 (xd::pnts:clockwise pts p 1e-5))

点评

1/ 你的示例图片就这样的。 2、如果用原来的PTS 那更加得不到想要的结果了。 你的函数就没排序的功能的。只是颠倒下表的顺序。 你可以自己测试看看.  详情 回复 发表于 2013-7-31 18:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-31 18:57:11 | 显示全部楼层
Lispboy 发表于 2013-7-31 18:47
minx->miny只是求多边形顶点表中的X最小,Y最小点, 你的程序里面的pts1已经把点重新组合了。你后面 ...

1/ 你的示例图片就这样的。
2、如果用原来的PTS  那更加得不到想要的结果了。
你的函数就没排序的功能的。只是颠倒下表的顺序。

你可以自己测试看看.


点评

是颠倒下顺序,但是位置关系和原来的表是一样的,挨着的还是挨着的。  详情 回复 发表于 2013-7-31 19:15
原来的点,前提就应该是正常的多边形取得的顶点(原来的这些顶点连起来要是个正常的多边形,不能自交),只是这个顶点表的第一个点位置是未知的,这个函数的作用只是把一个多边形的顶点通过函数给固定了, 第一个点  详情 回复 发表于 2013-7-31 19:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-31 19:14:22 | 显示全部楼层
wowan1314 发表于 2013-7-31 18:57
1/ 你的示例图片就这样的。
2、如果用原来的PTS  那更加得不到想要的结果了。
你的函数就没排序的功能 ...

原来的点,前提就应该是正常的多边形取得的顶点(原来的这些顶点连起来要是个正常的多边形,不能自交),只是这个顶点表的第一个点位置是未知的,这个函数的作用只是把一个多边形的顶点通过函数给固定了, 第一个点肯定是X最小的,Y最小的点,第二个点肯定是它时针方向上的第二个点。

点评

这样说的话就正确了。 对已经按时针排序好的点表 进行指定点的顺逆时针变换固定。  发表于 2013-7-31 19:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-31 19:15:52 | 显示全部楼层
wowan1314 发表于 2013-7-31 18:57
1/ 你的示例图片就这样的。
2、如果用原来的PTS  那更加得不到想要的结果了。
你的函数就没排序的功能 ...

是颠倒下顺序,但是位置关系和原来的表是一样的,挨着的还是挨着的。

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 是我没理解对你的意思。 固定点表也很有用.

查看全部评分

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-11-2 14:42:38 | 显示全部楼层
((22241.8 -6160.84) (22897.3 -7288.72) (22897.3 -6160.84) (22181.0 -7288.72))
怎么排成逆时针?似乎也不成呀!

点评

多边形不要自交,你这个图形,你顺时针有歧义。  详情 回复 发表于 2013-11-2 14:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 17:45 , Processed in 0.472490 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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