- UID
- 49855
- 积分
- 3191
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-5-16
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
借鉴下老大上面发的论文,论文链接:关于点与简单多边形位置关系的一种算法
给大家写个测试点是否在多边形内的代码,
程序中用到了高飞鸟斑竹的矩阵函数。
用的是射线法。
[pcode=lisp,true]
;;;-----------------------------------------------------------;;
;;; 向量乘标量(系数) ;;
;;; Vector x Scalar - Lee Mac ;;
;;; Args: v - vector in R^n, s - real scalar ;;
;;;-----------------------------------------------------------;;
(defun MAT:vxs ( v s )
(mapcar (function (lambda ( n ) (* n s))) v)
)
(defun GEO:Centroid (Pts / )
(MAT:vxs (apply 'mapcar (cons '+ pts)) (/ 1.0 (length pts)))
)
;| 参数
pts:多边形顶点集
testpoint:测试点
返回:T(内)NIL(外)
|;
(defun Points:PntIsIn (pts testpoint / centroid i_cnt item p_1 p_2 tmp vp1 x)
(setq i_cnt nil
centroid (geo:centroid pts)
vp1 3e10
tmp (angle testpoint centroid)
vp1 (polar testpoint tmp vp1)
i_cnt nil
)
(while (cdr pts)
(setq p_1 (car pts)
p_2 (cadr pts)
)
(if (setq tmp (inters
testpoint
vp1
p_1
p_2
't
)
)
(setq i_cnt (cons tmp i_cnt))
)
(setq pts (cdr pts))
)
(if i_cnt
(progn
(setq tmp (list (car i_cnt)))
(foreach item (cdr i_cnt)
(if (apply
'and
(mapcar
'(lambda (x)
(not (equal x item 0.001))
)
tmp
)
)
(setq tmp (cons item tmp))
)
)
(setq i_cnt tmp)
)
)
(if (zerop (rem (length i_cnt) 2))
nil
t
)
)
[/pcode]
|
|