Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Фракталы в Lisp/AutoCAD


Автор: RussoTuristo 25.10.2010, 09:47
Необходимо написать программу, выводящую на экран фрактал 6-угольник Серпинского.
Идея фрактала такая: Есть 6 угольник, заданный вершинами X1,Y1; X2,Y2.....
1) Случайно ставим точку внутри этого 6-угольника, пусть она будет O(X7,Y7)
2) Цикл:
а)Случайно выбираем вершину
б) Ставим точку между выбранной вершиной и точкой O
в) Точке О присваиваем координаты новой точки
Повторять n раз(выяснится на практике)

С lispom только начали знакомство, в пособиях даже не написано как элементарно точку поставить... Знаю, что несложная программа, помогите пожалуйста:

Код

(DEFUN Frac()
  (Setq X1 50.0)
  (Setq Y1 150.0)
  (Setq A '(X1 Y1))
  (Setq B '(100 250))
  (Setq C '(200 250))
  (Setq D '(250 150))
  (Setq E '(200 50))
  (Setq F '(100 50))
  (Setq O '(120 175))
  (Command "_Line" A B C D E F A "")
  (Command "_Line" O O "")
)


Для того, чтобы можно было вычислять среднюю точку решил записывать координаты в переменные... но почему-то значения X1 Y1 не считываются и многоульник даже не строится...
+ не знаю как правильтно точку ставить)) Делаю пока как линию с одинаковым началом и концом...


Автор: VH_ 28.10.2010, 11:06
Код
(defun C:SERP ()
 (if (setq esel (entsel "\nSelect closed lightweight polyline: "))
  (if (= (cdr (assoc 0 (setq edata (entget (car esel))))) "LWPOLYLINE")
   (progn
    (setq vertices (apply 'append (mapcar '(lambda (node) (if (= (car node) 10) (list (cdr node)))) edata)))
    (setq vnum (length vertices))
    (setq pt
     (if (setq pt (getpoint "\nPick internal point <Centroid>: ")) pt
      (mapcar '(lambda (vcoord) (/ vcoord vnum)) (apply 'mapcar (cons '+ vertices)))))
    (setq pnum (progn (initget (+ 1 2 4)) (getreal "\nNumber of iterations: ")))
    (setq delta (progn (initget (+ 1 2 4)) (getreal "\nDistance division ratio 1:")))
; источник http://stratum.ac.ru/textbooks/modelir/lection22.html
    (setq M (expt 2.0 31) k 1220703125.0 b 7.0 R 7.0) 
;    (setq M (expt 2.0 31) k 69069.0 b 0.0 R 1.0)
;    (setq M (expt 2.0 31) k 71365.0 b 0.0 R 1.0)
    (while (>= (setq pnum (1- pnum)) 0)
     (entmake
      (mapcar 'cons
       (list 0 10)
       (list
        "POINT"
        (setq pt
         (mapcar
         '(lambda (pcoord vcoord)
           (/ (+ pcoord (* delta vcoord)) (1+ delta)))
          pt
          (nth (fix (* (/ (setq R (rem (+ (* k R) b) M)) M) vnum)) vertices))))))))
   (prompt "\nSelected entity is NOT a lightweight polyline."))
  (prompt "\nNothing selected.")))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)