;; | ---------------------------------------------------------------------------- ;; | GE_Arc2Line ;; | ---------------------------------------------------------------------------- ;; | Function : Convert an ARC to a list of points to form a line (or polyline) ;; | Argument : ;; | 'Cen' - Center point ;; | 'Rad' - Radius of the ARC ;; | 'StAng' - Start Angle in degrees ;; | 'EndAng' - End Angle in degrees ;; | 'Mode' - Sampling Mode (can be "Angular", "ChordLen", ;; | "ChordOffset") ;; | 'ParVal' - Parameter Value ;; | Returns : A list of points forming the line segments along the arc ;; | Comments : Perform angle calculation in counter clockwise manner ;; | Updated : March 24, 1999 ;; | e-mail : rakesh.rao@4d-technologies.com ;; | Web : www.4d-technologies.com ;; | ---------------------------------------------------------------------------- (defun GE_Arc2Line(Cen Rad StAng EndAng Mode ParVal / CurAng CurPt PtLst ang tmp Continue EndChord MaxCrown ) (if (< EndAng StAng) (setq EndAng (+ EndAng 360.0)) ) (if (and (= ParVal 0.0) (= Mode "Angular")) (setq ParVal (- EndAng StAng)) ) (setq CurAng StAng CurPt (polar Cen (MI_d2r CurAng) Rad) PtLst (list CurPt) Continue T ) (if (member Mode (list "ChordLen" "ChordOffset")) (progn (cond ((= Mode "ChordLen") (setq EndChord (GE_GetEndChord Cen Rad (MI_d2r StAng) (MI_d2r EndAng))) (if (<= EndChord ParVal) (setq PtLst (append PtLst (list (polar Cen (MI_d2r EndAng) Rad))) Continue nil ) ) ) ((= Mode "ChordOffset") (setq MaxCrown (GE_GetBiggestCrown Cen Rad (MI_d2r StAng) (MI_d2r EndAng))) (if (<= MaxCrown ParVal) (setq PtLst (append PtLst (list (polar Cen (MI_d2r EndAng) Rad))) Continue nil ) ) ) ) )) (if Continue (progn (while (<= CurAng EndAng) (cond ((= Mode "Angular") (setq CurAng (+ CurAng ParVal)) ) ((= Mode "ChordLen") (setq tmp (* 2.0 (MI_Sqr Rad)) ang (/ (- tmp (MI_Sqr ParVal)) tmp) ang (MI_r2d (MI_acos ang)) CurAng (+ CurAng ang) ) ) ((= Mode "ChordOffset") (setq ang (/ (- Rad ParVal) Rad) ang (* 2.0 (MI_r2d (MI_acos ang))) CurAng (+ CurAng ang) ) ) ) (setq CurPt (polar Cen (MI_d2r CurAng) Rad) PtLst (cons CurPt PtLst) ) ) (setq CurPt (polar Cen (MI_d2r EndAng) Rad) PtLst (reverse (cons CurPt (cdr PtLst))) ) )) PtLst )