Author Topic: [XDrX-Function(5)] Points Fitting Elliptic Function (xdrx-points->fitellipse)  (Read 943 times)

0 Members and 1 Guest are viewing this topic.

xdcad

  • Swamp Rat
  • Posts: 527
The following code is used to generate a random point cloud around the original ellipse, and then the function xdrx-points->fitellipse is used to fit the ellipse, and then the fitting accuracy is compared.

Looking at the chart data, it should be a perfect fit.



Code - Auto/Visual Lisp: [Select]
  1. (defun c:tt ()
  2.   (if (setq e (car
  3.                 (xdrx-entsel "\nPick Ellipse<Exit>:" '((0 . "ellipse")))
  4.               )
  5.       )
  6.     (progn
  7.       (xdrx-begin)
  8.       (setq info1 (xdrx-getpropertyvalue
  9.                     e              "center"       "area"
  10.                     "majorAxis"    "minorAxis"    "majorRadius"
  11.                     "minorRadius"
  12.                    )
  13.             info1 (cons "1" (cons "primitive ellipse" (mapcar 'vl-princ-to-string info1)))
  14.       )
  15.       (setq pts  (xdrx-curve-getsamplepoints e 200)
  16.             pts1 nil
  17.       )
  18.       (mapcar '(lambda (k)
  19.                  (repeat 10
  20.                    (setq x (xdrx-math-rand -5.0 5.0)
  21.                          y (xdrx-math-rand -5.0 5.0)
  22.                    )
  23.                    (setq pt (mapcar '+ k (list x y 0.0)))
  24.                    (xdrx-point-make pt)
  25.                    (setq pts1 (cons pt pts1))
  26.                  )
  27.                )
  28.               pts
  29.       )
  30.       (if (setq elli (xdrx-points->fitellipse (append pts1 pts)))
  31.         (progn
  32.           (xdrx-entity-setcolor elli 1)
  33.           (setq info2 (xdrx-getpropertyvalue
  34.                         elli            "center"        "area"
  35.                         "majorAxis"     "minorAxis"     "majorRadius"
  36.                         "minorRadius"
  37.                        )
  38.                 info2 (cons "2" (cons "Fit Ellipse" (mapcar 'vl-princ-to-string info2)))
  39.           )
  40.           (setq
  41.             lst (list (list "Ellipse Fitting Comparison Table" nil nil nil nil nil nil nil))
  42.             lst (append lst
  43.                         (list (list "No"           nil
  44.                                     "CENTER"       "AREA"
  45.                                     "MajorAxis"    "MajorRadius"
  46.                                     "MinorAxis"    "MinorRadius"
  47.                                    )
  48.                         )
  49.                 )
  50.             lst (append lst (list info1))
  51.             lst (append lst (list info2))
  52.             scl (* (xd::var:getratio) (xd::var:getscaleratio))
  53.             h   (* scl 4)
  54.           )
  55.           (xd::table:makefromlist lst '(0 0 0) h (/ h 2.0))
  56.           (xd::drag:simplemove (entlast) "\nTable Insert:" 8 t)
  57.           (xd::drag:simplemove elli "\nEllipse Insert Point:" 5 t)
  58.         )
  59.       )
  60.       (xdrx-end)
  61.     )
  62.   )
  63.   (princ)
  64. )
  65.  
« Last Edit: December 04, 2023, 01:29:51 PM by xdcad »
The code I wrote uses XDRX-API,which can be downloaded from github.com and is updated at any time.
===================================
https://github.com/xdcad
https://sourceforge.net/projects/xdrx-api-zip/
http://bbs.xdcad.net