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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как при помощи лиспа нарисовать цепочку окружностей вдоль воображаемой линии

Как при помощи лиспа нарисовать цепочку окружностей вдоль воображаемой линии

Ответ
Поиск в этой теме
Непрочитано 17.03.2010, 12:35 #1
Как при помощи лиспа нарисовать цепочку окружностей вдоль воображаемой линии
Serge_BN
 
инженер
 
Оренбург
Регистрация: 18.04.2007
Сообщений: 71

Помогите, плз.
Задача следующая. Требуется указать начальную точку, конечную точку и на воображаемой линии между этими точками построить ряд окружностей с заданным диаметром, и заданным шагом так что бы центры окружностей лежали на одной прямой.
Я не силен в лиспе, но сделал следующую заготовочку
Код:
[Выделить все]
(defun c:sb-dot-plot (/)
  (ru-off-osnap)
  (setq pt0 (getpoint "start point: "))
  (setq pt1 (getpoint pt0 "end point: "))
  (setq dx (- (car pt0) (car pt1)))
  (setq dy (- (cadr pt0) (cadr pt1)))
  (setq line_len (sqrt (+ (* dx dx) (* dy dy))))
  (setq step 2.5
        i    0
  )
  (setq num (/ line_len step))
  (while (< i num)
    (entmake (list
               '(0 . "CIRCLE")
               '(8 . "label")
               '(62 . 1)
               (cons 10 pt0)
               '(40 . 1.0)
             )
    )
  )
  (ru-on-osnap)
)
(defun ru-off-osnap ()
  (setq *RU_OLD_OSNAP* (getvar "OSMODE"))
  (setvar "OSMODE" 0)
)
(defun ru-on-osnap ()
  (if *RU_OLD_OSNAP*
    (setvar "OSMODE" *RU_OLD_OSNAP*)
  )
)
Далее я понимаю, что надо вычислить расстояние между начальной и конечной точками. А далее надо как-то вычислять координаты и формировать как-то список для entmake.
И все это в цикле столько раз сколько будет если длину линии разделить на длину шага между центрами соседних окружностей, который задан заранее ( например, 2.5). И вот тут я что-то не соображу как это сделать.
Вот собственно и вся задача.

Последний раз редактировалось Serge_BN, 17.03.2010 в 13:07.
Просмотров: 4632
 
Непрочитано 17.03.2010, 13:19
#2
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Код:
[Выделить все]
(defun c:sb-dot-plot (/	       precision	 pt0	  pt1
		      message  line_len	angl	 step	  radius
		      number   count	line	 circle
		     )
  (ru-off-osnap)
  (vl-catch-all-apply
    (function
      (lambda ()
	(setq
	  precision (getvar "LUPREC")
	  pt0	    (getpoint "\nStart point: ")
	  pt1	    (getpoint pt0 "\nEnd point: ")
	)
	(entmake
	  (list
	    '(0 . "LINE")
	    '(62 . 5)
	    (cons 10 pt0)
	    (cons 11 pt1)
	  )
	)
	(setq line		 (entlast)
	      radius_sb_dot_plot (if
				   radius_sb_dot_plot
				    radius_sb_dot_plot
				    1.0
				 )
	      message		 (strcat "\nRadius <"
					 (rtos radius_sb_dot_plot 2 precision)
					 ">: "
				 )
	      radius		 (getdist pt0 message)
	      radius_sb_dot_plot (if
				   radius
				    radius
				    radius_sb_dot_plot
				 )

	)
	(entmake
	  (list
	    '(0 . "CIRCLE")
	    '(62 . 5)
	    (cons 10 pt0)
	    (cons 40 radius_sb_dot_plot)
	  )
	)
	(setq
	  circle	   (entlast)
	  step_sb_dot_plot (if
			     step_sb_dot_plot
			      step_sb_dot_plot
			      2.5
			   )
	  message	   (strcat "\nStep <"
				   (rtos step_sb_dot_plot 2 precision)
				   ">: "
			   )
	  step		   (getdist pt0 message)
	  step_sb_dot_plot (if
			     step
			      step
			      step_sb_dot_plot
			   )
	  line_len	   (distance pt0 pt1)
	  angl		   (angle pt0 pt1)
	  number	   (/ line_len step_sb_dot_plot)
	  count		   (1+(fix number))
	  i		   0
	)
	(repeat	count
	  (setq
	    increment (* step_sb_dot_plot i)
	    pt2	      (polar pt0 angl increment)
	    i	      (1+ i)
	  )
	  (entmake
	    (list
	      '(0 . "CIRCLE")
	      '(8 . "label")
	      '(62 . 1)
	      (cons 10 pt2)
	      (cons 40 radius_sb_dot_plot)
	    )
	  )
	)
      )
    )
  )
  (if line
    (entdel line)
  )
  (if circle
    (entdel circle)
  )
  (ru-on-osnap)
)

(defun ru-off-osnap ()
  (setq *RU_OLD_OSNAP* (getvar "OSMODE"))
  (setvar "OSMODE" 0)
)
(defun ru-on-osnap ()
  (if *RU_OLD_OSNAP*
    (setvar "OSMODE" *RU_OLD_OSNAP*)
  )
)
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 17.03.2010 в 19:54.
Disney вне форума  
 
Непрочитано 17.03.2010, 23:29
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


В традициях лиспа это будет выглядеть примерно так:
Код:
[Выделить все]
(defun msv (pt1 pt2 step len)
(if (> (distance pt1 pt2) len)
    (cons (polar pt1 (angle pt1 pt2) len) (msv pt1 pt2 step (+ len step)))
    nil)
  );end of defun - создает список точек

(defun c:mcircle( / pt1 pt2 step r)
(setq 	pt1  (getpoint "\npt1 ")
	pt2  (getpoint pt1 "\npt2 ")
	step (getdist "\nStep")
	r    (getdist "\nRadius ") 
);end of setq - запрашивает данные
(mapcar '(lambda (pt) (entmakex (list (cons 0 "circle") (cons 10 pt) (cons 40 r))))
(cons pt2 (cons pt1 (msv pt1 pt2 step step))))
  );end of defun - ставит круги по созданным точкам
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.03.2010, 10:21
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


А обязательно лиспом? Есть ведь команда _measure, как раз для разметки отрезков, и не только, "с заданным шагом". Создать блок из "окружности заданного диаметра", и всЁ получится
kp+ вне форума  
 
Непрочитано 18.03.2010, 11:32
#5
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


[IMG]http://i068.***********/1003/ce/d15ee24e04cd.gif[/IMG]
, я не ставил перед собой цель решить наиболее оптимальным методом(способом) с применением списков и рекурсий,
[IMG]http://s43.***********/i102/1003/11/2688a4226afe.gif[/IMG]
, а наоборот т.к. Serge_BN, попытался написать код сам, значит ему это интересно, вот я для него максимально по простому и расписал, чтоб он заинтересовался Lispом и в свободное время не на mail в бильярд играл, а программировал чего-нибудь, конечно рекурсии и списки это круто, но всему своё время.
[IMG]http://s49.***********/i124/1003/5c/eb30d4f249a9.gif[/IMG]
, я бы не назвал оптимальным, если не программно то
[IMG]http://s57.***********/i156/1003/f7/9102670a34fb.gif[/IMG]
, конечно если речь идёт о прямолинейных отрезках
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 18.03.2010 в 11:39.
Disney вне форума  
 
Непрочитано 18.03.2010, 11:43
#6
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,826
<phrase 1=


Цитата:
Сообщение от Disney Посмотреть сообщение
я бы не назвал оптимальным,
а собсно почему?
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 18.03.2010, 12:18
#7
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от zenon Посмотреть сообщение
а собсно почему?
Как я уже оговорился ранее рассматриваем задачу с прямолинейным участком:
  1. _measure не вставляет блок в начале и конце размечаемого отрезка
  2. _measure не запоминает шаг предыдущего размачивания
  3. _measure размечает только блоками или точками
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 18.03.2010 в 12:25.
Disney вне форума  
 
Непрочитано 18.03.2010, 20:09
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


То Disney - я б не сказал что писать по "лисповски" это очень оптимально - как минимум с точки зрения производительности - это весьма спорно, но "правильно" написанная программа на лиспе хороша т.н. расширяемостью и склонностью к всевозможным поправкам - добавлениям, что зачастую гораздо привлекательней производительности.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.03.2010, 20:32
#9
Serge_BN

инженер
 
Регистрация: 18.04.2007
Оренбург
Сообщений: 71


Дима, спасибо. Ты сделал то что мне надо было. И кроме того я кое-что понял как надо мыслить по лисповски.
С++ это совершенно другой язык и соответственно другой стиль мышления. А твой лисп я приспособил и для других полезных (для меня) вещей. В этом и гибкость лиспа, а с отдельной командой этого не сделаешь.
Disney, тоже спасибо. Но более короткий код оказалось понять проще.
Serge_BN вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как при помощи лиспа нарисовать цепочку окружностей вдоль воображаемой линии

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41
Как сгладить 2 линии. Или как сгладить только часть линии. Димас AutoCAD 3 14.03.2006 08:28
Как нарисовать вертикальные линии в мультилинии Snow AutoCAD 1 26.09.2003 12:43