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

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

порядок нумерации точек. помогите с алгоритмом

Ответ
Поиск в этой теме
Непрочитано 11.07.2011, 19:12 #1
порядок нумерации точек. помогите с алгоритмом
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

Помогите с алгоритмом, не обязательно код, хотя бы на словах.
Пишу нумератор, хотелось бы включить в него несколько наиболее востребованных алгоритмов обхода точек.
Наиболее распространенный алгоритм не получается, это слева направо и сверху вниз, как буквы в тексте.
Из тех что уже есть (как пример):
Код:
[Выделить все]
 ;;;аргументы:
;;;lp - список точек '((x y z)...(xn yn zn))
;;;pt0 - некая точка, от которой ведется отсчет (например, крайняя левая верхняя)или просто первая точка
;;;***
(defun test1 (lp pt0 / new_lp)
;;;По удаленности от исходной точки
  (vl-sort lp (FUNCTION (lambda (i1 i2) (< (distance pt0 i1) (distance pt0 i2)))))
)
;;;***
(defun test2 (lp pt0 / new_lp)
;;;   по близости к каждой последующей точке получается такая змейка
  (while lp
    (setq new_lp (cons pt0 new_lp)
	  lp	 (cdr (vl-sort lp (FUNCTION (lambda (i1 i2) (< (distance pt0 i1) (distance pt0 i2))))))
	  pt0 (car lp))
  )
  (reverse new_lp)
)
;;;***
(defun test3 (lp pt0 / pt00 new_lp)
;;;Нечно среднее между test1 и test2
  (setq	pt0  (car lp)
	pt00 pt0
  )
    (while lp
    (setq new_lp (cons pt0 new_lp)
	  lp	 (cdr (vl-sort lp
			       (FUNCTION (lambda (i1 i2)
					   (< (+ (distance pt00 i1) (distance pt0 i1))
					      (+ (distance pt00 i2) (distance pt0 i2))
					   )
					 )
			       )
		      )
		 )
	  pt0 (car lp))
  )
  (reverse new_lp)
)
;;;***
(defun test4 (lp /)
;;;  Сортировка по Y
  (vl-sort lp (function (lambda (i1 i2) (> (cadr i1) (cadr i2)))))
)
;;;***
(defun test5 (lp /)
;;;  Сортировка по X
  (vl-sort lp (function (lambda (i1 i2) (> (car i1) (car i2)))))
)
;;;***
(defun test6 (lp /)
;;;  Сортировка по X/Y
  (vl-sort lp (function (lambda (i1 i2) (> (/(car i1)(cadr i1)) (/(car i2)(cadr i2))))))
)
__________________
apel.fas
Просмотров: 6042
 
Непрочитано 11.07.2011, 20:33
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Привет
Код:
[Выделить все]
(setq ss (ssget '((0 . "text"))))
(setq ents (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq pt_list (mapcar '(lambda(x)(cons (cdr (assoc 10 (entget x)))(cdr (assoc 1 (entget x)))))ents))

(setq	pt_list	(vl-sort pt_list
			 '(lambda (a b)
			    (> (cadr (car a)) (cadr (car b))))
			 )
	)

  (setq	pt_list	(reverse (vl-sort pt_list
			 '(lambda (a b)
			    (cond
			      ((= (cadr (car a)) (cadr (car b)))
			       (> (car (car a)) (car (car b))))
			      (> (cadr (car a)) (cadr (car b)))))
			 )
	)
	)
Олег (jr.) вне форума  
 
Непрочитано 11.07.2011, 20:50
#3
Li6-D


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


Наверное нужен еще один аргумент - точность (tol) по координате y, в пределах которой точки списка lp, будут считаться находящимися на одной высоте.
Эти точки дальше можно отсортировать по x. Даже если точность задана, это не гарантирует однозначности. Все зависит способа выбора полосы высотой tol: можно начинать с точек с наименьшими координатами y, или наоборот с наибольшими. Способов выбора таких полос может быть бесконечно много. Поэтому результат будет отличаться.
Li6-D вне форума  
 
Непрочитано 11.07.2011, 21:30
#4
Елпанов Евгений

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


Довольно востребованный алгоритм - минимальный пробег для линии, соединяющей все точки.
Еще эта задача известна, как задача Коммивояжера.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 11.07.2011, 21:55
#5
zamtmn

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


Цитата:
Наверное нужен еще один аргумент - точность (tol) по координате y, в пределах которой точки списка lp, будут считаться находящимися на одной высоте.
Скорее не точность по Y, а расстояние между точками - чтоб у нумерации небыло большого разброса и рядом стоящие точки имели близкие номера
Цитата:
Довольно востребованный алгоритм - минимальный пробег для линии, соединяющей все точки.
Еще востребованней алгоритм станет при наличии трассы (трасс) по которым можно бегать соядиняя точки, а не просто по минимальному расстоянию
zamtmn вне форума  
 
Непрочитано 11.07.2011, 22:46
#6
Li6-D


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


Задача разбивки множества точек на горизонтальные полоски, несмотря на простоту формулировки, довольно сложна.
Я распознаю в ней задачу распознавания
Вот простейший случай 2-х точек: (setq lp '((0 0 0) (10 0.01 0))).
Если считать это одной полоской с двумя точками, то "естественная" нумерация справа налево и сверху вниз, сохранит порядок в lp.
А если это 2 полоски по 1-ой точке, то после сортировки получится так: ((10 0.01 0) (0 0 0)).
Даже для двух точек могут быть такие заморочки, а что будет для тысяч точек?

Последний раз редактировалось Li6-D, 11.07.2011 в 23:19.
Li6-D вне форума  
 
Непрочитано 11.07.2011, 23:00
#7
zamtmn

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


Цитата:
Задача разбивки множества точек на горизонтальные полоски, несмотря на простоту формулировки, довольно сложна.
Я бы решал двоичным разбиением пространства по y(игрик) до высоты полоски <= tol, если в качестве секущей прямой брать среднее арифметическое y(игрик) точек в полосе - получится разбиение хорошо отражающее пространственную структуру конкретного набора точек

Последний раз редактировалось zamtmn, 11.07.2011 в 23:14.
zamtmn вне форума  
 
Непрочитано 13.07.2011, 23:30
#8
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Нумерует первый атрибут блока в выбраном направлении.
Идея. Алгоритм всё равно не вспомню.
Вложения
Тип файла: rar nvec.rar (1.2 Кб, 58 просмотров)
Victor вне форума  
 
Непрочитано 14.07.2011, 09:55
#9
sbi


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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Довольно востребованный алгоритм - минимальный пробег для линии, соединяющей все точки.
Еще эта задача известна, как задача Коммивояжера.
И нерешаемая в общем случае без применения терии вероятности.
__________________
С уважением sbi
sbi вне форума  
 
Непрочитано 14.07.2011, 11:42
#10
Дима_

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


Цитата:
Сообщение от sbi Посмотреть сообщение
И нерешаемая в общем случае без применения терии вероятности.
Еще как решаемая - "бутафорсом" как минимум.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.07.2011, 12:25
#11
Елпанов Евгений

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


Цитата:
Сообщение от sbi Посмотреть сообщение
И нерешаемая в общем случае без применения терии вероятности.
Зачем же так...
Эта задача, относится к университетским, т.е ее любят задавать различные преподы во всем мире. Для решения придумано большое количество алгоритмов, позволяющих найти достаточно хорошее решение с заранее известной погрешностью относительно абсолютного решения.

ps. одно из моих решений, можно посмотреть на болоте...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 14.07.2011, 15:15
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
ps. одно из моих решений, можно посмотреть на болоте...
Присоединяюсь
5+
Олег (jr.) вне форума  
 
Непрочитано 14.07.2011, 15:41
#13
sbi


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


И нерешаемая в общем случае ( приближенно- да, но это из другой области,)Математикой только пахнет.
__________________
С уважением sbi
sbi вне форума  
 
Непрочитано 14.07.2011, 23:13
#14
Li6-D


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


Строгая сортировка точек в естественном порядке справа налево и сверху вниз, как нужно по теме.
Это просто квинтэссенция кода из сообщения №2 Олега (jr.)
Код:
[Выделить все]
(defun test7 (lp)
;;Сортировка по Y, а при равенстве Y - по X
  (vl-sort lp
   '(lambda (a b / dy)
      (if (zerop (setq dy (- (cadr b) (cadr a))))
        (> (car b) (car a))
        (minusp dy)
) ) ) )
Не строгая сортировка, допускающая возрастание на величину tol координаты Y точек в отсортированном списке, о чем я писал выше.
Код:
[Выделить все]
(defun test8 (lp tol / cluster y y+ lp1 lpN)
;;Нахождение в списке точек lp "полос" высотой tol,
;;внутри которых координата Y точек будет считаться постоянной.
;;Сортировка точек lp по координате Y "полос", затем по X.
  (defun cluster (METRICS LN tol / margLN i extri L margx extrLN)
  ;;Функция cluster для каждого элемента списка LN вычисляет с помощью выражения
  ;;METRICS число - "критерий". Затем функция ищет "скопления" - наибольшее количество 
  ;;элементов LN, разность между "критериями" которых не превышает величины tol.
  ;;Возвращается список, первый элемент которого - количество элементов в каждом "скоплении",
  ;;остальные - элементы списка LN, являющиеся началом "скоплений" (имеющие наименьший
  ;;"критерий" в своём "скоплении") и расположенные в порядке возрастания "критерия".
    (setq LN (mapcar 'cons (mapcar METRICS LN) LN)
          LN (vl-sort LN '(lambda (x y) (< (car x) (car y))))
          tol (abs tol)
          margLN LN
          i 0
          extri 0
    )
    (while margLN
      (setq L (car LN) LN (cdr LN) margx (+ (car L) tol) L (cdr L))
      (while (and (<= (caar margLN) margx) margLN) (setq i (1+ i) margLN (cdr margLN)))
      (cond 
        ((< i extri))
        ((> i extri) (setq extrLN (list L) extri i))
        ((setq extrLN (cons L extrLN)))
      )
      (setq i (1- i))
    )
    (cons extri (reverse extrLN))
  ) ;end cluster
  (while lp
    (setq y (cadadr (cluster 'cadr lp tol))
          y+ (+ y tol)
          lp (vl-remove-if '(lambda (p) (if (<= y (cadr p) y+) (setq lp1 (cons p lp1)))) lp)
          lpN (cons (cons y (vl-sort lp1 '(lambda (a b) (< (car a) (car b))))) lpN)
          lp1 nil
  ) )
  (apply 'append (mapcar 'cdr (vl-sort lpN '(lambda (a b) (> (car a) (car b))))))
)
Li6-D вне форума  
 
Непрочитано 15.07.2011, 16:32
#15
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Это просто квинтэссенция кода из сообщения №2 Олега (jr.)
Папрашу не выражацца!
Полиграфыч
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > порядок нумерации точек. помогите с алгоритмом



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите плиз с программкой по автоматической нумерации Diman111 Программирование 110 30.08.2021 07:18
Нарушен порядок нумерации узлов (СКАД) Satch SCAD 15 18.01.2017 23:08
Как исправить ошибки в Лире:нарушен порядок нумерации узлов... ganesh Лира / Лира-САПР 13 17.04.2012 07:00
Lisp, помогите с алгоритмом "подтягивания" поллиний 2123 LISP 1 03.02.2010 23:58
Помогите новичку определить порядок расчета. adisport Расчетные программы 4 28.11.2009 12:03