|
发表于 2009-10-16 10:56:58
|
显示全部楼层
来自: 中国台湾
这是一个数学问题,先不管如何取得一系列的点序列,假设你已经有依序排好的点串列,只剩如何判断这串列的顺序是逆时钟还是顺时钟。# m$ Q" j3 V0 @
基本原理是,从这些点串列所围成的封闭区域中找任意点,或是边上的一点(点a),再由边上的其它连续两点(点b丶点c)对这个点所形成的角度,依序取其角度之正弦值(sin(点b-点a-点c)),相加後大於零则表示此序列为逆时钟方向,反之小於零,则为顺时钟方向。5 ?& ?0 W |) @
底下为示范例子:% S; F2 @; Q* n( p
ttt为子程序名,p123n(举例:((0.0 0.0 0.0) (1.0 0.0 0.0) (0.5 1.0 0.0))为点串列,% L# v& h( B0 _1 l. j" X/ @
则执行 (ttt '((0.0 0.0 0.0) (1.0 0.0 0.0) (0.5 1.0 0.0))) 後得到 1.98... > 06 Z6 R, `% I, {0 d1 C; x
表示此序列为逆时钟方向。9 V" D( O" H( U' m
/ |! ^7 S7 ^2 X' U% |' U( D
原程序:
4 K; X7 P1 N2 L4 J/ b/ b1 a# c(defun ttt (p123n / pt p23n1 r s)4 r. B% k: `0 j) i
(setq pt (mapcar '(lambda(a b) (/ (+ a b) 2.0)) (car p123n) (cadr p123n))
! e, c/ B' p% w, m5 a q p23n1 (append (cdr p123n) (list (car p123n)))
; Y9 l3 y6 L, F9 m6 S' A: y r 0.0; x# k" \+ B9 n4 d2 p# j2 Q3 U
)# u4 I- b+ s+ } T' l/ \
(mapcar '(lambda (a b / s)+ M/ M7 @1 {! \5 i( Z' T" I! \" f
(setq s (sin (- (angle pt a) (angle pt b)))
1 Z/ ^4 D* K& J! @# l( c r (+ r s)7 p( M! ]5 Z0 v
); _. n. l: u0 J G4 T) k
)
5 @3 ?; z- f. S p123n t$ C( W) }2 [/ I
p23n1- X! Y0 w7 x% y) a$ J
)
( `! B2 Z: U: ]+ A2 e# x+ j r
8 X4 s% V( Y1 x# C. U5 @)# |- x6 [3 l" j. g% x+ _6 v4 d
* B- o% T9 J1 M+ z
附加叙述,上述原理所提的任意点(点a),最好是确定在区域中的一点,边上点的选择不是最理想的,若是顶角点,那更糟糕,有时会得出等於零的结果,一样无法辨别方向。 |
评分
-
查看全部评分
|