找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 844|回复: 1

[文章]:计算和entmake椭圆弧的方法和程序...

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-30 00:10:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ical arcs, group code 41 is described as the "start parameter".
However, its association with known values for the arc is difficult to
determine. How is this value derived?

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.

Below is an AutoLisp example that demonstrates how to use trigonometric
functions to determine the parametric angle:

  1. (defun c:e_arc( / a b slope ang q1 q2 q3 q4 qmode x y a2)
  2.   ;assuming 0,0 is at the center of the ellipse, major axis in x direction
  3.   (setq ang (getangle '(0.0 0.0) "Choose start angle: "))
  4.   (setq a 1
  5.          b 0.5
  6.          slope (/ (sin ang) (cos ang))
  7.          q1 (/ pi 2.0)
  8.          q2 pi
  9.          q3 (/ (* 3 pi) 2.0)
  10.          q4 (* 2.0 pi)
  11.          qmode 'q1
  12.   );setq

  13.   (entmake (setq ent '((0 . "ELLIPSE")
  14.                         (100 . "AcDbEntity")
  15.                         (100 . "AcDbEllipse")
  16.                         (10 0.0 0.0 0.0)
  17.                         (11 1.0 0.0 0.0)
  18.                         (40 . 0.5)
  19.                         (62 . 1))
  20.             );setq
  21.   );entmake
  22.    
  23.   ;line equation is y = mx + 0, where m is the slope and 0 is the y-intercept
  24.   ;ellipse equation is x^2/a^2 + y^2/b^2 = 1
  25.   ;solve line and ellipse equations simultaneously to find x and y values
  26.    
  27.   (setq y (/ (* a b slope) (sqrt (+ (* (* slope slope) (* a a)) (* b b)))))
  28.    
  29.   ;minor axis circle equation is x^2 + y^2 = b^2
  30.   ;solve circle equation where y = value calculated above
  31.   (setq x (sqrt (- (* b b) (* y y))))
  32.    
  33.   ;calculate start angle trigonometrically
  34.   (setq cos_a2 (/ x b)
  35.          sin_a2 (/ y b)
  36.   );setq

  37. (if (/= cos_a2 0)
  38.      (setq a2 (atan (/ sin_a2 cos_a2)))
  39.      (setq a2 q1
  40.       qmode 'q1)
  41.   );if
  42.    
  43.   ;make a2 insensitive to quadrant
  44.   (cond ((and (> ang q1) (< ang q2))
  45.              (setq a2 (- pi (abs a2))
  46.                   qmode 'q2
  47.              );setq
  48.          );statement 1
  49.         ((and (> ang q2) (< ang q3))
  50.             (setq a2 (+ (abs a2) pi)
  51.                 qmode 'q3
  52.            );setq
  53.          );statement 2
  54.         ((and (> ang q3) (< ang q4))
  55.             (setq a2 (abs (- (* 2 pi) (abs a2)))
  56.                  qmode 'q4
  57.              );setq
  58.         );statement 3
  59.    
  60.       ;special cases: angle = 0, 90, 180, 270 or 360 deg
  61.       ((or (= ang 0) (= ang q1))
  62.            (setq qmode 'q1)
  63.         );statement 4
  64.       ((= ang q2)
  65.            (setq a2 pi qmode 'q1)
  66.       );statement 5
  67.       ((= ang q3)
  68.            (setq a2 (- (/ pi 2.0) pi) qmode 'q1)
  69.       );statement 6
  70.            (t nil);default statement
  71.   );cond
  72.    
  73.   (command "zoom" "c" "0,0" 3)
  74.   (setq ent (append ent (list (cons 41 a2) (cons 42 (+ a2 (/ pi 2.0))))))
  75.   (setq ent (subst '(62 . 5) (assoc 62 ent) ent))
  76.   (entmake ent)

  77.   (setq a2
  78.       (cond ((= qmode 'q1) a2)
  79.            ((= qmode 'q2) a2)
  80.            ((= qmode 'q3) (- a2 q4))
  81.            ((= qmode 'q4) (- a2 q4))
  82.            (t nil)
  83.       );cond
  84.   );setq

  85.   (princ "\nParametric angle in radians: ")
  86.   (princ a2)
  87.   (princ "\nParametric angle in degrees: ")
  88.   (princ (/ (* 180 a2) pi))
  89.   (princ)
  90.   );e_arc
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 19个

财富等级: 恭喜发财

发表于 2019-2-6 13:22:51 | 显示全部楼层
学习学习学习学习学习学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 06:46 , Processed in 0.377413 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表