马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
其中用到了很多通用函数,请这里下载
http://p4.xdcad.net/forum/showthread.php?s=&threadid=547917
求得逆时针多边形凸点的顶点序号
- ;;By Longxin 明经通道 2006.03
- ;;求得逆时针多边形凸点的顶点序号
- ;;参数:
- ;;多边形图元名或者多边形坐标例表
- ;;返回:凸点的顶点序号
- (defun dbx_tudian (ename / plist tu_list n i gd)
- (if (= (type ename) 'ENAME)
- (setq plist (coords ename)) ;如果参数为图元名则取得多边形的顶点坐标
- (progn
- (setq plist ename)
- )
- )
- (if (not (PlineCCW plist))
- (setq plist (reverse plist)) ;如果多边形不为逆时针则反向
- )
- ;;注意,此多边形必须是逆时针的!!!!!!!
- ;;依次判断多边形顶点的凹凸性,如为凹点则依次记录其在多边形中的序号到AO_LIST中
- ;;逆时针时,当点Pi+1在线Pi-1--Pi右则时为凹点,在左则或线上时为凸点
- (setq n (length plist))
- (if (= n 3)
- (setq tu_list plist);;如果为三角形,则全为凸点
- (progn;;参数大于三个坐标点
- (setq gd (pntonline (nth (- n 2) plist)
- (nth (- n 1) plist)
- (nth 0 plist)
- 5
- )
- )
- (if (or (> gd
- 0
- )
- (= gd 0)
- )
- (setq tu_list (append tu_list (list (- n 1))))
- )
- (setq n (length plist)
- gd (pntonline (nth (- n 1) plist)
- (nth 0 plist)
- (nth 1 plist)
- 5
- )
- )
- (if (or (> gd
- 0
- )
- (= gd 0)
- )
- (setq tu_list (append tu_list (list 0)))
- )
- (setq i 2)
- (repeat (- n 2)
- (setq gd (pntonline (nth (- i 2) plist)
- (nth (- i 1) plist)
- (nth i plist)
- 5
- )
- )
- (if (or (> gd
- 0
- )
- (= gd 0)
- )
- (setq tu_list (append tu_list (list (- i 1))))
- )
- (setq i (1+ i))
- )
- ;;end依次判断多边形顶点的凹凸性
- );;end 参数大于三个坐标点
- )
- tu_list
- )
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;(defun c:test ()
- ;;(setq ename (car (entsel)))
- ;;(setq plist (coords ename) ;取得多边形的顶点坐标
- ;; n (length plist)
- ;;)
- ;;(if (not (PlineCCW ename))
- ;; (setq plist (reverse plist)) ;如果多边形不为逆时针则反向
- ;; )
- ;;求得多边形凹点的集合
- ;; (setq ao_list (dbx_tudian plist))
- ;;)
求得逆时针多边形凹点的顶点序号
- ;;By Longxin 明经通道 2006.03
- ;;求得逆时针多边形凹点的顶点序号
- ;;参数:
- ;;多边形图元名或者多边形坐标例表
- ;;返回:凹点的顶点序号
- (defun dbx_aodian (ename / plist ao_list n i)
- (if (= (type ename) 'ENAME)
- (setq plist (coords ename)) ;如果参数为图元名则取得多边形的顶点坐标
- (progn
- (setq plist ename)
- )
- )
- (if (not (PlineCCW plist))
- (setq plist (reverse plist)) ;如果多边形不为逆时针则反向
- )
- ;;注意,此多边形必须是逆时针的!!!!!!!
- ;;依次判断多边形顶点的凹凸性,如为凹点则依次记录其在多边形中的序号到AO_LIST中
- ;;逆时针时,当点Pi+1在线Pi-1--Pi右则时为凹点,在左则或线上时为凸点
- (setq n (length plist))
- (if (< (pntonline (nth (- n 2) plist)
- (nth (- n 1) plist)
- (nth 0 plist)
- 5
- )
- 0
- )
- (setq ao_list (append ao_list (list (- n 1))))
- )
- (if (< (pntonline (nth (- n 1) plist)
- (nth 0 plist)
- (nth 1 plist)
- 5
- )
- 0
- )
- (setq ao_list (append ao_list (list 0)))
- )
- (setq i 2)
- (repeat (- n 2)
- (if (< (pntonline (nth (- i 2) plist)
- (nth (- i 1) plist)
- (nth i plist)
- 5
- )
- 0
- )
- (setq ao_list (append ao_list (list (- i 1))))
- )
- (setq i (1+ i))
- )
- ;;end依次判断多边形顶点的凹凸性
- ao_list
- )
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;(defun c:test ()
- ;;(setq ename (car (entsel)))
- ;;(setq plist (coords ename) ;取得多边形的顶点坐标
- ;; n (length plist)
- ;;)
- ;;(if (not (PlineCCW ename))
- ;; (setq plist (reverse plist)) ;如果多边形不为逆时针则反向
- ;; )
- ;;求得多边形凹点的集合
- ;; (setq ao_list (dbx_aodian plist))
- ;;)
求多边形的凸壳
求任意多边形内一点
- ;;(defun c:test ()
- ;;(in_point (car (entsel)))
- ;;)
- ;;功能:返回闭合曲线内的一点
- ;;By Longxin 明经通道 2006.03
- ;;参数:闭合曲线图元名(注,只适合曲线,包括拟合后的PLINE)
- ;;返回:(x y z)
- (defun in_point_spline (ename / pd pt obj parm startparm endparm yspt1 ang1 ang2 i
- n p j x y temp2 dist l1 gd2
- gd1 jd1
- )
-
- (setq obj (vlax-ename->vla-object ename)
- startparm (vlax-curve-getStartParam obj) ;取得曲线起点的参数
- endparm (vlax-curve-getendparam obj);取得曲线终点的参数
- parm (/ (+ startparm endparm) 2)
- pt (vlax-curve-getPointAtParam obj parm) ;取得曲线中间点坐标
- yspt1 (vlax-curve-getFirstDeriv obj parm)
- ;取得该点的第一衍生,即切线的衍生方向增量
- yspt1 (list (+ (nth 0 pt) (nth 0 yspt1))
- (+ (nth 1 pt) (nth 1 yspt1))
- (nth 2 pt)
- )
- ang2 (angle pt yspt1) ;曲线起点在曲线上的切线方位角
- )
-
- ;;如果曲线为逆时针,则可得到起点法线的方位角
- (if (PlineCCW_obj ename)
- (setq ang1 (+ ang2 (/ pi 2))) ;逆时针时+90度
- (setq ang1 (- ang2 (/ pi 2))) ;顺时针时-90度
- )
- ;;构造一条起点于曲线起点,边长大于曲线直径的line
- (setq gd2 (getbox ename) ;取得多边形的矩形外框
- gd2 (+ 100 (distance (nth 0 gd2) (nth 1 gd2)))
- gd2 (cons 10 (polar pt ang1 gd2))
- gd1 (cons 11 pt)
- )
- (entmake (list
- '(0
- .
- "line"
- )
- '(8 . "0")
- gd2
- gd1
- )
- )
- (setq l1 (entlast)) ;取得l1图元名
- ;;求得l1与多边形的交点坐标例表的表
- (setq jd1 (GetInterPointlist ename l1))
- (entdel l1)
-
- ;;计算各交点与曲线起点的距离,最近点(本身除外)与之连线的线段必在多边形内
- (setq n (length jd1)
- i 0
- dist nil
- )
- (repeat n
- (setq gd1 (distance pt (nth i jd1))
- dist (append dist (list gd1))
- i (1+ i)
- )
- )
- (setq dist (vl-sort dist '<) ;给距离排序
- dist (polar pt ang1 (/ (nth 1 dist) 2))
- )
-
- ;;(command "point" dist)
- )
- (
求平面点集的凸壳
(
- ;;(defun c:te (/ ss1 n plist)
- ;; (setq ss1 (ssget)
- ;; n (sslength ss1)
- ;; i 0)
- ;; (repeat n
- ;; (setq dxf (entget (ssname ss1 i))
- ;; pt (cdr (assoc 10 dxf))
- ;; plist (append plist (list pt))
- ;; i (1+ i)
- ;; ))
- ;; (dianji_tuke plist)
- ;; )
- ;;By Longxin 明经通道 2006.05
- ;;求得逆时针多边形凹点的顶点序号
- ;;参数:坐标例表
- ;;返回值:凸壳点表(逆时针)
- (defun dianji_tuke (plist / pt ang_list n i lst)
- (setq plist (order plist '(("(nth 1 " 1 "<"))) ;;对点表按Y坐标从小到大排序
- pt (nth 0 plist);;取得Y坐标最小点坐标
- plist (cdr plist);;去掉最小点后的坐标点列表
- n (length plist)
- i 0
- )
- ;;生成PT点与坐标点列表中每个点的方位角的集合
- (repeat n
- (setq ang_list (append ang_list (list (angle pt (nth i plist))))
- i (1+ i)
- )
- )
- ;;对方位角集合按从小到大排序,输出的是序号,而不是数据
- (setq ang_list (vl-sort-i ang_list '<))
- ;;按排序后的方位角的顺序生成由所有点组成的多边形点坐标列表
- (setq i 0
- lst (list pt)
- )
- (repeat n
- (setq lst (append lst (list (nth (nth i ang_list) plist)))
- i (1+ i)
- )
- )
- ;;调用求多边形凸壳函数
- (setq lst (dbx_tuke lst))
- ;;(makepline lst 1 0 nil)
- )
- (
|