|
|
发表于 2009-10-16 10:56:58
|
显示全部楼层
来自: 中国台湾
这是一个数学问题,先不管如何取得一系列的点序列,假设你已经有依序排好的点串列,只剩如何判断这串列的顺序是逆时钟还是顺时钟。
6 e0 N9 x1 {5 _6 } J8 `+ z$ e基本原理是,从这些点串列所围成的封闭区域中找任意点,或是边上的一点(点a),再由边上的其它连续两点(点b丶点c)对这个点所形成的角度,依序取其角度之正弦值(sin(点b-点a-点c)),相加後大於零则表示此序列为逆时钟方向,反之小於零,则为顺时钟方向。
, H7 Q" h6 t t底下为示范例子:
7 I4 e3 h* m( I6 ~. E* a" ]( s& u4 {* \ttt为子程序名,p123n(举例:((0.0 0.0 0.0) (1.0 0.0 0.0) (0.5 1.0 0.0))为点串列,
. r) k! D0 v( z# ~则执行 (ttt '((0.0 0.0 0.0) (1.0 0.0 0.0) (0.5 1.0 0.0))) 後得到 1.98... > 0
" j# n/ R5 @# r) f" T) C- M7 ]表示此序列为逆时钟方向。; c2 n/ z9 I: }/ N9 h
! r- S+ \$ ?; e# [* M原程序:
. S! t# r+ M# B! [# v5 h* ](defun ttt (p123n / pt p23n1 r s)
, s# |) x% ^- k (setq pt (mapcar '(lambda(a b) (/ (+ a b) 2.0)) (car p123n) (cadr p123n))
+ k7 } |; U* T4 _7 X p23n1 (append (cdr p123n) (list (car p123n))); Q O, |5 s; z3 t
r 0.0& T! O7 M E6 c6 V7 H* Z2 ?7 g
)
4 S; G* \9 \- @. |. A" K) W (mapcar '(lambda (a b / s)& Q+ v6 p. d9 p \
(setq s (sin (- (angle pt a) (angle pt b))), k T" E; k1 d2 ~3 L9 X7 `. ~
r (+ r s)% u$ S0 J& q' Q4 M: b% {9 K" i
)
- Z+ J0 P; [: N' ? C )& i/ K- s. w' m
p123n
, q8 L% f6 S" D3 g d( K' i" z p23n1
( ^( T- Y- t3 _1 W3 j )
+ e, F$ R8 N0 r- W( e. I r
# a: k* ^) G t: f$ N; X9 ~)
- O0 _% i" J6 x# s8 m! l! h- U* s! d! |: V
附加叙述,上述原理所提的任意点(点a),最好是确定在区域中的一点,边上点的选择不是最理想的,若是顶角点,那更糟糕,有时会得出等於零的结果,一样无法辨别方向。 |
评分
-
查看全部评分
|