本帖最后由 自贡黄明儒 于 2014-11-20 16:45 编辑
希望G版过来看,下面的程序改对了没有。
highflybir大师的程序太复杂了,不好使用http://bbs.mjtd.com/thread-111851-1-1.html。 - ;;164.42 [功能] 判断点在封闭曲线内外,自交曲线不适用
- ;;根据Gu_xl程序改编,希望适合UCS-----自贡黄明儒 2014.11.20
- ;;返回: 点在封闭曲线上或曲线内,返回T,否则返回nil
- ;;测试: (HH:PtInCurveP (car(entsel "\n选择曲线:")) (getpoint))
- (defun HH:PtInCurveP (POLY PT / CLOCKWISEP CP CURVELENGTH D1 D2 DEV DIST ENDPARAM ISUCS LST LW MAXP MINP PARAM X)
- (setq IsUCS (= (getvar "WORLDUCS") 0))
- (cond (IsUCS (setq pt (trans pt 1 0))))
- (setq cp (vlax-curve-getclosestpointto poly pt))
- (cond
- ((equal pt cp 1e-8) T) ;_ 点在曲线上 T
- ((progn
- (setq lw (vlax-ename->vla-object POLY))
- (vla-GetBoundingBox lw 'MinP 'MaxP)
- (setq MinP (vlax-safearray->list MinP))
- (setq MaxP (vlax-safearray->list MaxP))
- (not (ALG:InCorner-p pt MinP MaxP))
- )
- NIL ;_ 点在曲线最小包围盒外 nil
- )
- (t
- (setq lst (_pnts:box (list MinP MaxP))) ;4角点
- (setq
- lst (mapcar
- '(lambda (x)
- (vlax-curve-getParamAtPoint
- lw
- (vlax-curve-getClosestPointTo lw x)
- )
- )
- lst
- )
- ) ;_ 最小包围盒点在曲线上的投影点的参数表
- (setq ClockwiseP
- (or
- (<= (car lst) (cadr lst) (caddr lst) (cadddr lst))
- (<= (cadr lst) (caddr lst) (cadddr lst) (car lst))
- (<= (caddr lst) (cadddr lst) (car lst) (cadr lst))
- (<= (cadddr lst) (car lst) (cadr lst) (caddr lst))
- )
- ) ;_ 判断曲线是否为顺时针,顺时针 = T
- (setq endparam (vlax-curve-getendparam poly))
- (setq curvelength (vlax-curve-getDistAtParam poly endparam)) ;_ 曲线长度
- (setq param (vlax-curve-getparamatpoint poly cp))
- (setq dist (vlax-curve-getDistAtParam poly param))
- (if (equal param (fix param) 1e-8)
- (progn
- (cond ((minusp (setq d1 (- dist 1e-8))) (setq d1 (+ curvelength d1))))
- (cond ((> (setq d2 (+ dist 1e-8)) curvelength) (setq d2 (- d2 curvelength))))
- (setq d1 (vlax-curve-getpointatdist poly d1))
- (setq d2 (vlax-curve-getpointatdist poly d2))
- (if (< (distance pt d1)
- (distance pt d2)
- )
- (setq param d1)
- (setq param d2)
- )
- )
- )
- (setq dev (vlax-curve-getFirstDeriv poly param)
- cp (vlax-curve-getpointatparam poly param)
- )
- (= ClockwiseP (minusp (det pt cp (mapcar '+ cp dev))))
- )
- )
- )
- ;; 判断点是否在窗口内 by highflybir
- (defun ALG:InCorner-p (pt pMin pMax)
- (and
- (<= (car pMin) (car pt) (car pMax))
- (<= (cadr pMin) (cadr pt) (cadr pMax))
- )
- )
- ;;[功能] 两角点变四点(左下 右下 右上 左上)
- (defun _pnts:box (box)
- (list (car box)
- (list (caar box) (cadadr box) (last (car box)))
- (cadr box)
- (list (caadr box) (cadar box) (last (car box)))
- )
- )
- ;;174.2 [功能] 叉积(外积) By Highflybird
- ;;1 三角形之倍面积
- ;;2 p1 p2 p3 逆时针为正。
- ;;3 三点共线为0
- (defun det (p1 p2 p3 / x2 y2)
- (setq x2 (car p2)
- y2 (cadr p2)
- )
- (- (* (- x2 (car p3)) (- y2 (cadr p1))) (* (- x2 (car p1)) (- y2 (cadr p3))))
- )
|