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

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

Квадрантное представление окружности на AutoLISP

Ответ
Поиск в этой теме
Непрочитано 30.11.2011, 21:48
Квадрантное представление окружности на AutoLISP
v1talka
 
Регистрация: 30.11.2011
Сообщений: 17

Здравствуйте! Очень нужна помощь с написанием программы на AutoLISP. Условие: квадрантное представление окружности. То есть, пользователь должен выбрать окружность, которая будет представлена в виде квадратиков с точностью (количеством квадратиков), которую введет пользователь. Алгоритм выполнения представляю почти досконально, проблема только с реализацией этого на AutoLISP, который до этого не использовал. Буду очень благодарен, если кто согласится помочь.
Просмотров: 8741
 
Автор темы   Непрочитано 03.12.2011, 02:50
#21
v1talka


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


спасибо. отлично. проблема только в реализации по-прежнему
v1talka вне форума  
 
Непрочитано 03.12.2011, 15:09
#22
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от v1talka Посмотреть сообщение
спасибо. отлично. проблема только в реализации по-прежнему
Наконец, появилось осмысленное описание задачи.
На мой взгляд, если не очень важно сколько именно будет квадратиков, нужно только примерное ограничение, то можно идти со стороны размера квадрата...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 03.12.2011, 16:12
#23
gomer

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


если алгоритм есть пиши блок-схему, выкладывай... код написать - 5 минут делов
gomer вне форума  
 
Непрочитано 03.12.2011, 22:56
#24
Дима_

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


Я если честно так и не понял, что нужно заполнить круг "квадратиками" или прорисовать их по контуру (что автору уже не важно как задавать, размером, "примерным" количеством - с этим вроде разобрались).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.12.2011, 14:40
#25
v1talka


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я если честно так и не понял, что нужно заполнить круг "квадратиками" или прорисовать их по контуру
по алгоритму построения октантного дерева - нужно заполнить, но там по-другому это происходит. не важно в общем по контуру или заполнять
v1talka вне форума  
 
Непрочитано 04.12.2011, 18:08
#26
Li6-D


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


Простой и надежный квадратно-гнездовой способ:
Код:
[Выделить все]
 (defun c:test (/ c label-cell Li6-D r p d v dlim vp vd l n nn)
;Покрытие окружности ячейками квадратной сетки
  (prompt "Укажите круг: ")
  (or  (setq с (ssget "_:S" '((0 . "CIRCLE")))) (quit))
  (defun label-cell (sq f color)
    (cond 
      ((= f "квадрат")
        (grvecs (list color (car sq) (caddr sq) (caddr sq) (cadr sq)
                            (cadr sq) (cadddr sq) (cadddr sq) (car sq)))
      )
      ((= f "крест") (grvecs (cons color sq)))
  ) )
  (defun Li6-D (p / sq) ;c r v dlim label-cell - глобальные переменные
    (setq sq (mapcar '(lambda (a) (mapcar '+ a p)) v)
          p (vl-sort (mapcar '(lambda (a) (cons (distance a c) a)) sq)
             '(lambda (a b) (< (car a) (car b)))
    )       )
    (if (< (caar p) r (car (last p))) (label-cell sq "крест" 1) ;красные кресты
      (and
        (< r (caar p) dlim)
        (inters (cdar p) (cdadr p)
          (setq p (polar c (+ (angle (cdar p) (cdadr p)) (* 0.5 Pi)) r))
          (mapcar '(lambda (a b) (+ a a (- b))) c p)
        )
        (label-cell sq "квадрат" 2) ;желтые квадраты
  ) ) )
  (initget 33)
  (setq c (entget (ssname с 0))
        r (cdr (assoc 40 c))
        c (cdr (assoc 10 c))
        p (getpoint c "\nУкажите узел сетки: ")
  )
  (initget 33)
  (setq v (getpoint p "\nУкажите соседний узел сетки: ")
        d (distance p v)
        dlim (sqrt (+ (* r r) (* 0.25 d d)))
        v (mapcar '- v p)
        v (list
           '(0 0) (list (- (car v) (cadr v)) (+ (car v) (cadr v)))
            v (list (- (cadr v)) (car v))
  )       )
  (setq vp (mapcar '- p c) vd (caddr v))
  (repeat 2
    (setq l (/ (apply '+ (mapcar '* vp vd)) d)
          n (1+ (fix (/ (+ r l) d)))
          p (mapcar '(lambda (a b) (- a (* b n))) p vd)
          nn (cons (+ n (fix (/ (- r l) d)) 1) nn)
          vd (last v)
  ) )
  (repeat (cadr nn)
    (setq n p)
    (repeat (car nn) (Li6-D n) (setq n (mapcar '+ n vd)))
    (setq p (mapcar '+ p (caddr v)))
  )
  (princ)
)
А что если воспользоваться захватом объектов секущим квадратом: ssget "_F" ...?
Миниатюры
Нажмите на изображение для увеличения
Название: круг в сетке.jpg
Просмотров: 107
Размер:	126.6 Кб
ID:	70775  

Последний раз редактировалось Li6-D, 04.12.2011 в 21:11.
Li6-D вне форума  
 
Автор темы   Непрочитано 06.12.2011, 20:41
#27
v1talka


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


спасибо! похоже, но не совсем то, что нужно
v1talka вне форума  
 
Непрочитано 06.12.2011, 21:28
#28
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,285
Отправить сообщение для sbi с помощью Skype™


Цитата:
Сообщение от v1talka Посмотреть сообщение
спасибо! похоже, но не совсем то, что нужно
А что надо, можете объяснить?
__________________
С уважением sbi
sbi вне форума  
 
Автор темы   Непрочитано 06.12.2011, 21:37
#29
v1talka


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


Цитата:
Сообщение от sbi Посмотреть сообщение
А что надо, можете объяснить?
как мог пытался объяснить раньше в теме. скинул ссылки Вам в ЛС
v1talka вне форума  
 
Непрочитано 06.12.2011, 21:52
#30
Li6-D


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


Наконец-то понял вроде бы. Эта демострашка работает не только с окружностью, а с любыми объектами. Лишь бы они были видны на экране. Квадратики, в которые попали (не попали) кусочки объекта, рисуются временными векторами красного (желтого) цвета и исчезают при регенерации:
Код:
[Выделить все]
 (defun C:test (/ msq n sq pN sq0 CpN)
  (defun msq (sq p)
  ;;Функция msq для перемещения квадрата, задаваемого списком его вершин sq.
  ;;Второй аргумент p - точка, задающая вектор перемещения от точки '(0 0 0).
  ;;Функция возвращает список перемещенных точек sq.
    (mapcar '(lambda (a) (mapcar '+ a p)) sq)
  )
  ;Интерактивное изображение квадратной рамки поиска.
  ;Пользователь задает центр и середину стороны квадрата
  (vl-cmdf "_.POLYGON" "4" (getpoint "\nЦентр поиска: ") "_c" "\\")
  (initget 7)
  ;Задаваемое пользователем число покрывающих ячеек-квадратов делится на 2,
  ;при этом в алгоритме реально получается от 0.5*n до n ячеек (изредка - чуть больше n)
  (setq n (/ (getreal "\nНаибольшее число покрывающих ячеек: ") 2))
  ;Формирование списка вершин рамки поиска
  (foreach p (entget (setq sq (entlast)))
    (if (= (car p) 10) (setq pN (cons (cdr p) pN))))
  ;Удаление примитива рамки поиска
  (entdel sq)
  ;Формирование базового квадрата - исходный квадрат перемещается так,
  ;чтобы его первая точка ушла в '(0 0 0).
  ;Одновременно формируется начальный список точек pN.
  ;Каждая точка p этого списка соответствует квадрату с вершиной в p.
  ;Сначала в список вносится только одна точка - первая точка рамки поиска.
  (setq sq (msq pN (mapcar '- (car (setq pN (list (car pN)))))))
  (while (< (length pN) n) ;выход из цикла по превышению заданного числа квадратов
    ;Уменьшение базового квадрата в 2 раза
    (setq sq (mapcar '(lambda (p) (mapcar '(lambda (a) (/ a 2.)) p)) sq))
    (while pN ;перебор всех элементов списка pN пока он не кончится (см. ниже)
      ;Формирование квадрата из базового, перемещенного в текущую точку списка pN.
      ;В каждой из 4-х точек нового квадрата строится квадрату и с помощью функции
      ;выбора объектов ssget с опцией "_CP" (выбор секущим многоугольником) определяется
      ;есть ли в этих квадратах объекты чертежа. При наличии объектов начальная точка p
      ;квадрата добавляется в список CpN для формирования впоследствии нового списка pN.
      ;Кроме того, данный квадрат с помощью функции grdraw изображается временными
      ;векторами красного цвета
      (foreach p (msq sq (car pN))
        (if (apply 'ssget (list "_CP" (setq sq0 (msq sq p))))
          (setq CpN (cons p CpN))
          ;Изображение временными векторами желтого цвета пустых ячеек
          (foreach a (reverse sq0) (grdraw p (setq p a) 2))
      ) )
      (setq pN (cdr pN)) ;Удаление первого элемента из списка pN
    )
    (setq pN CpN CpN nil) ;Формирование нового списка pN и опустошение списка CpN
    ;Изображение временными векторами красного цвета непустых ячеек
    (foreach p pN (foreach a (reverse (msq sq p)) (grdraw p (setq p a) 1)))
    ;Вывод для пользователя текущих результатов (количество красных квадратов)
    (princ "\nТекущее число ячеек: ") (princ (length pN))
    (princ ". Нажмите любую клавишу для продолжения...") (grread)
  )
  (princ)
)

Последний раз редактировалось Li6-D, 10.12.2011 в 14:56.
Li6-D вне форума  
 
Автор темы   Непрочитано 06.12.2011, 22:11
#31
v1talka


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


спасибо большое. вроде почти то, что нужно. отображается правда только один квадратик + вроде больше 128 точность не выполняется. просто пропадает квадратик.
v1talka вне форума  
 
Непрочитано 06.12.2011, 22:26
#32
Li6-D


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


Цитата:
Сообщение от v1talka Посмотреть сообщение
спасибо большое. вроде почти то, что нужно. отображается правда только один квадратик + вроде больше 128 точность не выполняется. просто пропадает квадратик.
Сначала задай квадратную зону и введи ограничение на число красных квадратиков (я вводил до 25000). А дальше нарисуется до 4-х квадратов, любуешься и жмешь ввод, на следующем шаге появится до 16-ти и т.д. пока не будет превышен порог (иногда может нарисоваться чуть больше). Объектов на чертеж программа не добавляет. Если сдвинуться по экрану - квадратики пропадут и можно показать преподавателю новую демонстрацию

Последний раз редактировалось Li6-D, 06.12.2011 в 22:34.
Li6-D вне форума  
 
Автор темы   Непрочитано 07.12.2011, 00:50
#33
v1talka


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


так и делал сразу. в первый раз появлялся 1 квадрат, а не 4 и т.д.
v1talka вне форума  
 
Непрочитано 07.12.2011, 15:36
#34
Li6-D


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


В первый раз пользователь задает квадратную рамку поиска объектов, которая рисуется белым цветом, а впоследствии стирается. Затем этот квадрат делится на 4 равные части и проверяется в каких квадратах есть объекты. Если объекты найдены, то соответствующий квадрат изображается красным цветом. На первом шаге может получиться от 0 (в зоне поиска не было видимых объектов) до 4 красных квадратов. Затем каждый из красных квадратов делится еще на 4 части и снова проверяется наличие видимых объектов в этих более мелких квадратах. Не пустые квадраты изображаются красным цветом, а пустые исчезают. Должна получится картинка подобно этой (3055 красных квадратов):
Миниатюры
Нажмите на изображение для увеличения
Название: текст в сетке.jpg
Просмотров: 108
Размер:	149.7 Кб
ID:	70971  

Последний раз редактировалось Li6-D, 07.12.2011 в 15:50.
Li6-D вне форума  
 
Автор темы   Непрочитано 07.12.2011, 21:56
#35
v1talka


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


всё так и делал. в AutoCAD 2012 неправильно работало, в 2005 версии всё отлично. спасибо огромное за помощь
v1talka вне форума  
 
Автор темы   Непрочитано 08.12.2011, 23:31
#36
v1talka


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


Еще вопрос: может ли функция ssget или её аналог как-нибудь работать в невидимой области чертежа?
v1talka вне форума  
 
Непрочитано 11.01.2012, 16:25
#37
Nata1

Инженер
 
Регистрация: 10.11.2008
Владимирская обл., пос. Вольгинский
Сообщений: 147


Интересная программа. А можно сделать так, чтобы красные квадратики не исчезали при регенерации? Тогда можно было бы распечатать прямо из Автокада.
__________________
AutoCAD 2014
Nata1 вне форума  
 
Непрочитано 11.01.2012, 21:57
#38
Li6-D


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


Цитата:
Сообщение от Nata1 Посмотреть сообщение
Интересная программа. А можно сделать так, чтобы красные квадратики не исчезали при регенерации? Тогда можно было бы распечатать прямо из Автокада.
Вот попробуй, состряпал на скорую руку. Сетка рисуется единым блоком красных отрезков (не у всех может пойти). На нужном чертеже лучше не экспериментировать. В этом варианте ограничения на число квадратов нет, пользователь сам решает когда закончить.
Код:
[Выделить все]
 (defun C:test1 (/ msq p0 sq pN sq0 CpN)
  (defun msq (sq p) (mapcar '(lambda (a) (mapcar '+ a p)) sq))
  (vl-cmdf "_.POLYGON" "4" (setq p0 (getpoint "\nЦентр поиска: ")) "_c" "\\")
  (initget 7)
  (foreach p (entget (setq sq (entlast)))
    (if (= (car p) 10) (setq pN (cons (cdr p) pN))))
  (entdel sq)
  (setq sq (msq pN (mapcar '- (car (setq pN (list (car pN)))))))
  (while
    (progn
      (setq sq (mapcar '(lambda (p) (mapcar '(lambda (a) (/ a 2.)) p)) sq))
      (while pN
        (foreach p (msq sq (car pN))
          (if (apply 'ssget (list "_CP" (setq sq0 (msq sq p))))
            (setq CpN (cons p CpN))
            (foreach a (reverse sq0) (grdraw p (setq p a) 2))
        ) )
        (setq pN (cdr pN))
      )
      (setq pN CpN CpN nil)
      (foreach p pN (foreach a (reverse (msq sq p)) (grdraw p (setq p a) 1)))
      (princ "\nТекущее число ячеек: ") (princ (length pN))
      (initget "Yes No")
      (/= (getkword "\nПродолжить аппроксимацию объектов квадратами? [Yes/No] <Yes>: ") "No")
  ) )
  (initget "Yes No")
  (if (/= (getkword "\nСохранить в чертеже красную аппроксимирующую сетку? [Yes/No] <Yes>: ") "No")
    (progn
      (redraw)
      (entmake (list '(0 . "BLOCK") '(2 . "*Unnn") (setq p0 (cons 10 p0)) '(70 . 1)))
      (foreach p pN
        (foreach a (reverse (msq sq p))
          (entmake (list '(0 . "LINE") (cons 10 p) (cons 11 (setq p a)) '(62 . 1)))
      ) )
      (entmake (list '(0 . "INSERT") (cons 2 (entmake '((0 . "ENDBLK")))) p0))
  ) )
  (princ)
)
И напоминаю, что в связи с использованием ssget, процесс аппроксимации происходит только в видимой области и гаснет в невидимой

Последний раз редактировалось Li6-D, 11.01.2012 в 22:42.
Li6-D вне форума  
 
Непрочитано 12.01.2012, 09:12
#39
Nata1

Инженер
 
Регистрация: 10.11.2008
Владимирская обл., пос. Вольгинский
Сообщений: 147


Li6-D, спасибо! Попробовала в 2004 автокаде, все прекрасно работает!
__________________
AutoCAD 2014
Nata1 вне форума  
 
Непрочитано 29.02.2012, 14:25
#40
san3k


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


Li6-D, скажите пожалуйста,а можно ли сделать так,чтобы квадратики не исчезали при сдвиге картинки?? И ещё как удалить квадраты,не пренадлежащие фигуре?
san3k вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Квадрантное представление окружности на AutoLISP



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать чертежей autocad, окружности печатаются квадратитками? vbold AutoCAD 5 29.11.2011 16:10
Как определить координаты начала и конца отрезка, координаты центра окружности? voverrr Программирование 6 20.01.2011 20:10
Рисование окружности (фантом окружности) Малюк AutoCAD 6 01.02.2010 02:26
DwgRuLispLib: Геометрия. Пересечение прямой и окружности VVA Библиотека функций 1 07.12.2007 18:59
Окружности, касательные к прямой и другой окружности Хмурый AutoCAD 13 06.03.2007 10:16