- 积分
- 15341
- 明经币
- 个
- 注册时间
- 2002-2-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2004-1-8 11:14:00
|
显示全部楼层
- ;;轉貼
- ;|橢圓弧組碼41的意義...
- In elliptical arcs, group code 41 is described as the start parameter. However,
- it doesn't seem to be associated with any of the known values for the arc. How
- is this value derived?
- Answer
- An elliptical arc is a special version of an arc that follows the eccentricity
- of the ellipse. One way to generate this type of arc is to find the parametric
- normal of the starting point. To do so, you must specify a start angle that is
- different from the actual start angle of the drawn arc. Group code 41 contains
- this parametric angle expressed in radians.
- WHAT IS THE PARAMETRIC ANGLE?
- The parametric angle is generated from two concentric circles whose center is
- the center of the ellipse and whose radii are the major and minor axes,
- respectively. Every point of the ellipse lies either between or on these two
- circles, and each elliptical point can be defined by a unique relation to them.
- To discover this relationship, draw a line perpendicular to the major axis from
- a point on the ellipse to the closest intersection with the circle described by
- the major axis. Then do the same with the minor axis, starting from the
- elliptical point and drawing perpendicular to the minor axis until the line
- intersects the circle described by the minor axis. The two points of
- intersection with the circles are colinear with the center of the ellipse. The
- angle between the line containing these three points and the major axis is the
- parametric angle specified by group code 41.
- HOW DO I CALCULATE IT FROM THE TRUE START ANGLE?
- To calculate the parametric angle from the true start angle, you must first find
- the start point on the ellipse. This requires a simultaneous solution to the
- equations for the line and the ellipse. In this example we assume that the major
- axis of the ellipse lies on the x-axis with the origin at the center of the
- ellipse. When this point is found, you can use its y-value and the minor axis to
- solve the equation for the circle whose radius is the minor axis value and whose
- center is the center of the ellipse. This will provide the x,y point on the
- circle that dictates the parametric angle from the center of the ellipse.
- The following is an AutoLisp example that demonstrates how to use trigonometric
- functions to determine the parametric angle:
- code: |;
- (defun C:E_ARC (/ A B SLOPE ANG Q1 Q2 Q3 Q4 QMODE X Y A2)
- ;;assuming 0,0 is at the center of the ellipse, major axis in x direction
- (setq ANG (getangle '(0.0 0.0) "Choose start angle: "))
- (setq A 1
- B 0.5
- SLOPE (/ (sin ANG) (cos ANG))
- Q1 (/ pi 2.0)
- Q2 pi
- Q3 (/ (* 3 pi) 2.0)
- Q4 (* 2.0 pi)
- QMODE 'Q1
- ) ;setq
- (entmake (setq ENT '((0 . "ELLIPSE")
- (100 . "AcDbEntity")
- (100 . "AcDbEllipse")
- (10 0.0 0.0 0.0)
- (11 1.0 0.0 0.0)
- (40 . 0.5)
- (62 . 1)
- )
- ) ;setq
- ) ;entmake
- ;;line equation is y = mx + 0, where m is the slope and 0 is the y-intercept
- ;;ellipse equation is x^2/a^2 + y^2/b^2 = 1
- ;;solve line and ellipse equations simultaneously to find x and y values
- (setq Y (/ (* A B SLOPE)
- (sqrt (+ (* (* SLOPE SLOPE) (* A A)) (* B B)))
- )
- ) ;setq
- ;;minor axis circle equation is x^2 + y^2 = b^2
- ;;solve circle equation where y = value calculated above
- (setq X (sqrt (- (* B B) (* Y Y))))
- ;;calculate start angle trigonometrically
- (setq COS_A2 (/ X B)
- SIN_A2 (/ Y B)
- ) ;setq
- (if (/= COS_A2 0)
- (setq A2 (atan (/ SIN_A2 COS_A2)))
- (setq A2 Q1
- QMODE 'Q1
- )
- ) ;if
- ;;make a2 insensitive to quadrant
- (cond ((and (> ANG Q1) (< ANG Q2))
- (setq A2 (- pi (abs A2))
- QMODE 'Q2
- ) ;setq
- ) ;statement 1
- ((and (> ANG Q2) (< ANG Q3))
- (setq A2 (+ (abs A2) pi)
- QMODE 'Q3
- ) ;setq
- ) ;statement 2
- ((and (> ANG Q3) (< ANG Q4))
- (setq A2 (abs (- (* 2 pi) (abs A2)))
- QMODE 'Q4
- ) ;setq
- ) ;statement 3
- ;;special cases: angle = 0, 90, 180, 270 or 360 deg
- ((or (= ANG 0) (= ANG Q1))
- (setq QMODE 'Q1)
- ) ;statement 4
- ((= ANG Q2)
- (setq A2 pi
- QMODE 'Q1
- )
- ) ;statement 5
- ((= ANG Q3)
- (setq A2 (- (/ pi 2.0) pi)
- QMODE 'Q1
- )
- ) ;statement 6
- (t NIL) ;default statement
- ) ;cond
- (command "zoom" "c" "0,0" 3)
- (setq
- ENT (append ENT (list (cons 41 A2) (cons 42 (+ A2 (/ pi 2.0)))))
- )
- (setq ENT (subst '(62 . 5) (assoc 62 ENT) ENT))
- (entmake ENT)
- (setq A2
- (cond ((= QMODE 'Q1) A2)
- ((= QMODE 'Q2) A2)
- ((= QMODE 'Q3) (- A2 Q4))
- ((= QMODE 'Q4) (- A2 Q4))
- (t NIL)
- ) ;cond
- ) ;setq
- (princ "\nParametric angle in radians: ")
- (princ A2)
- (princ "\nParametric angle in degrees: ")
- (princ (/ (* 180 A2) pi))
- (princ)
- ) ;e_arc
|
|