Фракталы в AutoLISP - Страница 2
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Фракталы в AutoLISP

Фракталы в AutoLISP

Ответ
Поиск в этой теме
Непрочитано 13.11.2010, 13:19
Фракталы в AutoLISP
Seregarival
 
Регистрация: 13.11.2010
Сообщений: 15

Преподаватель дал задание нарисовать фрактал "Шестиугольник Серпинского", но сам он немного понимает в Автокад/ЛИСП, ничего толком не объяснил.
В общем суть проблемы в том, что в Lisp из AutoCAD2010 нет случайных чисел, а фрактал использует их... В итоге я узнал, что в AutoCAD2007 они есть, не могли бы подсказать как правильно их использовать, функция rnd не работает....
Для создания фрактала нужно нарисовать шестиугольник, потом выбирается случайная точка О внутри него, и ставится точка на середине отрезка от данной точки О до произвольной вершины, потом опять выбирается произвольная вершина и ставится точка на середине отрезка.... в общем без случайных чисел никак...
Сам плохо пока знаю LISP, нужна помощь:

(DEFUN F()
;(Setq X 50)
;(Setq Y 150)
(Setq A '(50 150))
(Setq B '(100 250))
(Setq C '(200 250))
(Setq D '(250 150))
(Setq E '(200 50))
(Setq F '(100 50))
;(Setq O '((Rnd 200) (Rnd 200)))
(Command "_Line" A B C D E F A "")
) Пока только начало кода, но без помощи дальше уже никак...
Как уже написал Rnd не работает и еще один косяк:
(Setq X 50)
(Setq Y 150)
(Setq A '(X Y))
Почему такая конструкция не работает?
Помогите, пожалуйста!
Просмотров: 9473
 
Непрочитано 14.11.2010, 18:20
#21
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Цитата:
Сообщение от gomer Посмотреть сообщение
Хм, точно...
Вообще, шестиугольник Серпинского как фрактал строится рекурсивно и мне непонятно зачем здесь rng и где собственно рекурсия
Рекурсия при построении фрактала не обязательна, в данном случае достаточно итерации.
rnd требуется только для случайного выбора вершины шестиугольника.
Рекурсия в самом внешнем виде фрактала - он подобен своей части.
Миниатюры
Нажмите на изображение для увеличения
Название: Фрактал.jpg
Просмотров: 157
Размер:	51.6 Кб
ID:	48156  

Последний раз редактировалось Li6-D, 14.11.2010 в 18:36.
Li6-D вне форума  
 
Автор темы   Непрочитано 14.11.2010, 18:45
#22
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Спасибо большое за разъяснение, меня тоже смущала картинка, но в найденном описании был приведен пример с треугольником и написано: шестиугольник строится по тому же принципу(что-то я и не подумал что-то в нем изменить)!

Вдруг кого-то заинтересует, вот код:
Код:
[Выделить все]
(DEFUN Fyt()
  ;для начала нарисуем шестиугольник
  (Setq A '(50 150))
  (Setq B '(100 250))
  (Setq C '(200 250))
  (Setq D '(250 150))
  (Setq E '(200 50))
  (Setq F '(100 50))
  (Command "_Line" A B C D E F A "")
  ;далее внутри него нарисуем произвольную точку
  (setq O (mapcar '(lambda (x)(fix(* x 200)))(list (Rng) (Rng))))
  ;Организуем цикл для построения множества точек
   (repeat 10000
	;выберем произвольную вершину
	(setq
	  R (fix (* 6 (Rng)))
	  Ptt (nth R (list A B C D E F))
	  P ; поставим точку на середине отрезка между выбранной точкой и произвольной вершиной
	  (polar
	  	Ptt
	  	(angle Ptt O)
	  	(/ (DISTANCE Ptt O) 3))
	)
	;теперь в качестве новой точки выбрана точка P
	;будем искать точку между данной и случайной вершиной
	(Command "_Circle" P 0.1)
	(setq O P)
  )
)

   
(defun rng (/ modulus multiplier increment rand)
;;; Генерирует псевдослучайное число от 0.0000000 до 0.9999999
  (if (not seed)
	(setq seed (getvar "DATE"))
  )
  (setq
	modulus    4294967296.0 ; 65536
	multiplier 1664525      ; 25173
	increment  1            ; 13849
	seed (rem (+ (* multiplier seed) increment) modulus)
	rand (/ seed modulus)
  )
)
Спасибо еще раз всем огромное за помощь!

Последний раз редактировалось Seregarival, 14.11.2010 в 18:56.
Seregarival вне форума  
 
Автор темы   Непрочитано 14.11.2010, 20:42 Фракталы в AutoLISP2
#23
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Необходимо нарисовать кривую Серпинского (она состоит из линий одинаковой длины, расположенных под определенным углом)
Делать её необходимо рекурсивно, можно сделать половину и отобразить, но до этого еще надо дойти, столкнулся с непредвиденной трудностью, функция POLAR непонятно для меня вычисляет углы, помогите разобраться:
Код:
[Выделить все]
(Defun Frac()
  (Setq X '(100 100) Y '(120 100))
  (Setq Z1 (POLAR Y 120 20))
  (Setq Z2 (POLAR Z1 60 20))
  (Setq Z3 (POLAR Z2 120 20))
  (Command "_LINE" X Y Z1 Z2 Z3 "")
)
(Setq Z2 (POLAR Z1 60 20)) - линия вообще непонятно под каким углом и к чему, ставлю разные значения и все время она непредсказуемо уходит в сторону, подскажите, пожалуйста, почему?
Seregarival вне форума  
 
Непрочитано 14.11.2010, 21:09
#24
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


polar воспринимает углы не в градусах, а в радианах.
Если нужен угол 60 градусов, следует подставлять (* 60 (/ Pi 180)).

Последний раз редактировалось Li6-D, 14.11.2010 в 21:18.
Li6-D вне форума  
 
Непрочитано 14.11.2010, 21:20
#25
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Кривая Серпинского:
Код:
[Выделить все]

;; SIERPINS.LSP для XLISP версии 2.1
;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;; Программа построения кривых Серпинского i-го порядка.
;;
;; ЗАПУСК:  > (SierpinskiCurve 4)
;;
;; Замечание: Переменная *VMode* управляет установкой видео режима,
;;            и по умолчанию установлена в значение 18.
;;            Эта установка соответствует режиму 640x480 Color,
;;            и работает на большинстве систем. В случае проблемы
;;            с установкой этого режима необходимо выбрать
;;            значение этой переменной в соответствии с документацией
;;            на оборудование.
;;

;( defvar *VMode* 18 )       ;Видео режим по умолчанию
;( defvar *MaxX* 640 )       ;Максимальная ширина экрана по умолчанию
;( defvar *MaxY* 480 )       ;Максимальная высота экрана по умолчанию
;( defvar *SquareSize* 256 ) ;Размер области для построения

;;
;; Функция инициализирует графический режим, устанавливает переменные
;; *MaxX* *MaxY* *SquareSize* в соответствии с выбранным режимом
;;
(defun InitGraph()
   (
     case *VMode*
       ( 4                        ;320x200 Color
       ( mode 4 )
       ( setq *MaxX* 320 *MaxY* 200 *SquareSize* 128 ) )
       ( 16                       ;640x350 Color
       ( mode 16 )
       ( setq *MaxX* 640 *MaxY* 350 *SquareSize* 128 ) )
       ( 18                       ;640x480 Color
       ( mode 18 ) )
       ( 106                      ;800x600 Color
       ( mode 106 106 800 600 )
       ( setq *MaxX* 800 *MaxY* 600 *SquareSize* 512 ) )
       ( t ( error Unsupported graphics mode:  *VMode* ) )
    )
)

;;
;; Функция реализует задержку на заданное время
;;
(
 defun pause ( time )
  (princ)
   ;( let ( ( fintime ( + ( * time internal-time-units-per-second )
   ;                      ( get-internal-run-time ) ) ) )
   ;( loop ( when ( > ( get-internal-run-time) fintime )
   ;                  ( return-from pause ) ) ) )
)

;;
;; Функция целочисленного деления
;;
(defun div (a b / )(fix( / a b )))
(div 5 3)

;;
;; Функция рисования прямой:
;; Параметры:  - направление рисования (0-7)
;;             - длинна прямой
;;
(defun Line(Direction Size)
   (setq x Px y Py )
  (cond
    ((= 0 Direction)(setq x(+ x Size)))
    ((= 1 Direction)(setq x(+ x Size )y(- y Size)))
    ((= 2 Direction)(setq y(- y Size)))
    ((= 3 Direction)(setq x(- x Size)y(- y Size )))
    ((= 4 Direction)(setq x(- x Size)))
    ((= 5 Direction)(setq x(- x Size )y(+ y Size)))
    ((= 6 Direction)(setq y(+ y Size)))
    ((= 7 Direction)(setq x(+ x Size )y(+ y Size)))
  )
  ;(vla-addLine
  ;  *objSpc*
  ;  (vlax-3d-point (list px py 0))
  ;  (vlax-3d-point (list x y 0))
  ;)
  (entmake (list (cons 0 "LINE") (cons 10 (list px py)) (cons 11 (list x y))))
  (setq Px x Py y ) 
)


;;
;; Функции A, B, C, D - рекурсивные функции рисования
;;
(defun A ( k )
   ( cond ( ( > k 0 )
           ( A ( - k 1 ) )  ( Line 1 h )
           ( B ( - k 1 ) )  ( Line 0 ( * 2 h ) )
           ( D ( - k 1 ) )  ( Line 7 h )
           ( A ( - k 1 ) )
   ) )
)

(defun B ( k )
   ( cond ( ( > k 0 )
           ( B ( - k 1 ) )  ( Line 3 h )
           ( C ( - k 1 ) )  ( Line 2 ( * 2 h ) )
           ( A ( - k 1 ) )  ( Line 1 h )
           ( B ( - k 1 ) )
   ) )
)

(defun C ( k )
   (cond ( ( > k 0 )
           ( C ( - k 1 ) )  ( Line 5 h )
           ( D ( - k 1 ) )  ( Line 4 ( * 2 h ) )
           ( B ( - k 1 ) )  ( Line 3 h )
           ( C ( - k 1 ) )
   ) )
)

(
 defun D ( k )
   ( cond ( ( > k 0 )
           ( D ( - k 1 ) )  ( Line 7 h )
           ( A ( - k 1 ) )  ( Line 6 ( * 2 h ) )
           ( C ( - k 1 ) )  ( Line 5 h )
           ( D ( - k 1 ) )
   ) )
)


(defun SierpinskiCurve ( Count )
    ;( setq *objSpc*
    ;       (vla-get-Block
    ;         (vla-get-ActiveLayout
    ;           (vla-get-ActiveDocument
    ;             (vlax-get-acad-object)
    ;           )
    ;         )
    ;       )
    ;)
   ;( InitGraph ) ;Установка графического режима
    ( setq *SquareSize* 512)
    ( setq *MaxX* 800)
    ( setq *MaxY* 600)
    ( setq h ( div *SquareSize* 4 ) )     ;Вычисление длины линии
   
    ( setq x0 ( div *MaxX* 2 ) )           ;Вычисление начальной точки
    ( setq y0 ( div *MaxY* 2 ) )
    ( setq i 1)                    ;для рисования

   (while (<= i Count)                                     ;Основной цикл
                            ;Инициализация счетчика

          ;Условие завершения

          ( setq x0 ( - x0 h ) )          ;Вычисление координат начальной
          ( setq h ( div h 2 ) )          ;точки для рисования и
          ( setq y0 ( + y0 h ) )          ;единичной длины линии

          ( setq Px x0 Py y0 )            ;Установка пера

          (setvar "cecolor" (itoa i))                     ;Установка цвета для рисования

          ( A i ) ( Line 1 h )            ;Рисование
          ( B i ) ( Line 3 h )
          ( C i ) ( Line 5 h )
          ( D i ) ( Line 7 h )

          ;( pause 1.0 )                   ;Задержка
          (setq i (1+ i))             ;Инкримент счетчика

   )                                      ;Конец основного цикла
)
Из какого то реферата...
gomer вне форума  
 
Непрочитано 14.11.2010, 21:22
#26
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


См. тему Фракталы в Autolisp
gomer вне форума  
 
Непрочитано 14.11.2010, 23:35
#27
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Темы объединены. Seregarival, считай это предупреждением.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.11.2010, 06:48
#28
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Кулик Алексей aka kpblc, извините, просто эту тему закрыли вроде, я не мог оставлять в ней сообщения, поэтому открыл новую.
Цитата:
Если нужен угол 60 градусов, следует подставлять (* 60 (/ Pi 180)).
Спасибо, понял почему в никуда уходит.
А насчет кода из реферата, мне необходимо без графического режима её нарисовать, стандартными средствами AutoCAD, поэтому он не сильно подходит.
Seregarival вне форума  
 
Непрочитано 15.11.2010, 08:16
#29
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


А ты запусти, попробуй А не нужное удали и представь на суд общественности... И еще при аргументе больше 6 кад наглухо подвиснет, так что будь осторожен
gomer вне форума  
 
Автор темы   Непрочитано 15.11.2010, 12:44
#30
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Насчет подвисаний: я вчера увидел как виснет КАД после того как в прошлом фрактале поставил 90000 итераций, он рисовал 90000 окружностей радиуса 0.1
Смотрится прикольно, плохо только что он на каждой итерации отрисовывает все, то есть на заднем плане остаются результаты прошлых шагов построения, без них бы мне подошло, а убрать их у меня что-то не получается, придется самому ваять, хотя пока незнаю как это лучше организовать.

Код:
[Выделить все]
(Defun Frac()
  (Setq Z1 '(100 100) Z2 (POLAR Z1 (* 60 (/ Pi 180)) 20))
  (Setq Z3 (POLAR Z2 (* 0 (/ Pi 180)) 20) Z4 (POLAR Z3 (* -60 (/ Pi 180)) 20) )
  (Setq Z5 (POLAR Z4 (* 0 (/ Pi 180)) 20) Z6 (POLAR Z5 (* 60 (/ Pi 180)) 20) )
  (Setq Z7 (POLAR Z6 (* 120 (/ Pi 180)) 20) Z8 (POLAR Z7 (* 0 (/ Pi 180)) -20) )
  (Setq Z9 (POLAR Z8 (* -60 (/ Pi 180)) -20) Z10 (POLAR Z9 (* 60 (/ Pi 180)) 20) )
  (Setq Z11 (POLAR Z10 (* 0 (/ Pi 180)) 20) Z12 (POLAR Z11 (* 60 (/ Pi 180)) 20) )
  (Setq Z13 (POLAR Z12 (* -60 (/ Pi 180)) -20) Z14 (POLAR Z13 (* 60 (/ Pi 180)) 20) )
  (Command "_LINE" Z1 Z2 Z3 Z4 Z5 Z6 Z7 Z8 Z9 Z10 Z11 Z12 Z13 Z14 "")
  ;(Command "Обратить"     ???       )

 )
Нашел в справочнике функцию "Обратить", написано, что её аргументом должна быть фигура, которую стоит зеркально отобразить, но как это указать не написано. Подскажите, пожалуйста, что записать в аргумент?
И если не сложно подскажите немного по поводу блоков, а-то в методичке поверхностно очень описано как создать блок и потом вставить его под определенным углом...

Последний раз редактировалось Seregarival, 15.11.2010 в 13:21.
Seregarival вне форума  
 
Непрочитано 15.11.2010, 13:58
#31
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Ну засунь все внутрь блока, который потом и вставляй. Правда, отрисовывать придется программно
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 15.11.2010, 15:35
#32
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Извините, пожалуйста, перерыл всю методичку, но так и не нашел как работать с блоками. Они упоминаются только в примерах программ и сразу идет вставка блока с относительными координатами и объектной привязкой... а как создать блок даже в интернете не могу найти.
Подскажите пожалуйста хотя бы саму функцию.
Seregarival вне форума  
 
Непрочитано 15.11.2010, 15:48
#33
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Код:
[Выделить все]
(defun test (/ blk_ref blk_def)
  ;; Создаем описание анонимного блока
  (setq blk_def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                         (vlax-3d-point '(0. 0. 0.))
                         "*U"
                         ) ;_ end of vla-add
        ) ;_ end of setq
  ;; ТЕперь добавляем в него отрезок с координатами '(-10. -10. 0.) '(10. 10. 0.)
  (vla-addline blk_def (vlax-3d-point '(-10. -10. 0.)) (vlax-3d-point '(10. 10. 0.)))
  ;; И окружность с центром в точке '(20. 10. -5.) и радиусом 16.
  (vla-addcircle blk_def (vlax-3d-point '(20. 10. -5.)) 16.)
  ;; Вставляем блок в пространство модели, в точку '(100. 100. 0.)
  (setq blk_ref (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                                 (vlax-3d-point '(100. 100. 0.))
                                 (vla-get-name blk_def)
                                 1.
                                 1.
                                 1.
                                 0.
                                 ) ;_ end of vla-InsertBlock
        ) ;_ end of setq
  ;; Разбиваем вхождение блока
  (vla-explode blk_ref)
  ;; Удаляем вхождение
  (vla-erase blk_ref)
  ;; И очищаем файл
  (vla-delete blk_def)
  (princ)
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 15.11.2010, 16:46
#34
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


Спасибо, только вот он ошибку выдает:
; ошибка: no function definition: VLAX-GET-ACAD-OBJECT

И еще вопрос - всё это для 3d объекта, соответственно, если объект двумерный, то в названиях функций, наверное, поменяется только цифра и станет, например, vlax-2d-point?
Seregarival вне форума  
 
Непрочитано 15.11.2010, 16:51
#35
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


http://autolisp.ru/2010/06/09/no-fun...t-acad-object/
Цитата:
если объект двумерный, то в названиях функций, наверное, поменяется только цифра и станет, например, vlax-2d-point
Не станет. Штатной функции vlax-2d-point не существует.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.11.2010, 17:33
#36
Seregarival


 
Регистрация: 13.11.2010
Сообщений: 15


А можно вернуться к вопросу, заданному ниже:
Цитата:
Нашел в справочнике функцию "Обратить", написано, что её аргументом должна быть фигура, которую стоит зеркально отобразить, но как это указать не написано. Подскажите, пожалуйста, что записать в аргумент?
Пытался еще цвет у линии поменять на белый(надо чтобы фрагмент был не виден), но оказалось, что на светлом фоне белый цвет становится черным, а это печально. Можно ли обойти эту систему защиты?

Последний раз редактировалось Seregarival, 15.11.2010 в 18:11.
Seregarival вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Фракталы в AutoLISP

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача данных из AutoLisp в Excel Victorovich LISP 2 03.12.2011 22:28
Реализация алгоритма шифрования AES средствами AutoLisp gomer LISP 20 09.09.2010 11:55
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Как выделить примитивы в AutoLISP? RastaMANNN LISP 3 10.06.2008 00:37
Как из Delphi запустить программу на AutoLISP Valery LISP 1 23.09.2005 20:51