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

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

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

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

Здравствуйте! Очень нужна помощь с написанием программы на AutoLISP. Условие: квадрантное представление окружности. То есть, пользователь должен выбрать окружность, которая будет представлена в виде квадратиков с точностью (количеством квадратиков), которую введет пользователь. Алгоритм выполнения представляю почти досконально, проблема только с реализацией этого на AutoLISP, который до этого не использовал. Буду очень благодарен, если кто согласится помочь.
Просмотров: 8747
 
Непрочитано 30.11.2011, 22:08
#2
Кулик Алексей aka kpblc
Moderator

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


А можно рисунок глянуть? Чего-то я ничего не понял...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2011, 00:05
#3
v1talka


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


если кто-то возьмется, могу подробнее всё объяснить. заранее спасибо.

- нужно что-то типа этого, только в 2d

Последний раз редактировалось v1talka, 01.12.2011 в 00:32.
v1talka вне форума  
 
Непрочитано 01.12.2011, 00:31
#4
Дима_

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


Ну скажем так если не объяснишь - то точно никто не возьмется.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 01.12.2011, 00:38
#5
v1talka


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Ну скажем так если не объяснишь - то точно никто не возьмется.
я понимаю. пытаюсь объяснить. Октантное или воксельное представление есть, оно используется для 3d моделей, а мне нужно квадрантное, т.е. то же самое, но для 2d окружности.
v1talka вне форума  
 
Непрочитано 01.12.2011, 00:44
#6
Кулик Алексей aka kpblc
Moderator

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


Картинку приложи к посту. Подробности - в справке по форуму.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2011, 00:49
#7
v1talka


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Картинку приложи к посту. Подробности - в справке по форуму.
приложил ко второму посту, спасибо
v1talka вне форума  
 
Непрочитано 01.12.2011, 01:30
#8
Дима_

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


Если не размер, а именно количество квадратиков - то выкладывай свой "доскональный" алгоритм (описание алгоритма) - т.к. простой мне в голову не приходит (вижу вариант только примерно "прикидывать" размер и методом льва в африке проврять подошел или нет) хотя сегодня я уже конечно никакой писать не буду, если там только нет какой-нибудь хитрости с учетом что это именно круг - типа распределить вначеле центры - а размер сам понятен станет, вобщем завтра посмотрю (а может и напишу).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 01.12.2011, 22:28
#9
v1talka


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


в ЛС скинул Вам про октантное дерево информацию, она аналогична тому, что нужно мне.
В общем, есть чертеж, в котором есть окружность. Пользователь должен выбрать любую окружность, для неё я нахожу координаты центра (x,y) и радиус. это потребуется для построения первого описанного вокруг окружности квадрата. затем нужно, чтобы пользователь ввел число квадратов, на которые ему нужно будет еще разделить этот квадрат (точность). т.е. это будет число 1, 4, 9, 16, 25 и т.д. вот до этого момента код я написал. дальше сложнее. я бы делал так: цикл, в котором каждый раз проверяется пересекается ли квадрат окружностью. для первого прохода цикла это не так сложно - проверить всего пересекается ли описанный вокруг окружности квадрат с окружностью. если да, то разделить его на n частей. n будет зависеть от требуемой точности. дальше этот цикл будет проходить до тех пор, пока квадратов не станет n. т.е. делиться на части будут только те квадраты, которые пересекаются с окружностью.
Пример: пользователь ввел число 256. сначала описывается квадрат вокруг окружности, потом он проверяется пересекается ли он с окружностью. ответ - да - делим на 4 части, затем проверка пересекаются ли эти 4 квадрата с окружностью, ответ - да - делим каждый из них еще на 4 и т.д. Когда количество квадратов = n - удаляем квадраты, которые находятся за пределами круга. Приложил картинки для наглядности:
[IMG]http://s002.***********/i199/1112/8f/ae2011d5a76a.png[/IMG][IMG]http://s43.***********/i101/1112/12/974962eb20b3.png[/IMG][IMG]http://i014.***********/1112/ad/d1b8a97032a2.png[/IMG][IMG]http://s017.***********/i424/1112/eb/ee45fb3cc589.png[/IMG][IMG]http://s16.***********/i191/1112/bd/f218cf54f654.png[/IMG][IMG]http://s44.***********/i105/1112/70/4ceb13ef04ae.png[/IMG][IMG]http://s017.***********/i432/1112/26/db40b309d9dd.png[/IMG][IMG]http://s017.***********/i431/1112/d6/ebf38384ffd2.png[/IMG][IMG]http://s017.***********/i418/1112/85/d24fa68086cf.png[/IMG]

Последний раз редактировалось v1talka, 01.12.2011 в 22:39.
v1talka вне форума  
 
Непрочитано 01.12.2011, 22:49
#10
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Описаный выше алгоритм - это модификация алгоритма разбиения пространства, им не достичь ограничения на N квадратов в разбиении
Цитата:
дальше этот цикл будет проходить до тех пор, пока квадратов не станет n
Это будет не цикл, а рекурсия. Каждая итерация может добавлять больше одного квадрата, когда вы достигните ограничения N, у вас в стеке рекурсии останутся вообще не разбитые и "недобитые" квадраты. Такчто ограничение N - не верное. нужно ограничивать размер квадрата и глубину рекурсии.
Цитата:
т.е. это будет число 1, 4, 9, 16, 25
Зачем? разбивать всегда на 4 (или на 2, но тогда нужно смотреть по горизонтали или вертикали буть текущий квадрат\прямоугольник) результат всеравно будет аналогичный.

Ну а так как ровно N квадратов таким алгоритмом всеравно не получить, лучше воспользоваться алгоритмом растеризации окружности Брезенхема, пощитав размер квадрата для примерного получения N, либо запросив от пользователя этот размер.
zamtmn вне форума  
 
Автор темы   Непрочитано 01.12.2011, 23:01
#11
v1talka


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Ну а так как ровно N квадратов таким алгоритмом всеравно не получить, лучше воспользоваться алгоритмом растеризации окружности Брезенхема, пощитав размер квадрата для примерного получения N, либо запросив от пользователя этот размер.
не обязательно N, нужно просто как-то дать возможность пользователю ввести требуемую точность.
v1talka вне форума  
 
Непрочитано 01.12.2011, 23:46
#12
Дима_

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


То что ты описываешь расходиться само с собой - тебе нужно задать из скольки квадратов сделать приближение к окружности - описанный алгоритм этого не делает, если количество не так важно - его можно в пять раз короче написать - определись уж что нужно чтобы "абы как лишь бы быстро" или "в соответствии с требованиями" (а еще лучше напиши для чего оно тебе - быть может "тут вобще все по другому" ).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 02.12.2011, 00:26
#13
v1talka


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
То что ты описываешь расходиться само с собой - тебе нужно задать из скольки квадратов сделать приближение к окружности - описанный алгоритм этого не делает, если количество не так важно - его можно в пять раз короче написать - определись уж что нужно чтобы "абы как лишь бы быстро" или "в соответствии с требованиями" (а еще лучше напиши для чего оно тебе - быть может "тут вобще все по другому" ).
оно мне для сдачи лабораторной в универе. требование было - квадрантное представление круга. как пример дали посмотреть октантное представление 3d моделей. всё, кроме этого, мои мысли по этой задаче
v1talka вне форума  
 
Непрочитано 02.12.2011, 00:37
#14
Дима_

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


Так с какого Вы решили что задавать надо именно количеством квадратов??
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 02.12.2011, 01:45
#15
v1talka


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Так с какого Вы решили что задавать надо именно количеством квадратов??
просто предположил, что так будет проще. возможно, это не лучший вариант, не спорю
v1talka вне форума  
 
Непрочитано 02.12.2011, 01:46
#16
_REGEN


 
Регистрация: 14.12.2010
Там, где мамонты жили ...
Сообщений: 224


Цитата:
Сообщение от v1talka Посмотреть сообщение
пользователь должен выбрать окружность, которая будет представлена в виде квадратиков с точностью (количеством квадратиков)
Цитата:
Сообщение от v1talka Посмотреть сообщение
требование было - квадрантное представление круга
Так в виде квадратов или квадраНтов?
__________________
Время – лучшее лекарство, лечит даже от жизни.
_REGEN вне форума  
 
Автор темы   Непрочитано 02.12.2011, 01:52
#17
v1talka


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


Цитата:
Сообщение от _REGEN Посмотреть сообщение
Так в виде квадратов или квадраНтов?
видимо, квадрантов...
v1talka вне форума  
 
Непрочитано 02.12.2011, 03:42
#18
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Толковый словарь русского языка под редакцией Т. Ф. Ефремовой

КВАДРАНТ
квадрант [квадрант] м. 1) Сектор с центральным углом в 90 градусов; четвертая часть круга. 2) Старинный угломерный астрономический инструмент для измерения высоты небесных светил над горизонтом и угловых расстояний между светилами. 3) Прибор для измерения углов при вертикальной наводке артиллерийских орудий.
Profan вне форума  
 
Непрочитано 02.12.2011, 09:59
#19
Дима_

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


Цитата:
Сообщение от v1talka Посмотреть сообщение
видимо, квадрантов...
Я плачу - ты сходи в универ что-ли узнай чего нужно-то.
Offtop: А вобще по таким студентам "сапоги" плачут.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.12.2011, 22:00
#20
Li6-D


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


Формализую задачу насколько понял.
Пользователь указывает на чертеже круг и задает натуральное число, которое определяет сетку
(т.е. на сколько частей ею делится вертикальный и горизонтальный радиусы круга).
Алгоритм должен найти координаты покрывающих окружность (не круг) элементарных квадратов сетки,
например, координаты их правого нижнего угла.

Теперь направляющие косинусы решения:
1) Пусть один такой квадрат найден (в качестве первого квадрата можно принять правую квадрантную точку окружности).
Определяем, через какую сторону или вершину выходит из квадрата окружность (допустим против часовой стрелки).
Думаю, это самая сложная часть алгоритма.
2) В зависимости от направления выхода вычисляем координаты следующего квадрата - это координаты предыдущего квадрата, измененные на шаг сетки (по +x, +y или +x&+y - итого 8 вариантов).
Вычисляем квадраты по цепочке до тех пор, пока не наткнемся на первый квадрат последовательности.

Последний раз редактировалось Li6-D, 02.12.2011 в 22:14.
Li6-D вне форума  
 
Автор темы   Непрочитано 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