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

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

Фракталы в AutoLISP

Ответ
Поиск в этой теме
Непрочитано 13.11.2010, 13:19 #1
Фракталы в 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))
Почему такая конструкция не работает?
Помогите, пожалуйста!
Просмотров: 9459
 
Непрочитано 13.11.2010, 13:25
#2
gomer

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


Генератор случайных чисел:
Код:
[Выделить все]
(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)
  )
)
gomer вне форума  
 
Автор темы   Непрочитано 13.11.2010, 13:31
#3
Seregarival


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


Спасибо, насколько я понял, этот генератор будет работать и в 2010 версии?
Подскажите пожалуйста как им правильно пользоваться и можно ли сделать, чтобы числа были от 0 до заданного, например до 6 или 200?
Seregarival вне форума  
 
Непрочитано 13.11.2010, 13:40
#4
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
"Генерирует псевдослучайное число от 0.0000000 до 0.9999999"
, следовательно что бы получить диапазон от нуля до нужного числа, то результат функции надо на это число умножить, по идее?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.11.2010, 13:48
#5
gomer

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


и пофиксить
gomer вне форума  
 
Непрочитано 13.11.2010, 14:00
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Посмотри еще здесь
Fractals
Attractors
Iterated Function Systems
Fractal Tree
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.11.2010, 14:46
#7
Seregarival


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


Код:
[Выделить все]
(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 '((Rng) (Rng))
  (Command "_Line" A B C D E F A "")
  (Command "_Line" A O "")


(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 вне форума  
 
Непрочитано 13.11.2010, 15:04
#8
gomer

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


Естественно, скобки нужно закрывать!!!
и еще:
Код:
[Выделить все]
(setq O (mapcar '(lambda (x)(fix(* x 200)))(list (Rng) (Rng))))
gomer вне форума  
 
Автор темы   Непрочитано 14.11.2010, 08:44
#9
Seregarival


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


Код:
[Выделить все]
(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))
  (Command "_Line" A B C D E F A "")
  ;далее внутри него нарисуем произвольную точку
  (setq O (mapcar '(lambda (x)(fix(* x 200)))(list (Rng) (Rng))))
  ;Организуем цикл для построения множества точек
  (REPEAT 100
  (
  	;выберем произвольную вершину
  	(Setq R (mapcar '(lambda (x)(fix(* x 6)))(Rng)))
  	(if (> R 0)
  		(Setq T A))
  	(if (> R 1)
  		(Setq T B))
  	(if (> R 2)
  		(Setq T C))
  	(if (> R 3)
  		(Setq T D))
  	(if (> R 4)
  		(Setq T E))
  	(if (> R 5)
        	(Setq T F))
  	;поставим точку на середине отрезка между выбранной точкой и произвольной вершиной
  	(SetQ P
  		(POLAR T
  			(ANGLE T O)
  			(/ (DISTANCE T O) 2)
  		)
  	)
  	;теперь в качестве новой точки выбрана точка P
  	;будем искать точку между данной и случайной вершиной
  	(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)
  )
)
Радует, что программа приобретает какие-то очертания... Но:
Выдает ошибку: неверный тип аргумента: 2D/3D точка: T
Скорее всего я неправильно присваиваю ей значение, но кучу всего перепробовал, что-то не выходит нормально... Помогите, пожалуйста.
Seregarival вне форума  
 
Непрочитано 14.11.2010, 10:57
#10
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Seregarival Посмотреть сообщение
Выдает ошибку: неверный тип аргумента: 2D/3D точка: T
Скорее всего я неправильно присваиваю ей значение, но кучу всего перепробовал, что-то не выходит нормально... Помогите, пожалуйста.
Нельзя в качестве имени переменной использовать символ T - это зарезервированный символ логических операций (T - true; nil - false)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 14.11.2010, 11:52
#11
gomer

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


Точки принято обозначать как pt0 (базовая), pt1, pt2, pt3...
Цитата:
(Setq R (mapcar '(lambda (x)(fix(* x 6)))(Rng)))
Код:
[Выделить все]
(setq R (1+ (fix (* 6 (Rng)))))
Так правильно! сторона 1, 2, 3..6

Последний раз редактировалось gomer, 14.11.2010 в 12:05.
gomer вне форума  
 
Автор темы   Непрочитано 14.11.2010, 12:57
#12
Seregarival


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


Исправил название точки и сделал как написано: (setq R (1+ (fix (* 6 (Rng))))), но все равно ошибка, только теперь чуть-чуть другая:
; ошибка: неверный тип аргумента: 2D/3D точка: nil
Сама по себе конструкция (Setq Ptt C) должна работать? То есть точка Ptt примет координаты '(200 250) ?
Seregarival вне форума  
 
Непрочитано 14.11.2010, 13:04
#13
gomer

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


Где новый код?
И вообще... команда vlide и отладка в IDE, там есть все средства для этого
gomer вне форума  
 
Автор темы   Непрочитано 14.11.2010, 13:21
#14
Seregarival


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


Код:
[Выделить все]
(DEFUN F()
  ;для начала нарисуем шестиугольник
  (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 100
  (
  	;выберем произвольную вершину
  	(setq R (1+ (fix (* 6 (Rng)))))
  	(if (> R 0)
  		(Setq Ptt A))
  	(if (> R 1)
  		(Setq Ptt B))
  	(if (> R 2)
  		(Setq Ptt C))
  	(if (> R 3)
  		(Setq Ptt D))
  	(if (> R 4)
  		(Setq Ptt E))
  	(if (> R 5)
        	(Setq Ptt F))
  	;поставим точку на середине отрезка между выбранной точкой и произвольной вершиной
  	(SetQ P
  		(POLAR Ptt
  			(ANGLE Ptt O)
  			(/ (DISTANCE Ptt O) 2)
  		)
  	)
  	;теперь в качестве новой точки выбрана точка P
  	;будем искать точку между данной и случайной вершиной
  	(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)
  )
)
Цитата:
И вообще... команда vlide и отладка в IDE, там есть все средства для этого
А можно об этом чуть подробнее?
Seregarival вне форума  
 
Непрочитано 14.11.2010, 13:49
#15
gomer

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


попробуй так
Код:
[Выделить все]
  (repeat 100
	;выберем произвольную вершину
	(setq
	  R (fix (* 5 (Rng)))
	  Ptt (nth R (list A B C D E F))
	  P ; поставим точку на середине отрезка между выбранной точкой и произвольной вершиной
	  (polar
		Ptt
		(angle ptt o)
		(/ (distance ptt o) 2)
	  )
	)
	;теперь в качестве новой точки выбрана точка P
	;будем искать точку между данной и случайной вершиной
	(setq O P)
  )
зы подробнее... описано в справке
gomer вне форума  
 
Автор темы   Непрочитано 14.11.2010, 14:02
#16
Seregarival


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


gomer, спасибо большое, произвольные числа вроде заработали, но отрисовки точек все равно нет, значение одной вычисленной точки он выводит в командной строке и успокаивается, добавил строку, чтобы проверить сколько точек он ищет и выяснил, что находит только первую точку, цикл не работает:

Код:
[Выделить все]
(repeat 100
	;выберем произвольную вершину
	(setq
	  R (fix (* 5 (Rng)))
	  Ptt (nth R (list A B C D E F))
	  P ; поставим точку на середине отрезка между выбранной точкой и произвольной вершиной
	  (polar
		Ptt
		(angle ptt O)
		(/ (distance ptt O) 2)
	  )
	)
	;теперь в качестве новой точки выбрана точка P
	;будем искать точку между данной и случайной вершиной
	(Command "_Line" Ptt Ptt ""); отрисовывает только одну точку
	(setq O P)
  )
Извиняюсь за стиль вывода точки, но раз не работает polar, то хоть так..
Seregarival вне форума  
 
Непрочитано 14.11.2010, 14:34
#17
gomer

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


(Command "_Line" Ptt Ptt "") рисует отрезок вырожденный в "точку" Начало и конец его совпадают... Таких "отрезков" у тебя должно быть 100 штук
И, кстати, срочно поменяй название функции, а то далеко не уедешь...
gomer вне форума  
 
Автор темы   Непрочитано 14.11.2010, 15:41
#18
Seregarival


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


Поменял название и пошло дело! Но...
Блин, AutoCAD2007 запускает эту прогу, выполняет, точки появляются, но теперь начал горланить что-то про сетевые лицензии, хотя сам нигде не предлагал зарегестрировать продукт, и в настройках когда пытаюсь обновить ошибка вылезает.
В AutoCAD2010 точки не появляются... Буду разбираться с этим.
Но все же пару раз он успел запуститься в 2007, Странно(а может и не очень), но почему то рандомные вершины почти всегда выбираются 2, 3 или 4, рандом не рандомный...

В точке (50.0000, 150.0000, 0.0000) создана линия нулевой длины -пишет AutoCAD2010 и нет точки на экране! Они оказывается и работают по-разному...

Последний раз редактировалось Seregarival, 14.11.2010 в 15:52.
Seregarival вне форума  
 
Непрочитано 14.11.2010, 17:29
#19
Li6-D


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


Для шестиугольника Серпинского текущая точка P должна находиться
на отрезке, соединяющего случайную вершину шестиугольника Ptt и предыдущую точку O.
При этом расстояние между вершиной и текущей точкой - 1/3 длины отрезка.
Если будет середина отрезка, то красивой фигуры не получится! Середина - это для треугольника Серпинского.
То есть надо исправить: (polar Ptt (angle Ptt O) (/ (DISTANCE Ptt O) 23)).
Чтобы из алгоритма не выпала 6-ая вершина F надо исправить: (fix (* 56 (Rng)).
Начальную точку внутри шестиугольника и число точек фрактала можно задать через getpoint и getint.
Точки фрактала можно нарисовать окружностями радиуса 0.1, а не отрезками нулевой длины.
Чтобы была видна начальная точка ее лучше нарисовать с помощью point и если она не выделяется
среди точек фрактала - изменить формат отображения точек.

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

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


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Чтобы из алгоритма не выпала 6-ая вершина F надо исправить: (fix (* 56 (Rng)).
Хм, точно...
Вообще, шестиугольник Серпинского как фрактал строится рекурсивно и мне непонятно зачем здесь rng и где собственно рекурсия

Последний раз редактировалось gomer, 14.11.2010 в 18:04.
gomer вне форума  
 
Непрочитано 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,411


Темы объединены. 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,411


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