|
发表于 2010-1-2 12:23:07
|
显示全部楼层
所谓角度捕捉,是指当十字光标在某一角度α的一定范围内选取一点时,该点自动落在该α角度线上;当我们设定捕捉角度为α时,将会以基准点作为原点、自X轴正方向出发,将整个屏幕划分为[360/α]个区间,则NXα角度就是角度捕捉线,其中,0≤N≤[360/α],[360/α]表示不大于360/α的整数。 8 ?0 K6 @7 W' q& m' M
4 x- X: j1 c; }2 g6 M- M 所谓长度捕捉,是在角度捕捉的基础上,在某一角度线上有一系列捕捉点,该系列点离基准点的距离为捕捉长度的正整数倍,当选取直线上的一点时,落点自动落到离其最近的捕捉点上。
8 W' C) T! N$ e) k
+ ~' J8 c4 c2 h# V: @% k 实现特定角度和长度捕捉的关键点是:当十字光标(即十字交叉线)移动时,程序要随时跟踪其交叉点的位置,并将该位置与用户所设定的捕捉角度与长度对应起来,从而计算出在该角度上的落点。 ' ~; n) v( K; u7 u' \
% B' E2 I! Z" Q3 H 以下举例说明该两个捕捉的实现过程:
8 X: u \ l9 m: C( ]; l8 F$ M! i7 F4 P
假定捕捉角度为α=30°,捕捉长度为L。
! Y \: P& V' _0 g7 w1 [, l; p6 {' n( R
当十字光标在任意的某一区间内移动时,比如在第5区间(120°~150 °)内移动时,此时,落点只能在120°或150°线上(该线在图中并不直接显示),该两根角度线的中心线为135°。当十字光标的中心点处在120°~135°之间时, 则落点应在120°线上,该落点的具体位置为由十字光标的中心点向120°线作垂线来获得,其交点D(称为垂点)即为落点,为直观起见,此时由基准点(此处为O点)向落点作一橡筋拖曳线,该橡筋拖曳线随十字光标的移动而相应移动,显示出拖动过程(见图1);同样,当十字光标的中心点处在135°~150°之间时,则落点应在150°线上,并显示相应的橡筋拖曳线。该橡筋拖曳线并不是真正的线段, 只是用XOR墨水绘制的一个向量,当用XOR墨水重新绘制一遍该向量时,该向量将从屏幕上消失,这就是本程序实现光标拖动的原理。 + K( h2 e# P6 Q6 t
# l) L# T3 f2 z/ `; I 落点落在某一捕捉角度线上时,还得落在捕捉长度L 的整数倍的点(称为捕捉点)上,还是针对图1,其垂点必然处于某两个捕捉点A与B之间,设A与B的中点为C,当D处于A与C之间时,落点应为A;当D处于C与B之间时,落点应为B (见图1)。其中:
" n/ S. E& P( h8 M* e! h3 G, Y, V, @5 u; @1 H7 A$ {0 H/ z$ y
-- -- ! ^5 ~4 U; }* S
( f9 [4 N2 ]& P+ _4 d& j8 V
OA = n XL ; OB = (n + 1) XL 0 {& q: j1 ~( V( F5 I
# b% u( h0 T# L! O! d
n: 非负整数。
2 {5 J( X3 L2 M! Z2 c+ O3 ^, C5 M7 V8 c! G6 B! t
L: 捕捉长度。 此时,程序通过一定的操作将在屏幕的最上面的坐标提示行准确地显示落点相对基准点的偏移长度和偏移角度。用户可以滑动鼠标准确捕捉到目标点。
/ b- n9 b( i: E- f7 Y3 n2 g, J
+ p4 G' w+ s# A/ I! a至此,已实现某些特定角度及长度的捕捉。为了满足在程序执行过程中能随时更改捕捉角度和捕捉长度的需要,本程序还增加了相应的模块;另外,本程序中嵌入了窗口放缩功能模块,通过点取下拉菜单中窗口及漫游子菜单,方便了各种作图的需要。 6 b% ]* I4 Z# @% L8 x
: [% v. ~6 f5 |5 {3 }& n% k& M
三、源程序清单
5 j+ d* J, U- V! N$ S
. x6 V! M. C" c/ V) s# Q ;; OS.LSP源程序 * d2 r& c9 U7 D8 Q3 C; F! k5 w0 U
+ P! }1 l6 M: ^8 v6 o: S% o
;;err(),出错处理子程序
9 ?# T" k2 F, L) |; g% s
4 t( X6 k5 H: t (defun err ( msg) 3 v. b, J: `# m" K2 m3 G8 R
% Z3 k& V2 a- A3 I& ]) X
(if (/= msg "Function cancelled")
- o. I# ] C8 \( V( g
" S8 d0 B' q& W# y- F+ O (princ(strcat "\nError:" msg)) ;打印错误内容
. c; f! K. l q1 ~5 D
$ t" p7 l0 e5 b+ N; A B5 B ) ;for if
; ]- H) a% z; h/ w: F1 e
4 n+ A5 {3 ]. \: A0 H+ C8 j (setq *error* olderr)
( H6 O q+ R! K r. y' t) I% y4 q" s i* b* y1 Z) }+ u% v+ j
(setvar "cmdecho" scmd) 0 F: V$ }: y) o5 Z/ E3 {# @0 {+ U
2 ^3 }6 ]( D5 i! \# Y, D5 _
(setvar "osmode" cosmode) 3 U! u) c; W3 _ c6 K5 Z T+ z
5 S) o' n" w6 I% E6 a (setvar "coords" ccoords) 3 K$ [' Q: J" Z9 T0 K1 n% z2 ^3 `
0 s+ V0 t: q, n, }, ~
(princ "n\n\t --多谢使用角度捕捉2.0版,程序非正常结束--!\n") j4 n$ T6 Y) d/ r0 t
+ |# V9 m, f. i0 B. y (princ) : e( ^! ?" _$ o' c7 L( F
t5 ^" G" c& M$ `
) ;for defun err
* f G; ?- v2 R. x3 [
: w( n0 J8 F* w9 a1 A ;; ant(),设定捕捉角度子程序 / I+ s5 d& ?0 T1 f5 m. n4 y
: Z: T1 X1 b& { (defun ant ( / ang0 ang1 )
% C- h5 V; M" r/ T! e# ~% ?- {; K
. J$ v$ |& C; x- j ]: y, b; L (setq ang0 (* an0 (/ 180 pi)) )
O9 U/ W1 O' k+ v8 b q! j( Q8 ?, c3 `6 `$ h/ u" `
(princ (strcat "\n请输入捕捉角度:<" (rtos ang0) ">_")) |
|