跳到主要內容

lsp畫橢圓

文章日期:2009-01-08 08:48


使用AutoLisp畫橢圓


AutoCAD本身就有提供畫橢圓的功能,但是並沒有提供橢圓上各點的座標若要銑削時,就要自行求得橢圓上各個點的座標

本文旨在以AutoLisp語言來求得橢圓上各點的座標,並以AutoLisp畫出橢圓,以應證求得的橢圓上各點的座標是否正確
橢圓有長軸跟短軸,假設長軸之半為a,短軸之半為b則座標( a*cos(k1), b*sin(k1) )為橢圓上的一點,其結構如下圖所示:

據此資料來做橢圓圖時,則可得下列lisp程式:
(defun c:kk( / x1 y1 x2 y2 )
  (setvar "osmode" 0)
  (command "color" "bylayer")
  (setq xc 0.0  yc 0.0 )
  (setq pc (getpoint "Enter the center point of the ellipse. : "))
  (setq xc (car pc) yc (cadr pc))
  (setq a0 (getreal "\nEnter the longer axial length a. : <100> ") )
  (if (or (= a0 "")(= a0 nill))
      (setq a0 50.0)
      (setq a0 (/ a0 2)) )
  (setq b0 (getreal "\nEnter the shorter axial length b. : <50> ") )
  (if (or (= b0 "")(= b0 nill))
      (setq b0 25.0)
      (setq b0 (/ b0 2)) )
  (setq i1 1   x1 0.0  y1 0.0  x2 0.0 y2  0.0  )
  (setq unitAng (/ 3.1415926 180.0) wkAng 0)
  (while (< i1 362)
    (setq wkAng (+ wkAng unitAng))
    (setq x2 (+ xc (* a0 (cos wkAng))))
    (setq y2 (+ yc (* b0 (sin wkAng))))
    (if(> i1 1.5)
        (command "line" (list x1 y1)(list x2 y2) "") )
    (setq x1 x2  y1 y2 i1 (+ 1 i1))
  )
)

上面的AutoLisp是以作圖角方法來求得橢圓座標,但是該橢圓角(橢圓座標與橢圓中心的夾角)並不等於作圖角(請參考上圖),若要改以:在橢圓上每隔1度之橢圓角來求一個橢圓上的點座標,則AutoLisp更改如下:

(defun c:kk( / x1 y1 x2 y2 )
  (setvar "osmode" 0)
  (setq xc 0.0  yc 0.0 )
  (setq pc (getpoint "Enter the center point of the ellipse. : "))
  (if (or (= pc "")(= pc nill))
      (setq pc (list 0 0 0)))
  (setq xc (car pc) yc (cadr pc))
  (setq a0 (getreal "\nEnter the longer axial length a. : <100> ") )
  (if (or (= a0 "")(= a0 nill))
      (setq a0 50.0)
      (setq a0 (/ a0 2)) )
  (setq b0 (getreal "\nEnter the shorter axial length b. : <50> ") )
  (if (or (= b0 "")(= b0 nill))
      (setq b0 25.0)
      (setq b0 (/ b0 2)) )
  (setq i1 1   x1 0.0  y1 0.0  x2 0.0 y2  0.0  )
  (setq unitAng (/ 3.1415926 180.0) wkAng 0 eAng 0.0)
  (while (< i1 91)
    (setq wkAng (+ wkAng unitAng))
    (setq eAng (atan (/ (* b0 (sin wkAng)) (* a0 (cos wkAng)))))
    (setq x2 (+ xc (* a0 (cos eAng))))
    (setq y2 (+ yc (* b0 (sin eAng))))
    (if(> i1 1.5)
        (command "line" (list x1 y1)(list x2 y2) "") )
    (setq x1 x2  y1 y2 i1 (+ 1 i1))
  )
)

 到底要每隔多少角度來求一個橢圓座標才是適當的呢?角度太小則座標離得太近,若低於0.001mm,則CNC控制器無法讓機台移動,若是太大,則橢圓誤差大,一般較佳的方式並不是用角度當做重算間隔,而是以限定最大弦誤差的方式來當做重算間隔,弦誤差如下圖所示,此外,若要以銑刀來銑橢圓,還得考慮刀具半徑的偏置問題,http://tw.myblog.yahoo.com/cu01joe/article?mid=357&prev=362&next=341&l=f&fid=9,若是手寫程式,則以G41或G42行之則較簡便,使用上要注意初始的補正漸入及最後的補正漸出那兩個單節,不然極易過切或少切,請參考http://tw.myblog.yahoo.com/cu01joe/article?mid=429&prev=467&next=400&l=f&fid=9若是用CAD/CAM的方法,則直接算出偏置點為之 

留言