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

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

алгоритм трансформации множества точек

Ответ
Поиск в этой теме
Непрочитано 13.04.2011, 18:16 #1
алгоритм трансформации множества точек
baaba
 
архитектор
 
Москва
Регистрация: 07.07.2007
Сообщений: 664

Мне нужно трансформировать множество точек (множество пар координат в двухмерной системе координат), как показано на картинке. Это похоже на действие "align" или на вставку блока с поворотом и различными масштабными коэффициентами, по X и по Y (и ещё наклон), с заданием трёх пар координат и их значений после трансформации.
Задаём три точки из множества и их координаты после трансформации, на выходе получаем координаты всех точек после трансформации.
Подскажите, в какую сторону рыть? Как это называется? Я знаю простое преобразование координат, как например здесь: http://a-geometry.narod.ru/theory/theory_07.htm, просто перемещение и наклон, а тут добавляется растяжение и наклон. Заранее благодарю за ответы!

Миниатюры
Нажмите на изображение для увеличения
Название: Untitled-5.jpg
Просмотров: 134
Размер:	11.6 Кб
ID:	57552  

Просмотров: 9593
 
Непрочитано 13.04.2011, 18:55
#2
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


рыть нужно в этом направлении
http://www.google.ru/search?source=i...80%D0%B0%D0%BD
но рыть придется долго, тебе на каком языке нужно?
Sleekka вне форума  
 
Непрочитано 13.04.2011, 18:56
#3
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Из рисунка совершенно неясен алгоритм этой трансформации. Есть какая-то формула?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 14.04.2011, 13:14
#4
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


>Есть какая-то формула?
нужна как раз формула, или алгоритм
baaba вне форума  
 
Непрочитано 14.04.2011, 13:30
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


baaba, объясни как можно придумать формулу или алгоритм если у тебя на рисунке точки совершенно хаотично переходят в другие. Вот когда определишься (хотя-бы на словах) как одна точка переходит в другую, тогда и поговорим. А пока это выглядит так "Хочу то не знаю что".
Александр Ривилис вне форума  
 
Непрочитано 14.04.2011, 13:43
#6
zamtmn

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


В общем случае задача не решается, вот похожая теа:
http://forum.dwg.ru/showthread.php?t=63148
решилась за счет наличия перспективных искажений, копать нужно в томже направлении
zamtmn вне форума  
 
Непрочитано 14.04.2011, 14:40
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Ищи алгоритм афинного преобразования. Применяется для множества точек, когда может быть одновременно и перемещение, и поворот (причем разные для различных точек).

Такие преобразования выполняются в геоинформационных системах. Можно вообще из разных систем координат, в т.ч. не прямоугольных.

При афинных преобразованиях задается некоторое количество (небольшое) точек с исходными координатами и, для них же - новые координаты. А трансформированы в результате могут быть координаты сотен тысяч точек. Естественно, при этом будет какая-то погрешность, допустимость которой надо знать.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.04.2011, 15:10
#8
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
baaba, объясни как можно придумать формулу или алгоритм если у тебя на рисунке точки совершенно хаотично переходят в другие. Вот когда определишься (хотя-бы на словах) как одна точка переходит в другую, тогда и поговорим. А пока это выглядит так "Хочу то не знаю что".
Группа точек имеет координаты:
A(1,1)
B(2,5)
C(5,3).
И четвёртая точка D - (4,4). После трансформации группы получаем новые значения:
A(8.2,3.7)
B(8.7,7.1)
C(11.4,6.9)
Вопрос: каково значение D? Ответ: (10.4,7.6), получен опытным путём (см вложения), значения округлены до одной десятой. Характер трансформации задаётся тремя точками для всего множества точек. Если задавать двумя точками то не будет наклона и разных коэффициентов сжатия, будет просто перенос и поворот группы точек. На рисунке я показал оси координат, что бы было яснее.

ShaggyDoc, спасибо за наводку! Буду разбираться.
Миниатюры
Нажмите на изображение для увеличения
Название: Untitled-8.jpg
Просмотров: 88
Размер:	19.6 Кб
ID:	57622  
Вложения
Тип файла: zip transform2.zip (7.5 Кб, 63 просмотров)
baaba вне форума  
 
Непрочитано 20.04.2011, 15:59
#9
Сергей Дубина


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ищи алгоритм афинного преобразования. Применяется для множества точек, когда может быть одновременно и перемещение, и поворот (причем разные для различных точек).
Зачем стрелять из пушки по воробъям?
По схеме поста 8, совершенно очевидно, что преобразование аффинное (одно для всех точек).
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 20.04.2011, 17:57
#10
ННВ


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ищи алгоритм афинного преобразования.
Может, аффинного преобразования?
ННВ вне форума  
 
Непрочитано 21.04.2011, 09:59
#11
Сергей Дубина


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


Цитата:
Сообщение от ННВ Посмотреть сообщение
Может, аффинного преобразования?
Было-бы намного интереснее если ShaggyDoc объяснил почему метод Transform не поддерживает разные масштабы и наклон. Казалось, бы перемножай себе матрицу трансформирования на координаты....
Мне мотивация автодеска не понятна.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 21.04.2011, 10:58
#12
Елпанов Евгений

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


Цитата:
Сообщение от Сергей Дубина Посмотреть сообщение
Было-бы намного интереснее если ShaggyDoc объяснил почему метод Transform не поддерживает разные масштабы и наклон. Казалось, бы перемножай себе матрицу трансформирования на координаты....
Мне мотивация автодеска не понятна.
Как это не поддерживает?
Этот метод все поддерживает, что можно впихнуть в матрицу, т.е сдвиг, масштабирование по любой оси или сразу по нескольким, поворот в 3д. Причем, никто не мешает брать последовательность матриц и вычислять результирующую.

ps. именно матрицы, мне помогли делать вычисления луча, после многократного отражения от различных поверхностей в пространстве.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 21.04.2011, 11:07
#13
Сергей Дубина


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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Этот метод все поддерживает, что можно впихнуть в матрицу, т.е сдвиг, масштабирование по любой оси или сразу по нескольким, поворот в 3д. Причем, никто не мешает брать последовательность матриц и вычислять результирующую.
Тобою лично проверено?
Если отыщу своего "пациента" диагноз сможешь поставить?
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 21.04.2011, 11:09
#14
Елпанов Евгений

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


Цитата:
Сообщение от Сергей Дубина Посмотреть сообщение
Тобою лично проверено?
да!
вот пример, в нем идет вращение вершин вычисляемых квадратов:

Код:
[Выделить все]
 (defun c:eea-gr (/ A LST N P S X Y)
                ;|
*****************************************************************************************

by ElpanovEvgeniy

Программа для демонстрации использования матриц, совместно с динамической отрисовкой
на экране. 

Дата создания      02.04.2005
последняя редакция 01.10.2006


The program for demonstration use matrixes,
together with dynamic drawing on the screen area.

Date of creation 02.04.2005
Last edition     01.10.2006

(c:eea-gr1)
*****************************************************************************************
|;
 (setq lst '((0. 0.) (0. 1.) (1. 1.) (1. 0.))
       p   (trans (getvar "VIEWCTR") 1 3)
       x   (car p)
       y   (cadr p)
 ) ;_  setq
 (while (= (car (setq p (grread nil 5))) 5)
  (setq p (trans (cadr p) 1 3)
        p (list (- (car p) x) (- (cadr p) y))
        a 0.
        s (/ (getvar "viewsize") 10.)
  ) ;_  setq
  (if (> (abs (car p)) (abs (cadr p)))
   (setq p (list (if (minusp (car p))
                  -1.
                  1.
                 ) ;_  if
                 (if (zerop (car p))
                  0.
                  (/ (cadr p) (abs (car p)))
                 ) ;_  if
           ) ;_  list
   ) ;_  setq
   (setq p (list (if (zerop (cadr p))
                  0.
                  (/ (car p) (abs (cadr p)))
                 ) ;_  if
                 (if (minusp (cadr p))
                  -1.
                  1.
                 ) ;_  if
           ) ;_  list
   ) ;_  setq
  ) ;_  if
  (redraw)
  (grvecs
   (apply
    (function append)
    (cons
     (list 3 '(0 0) p)
     (mapcar
      (function (lambda (l)
                 (apply (function append)
                        (mapcar (function (lambda (x x1) (list 1 x x1)))
                                l
                                (cons (last l) l)
                        ) ;_  mapcar
                 ) ;_  apply
                ) ;_  lambda
      ) ;_  function
      (mapcar (function
               (lambda (n)
                (setq n (list (+ (* (car n) (car p)) (* (cadr n) (cadr p)))
                              (+ (* (car n) (cadr p)) (* (cadr n) (- (car p))))
                        ) ;_  list
                ) ;_  setq
                (mapcar (function (lambda (x1) (mapcar (function +) x1 n))) lst)
               ) ;_  lambda
              ) ;_  function
              '((-2 -2) (-1 -2) (0 -2) (1 -2) (2 -2)
                (-2 -1) (-1 -1) (0 -1) (1 -1) (2 -1)
                (-2  0) (-1  0) (0  0) (1  0) (2  0)
                (-2  1) (-1  1) (0  1) (1  1) (2  1)
                (-2  2) (-1  2) (0  2) (1  2) (2  2)
               )
      ) ;_  mapcar
     ) ;_  mapcar
    ) ;_  cons
   ) ;_  apply
   (list (list (* (cos a) s)
               (* (- (sin a)) s)
               0.
               (- (+ x x) (* x (cos a)) (* y (- (sin a))))
         ) ;_  list
         (list (* (sin a) s)
               (* (cos a) s)
               0.
               (- (+ y y) (* x (sin a)) (* y (cos a)))
         ) ;_  list
         (list 0. 0. s 0.)
         '(0. 0. 0. 1.)
   ) ;_  list
  ) ;_  grvecs
 ) ;_  while
 (redraw)
) ;_  defun
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 21.04.2011 в 11:16.
Елпанов Евгений вне форума  
 
Непрочитано 21.04.2011, 11:26
#15
Сергей Дубина


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


Этот пример не демонстрирует:
Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
сдвиг, масштабирование по любой оси или сразу по нескольким
это всего лишь поворот и равномасштабирование.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 21.04.2011, 11:36
#16
Елпанов Евгений

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


Цитата:
Сообщение от Сергей Дубина Посмотреть сообщение
Этот пример не демонстрирует:

это всего лишь поворот и равномасштабирование.
я сейчас в отпуске и далеко от автокада, мне сложно сейчас накидать тебе пример...
Но если не веришь, создай по отдельности три матрицы - масштабирование, сдвиг и поворот, а потом перемножь их, если не получится - давай код в студию, тебе обязательно подскажут, где ошибка...

ps. вижу твою настойчивость, хочу уточнить, что именно у тебя не работает в автокаде с матрицами? Может я чего то не понял. По сути, автодеск сам использует этот метод для всех преобразований между различными пространствами, например между пространством блока и пространством модели. А блок может иметь масштаб разный по осям, повернутый в пространстве и не лежащий в точке начала координат, да еще в нем могут быть другие блоки итд...

pps. Еще разок посмотрел код, в действительности в коде идет вращение, равное масштабирование по всем осям и сдвиг от начала координат в указанную точку! Посмотри переменные X и Y передают смещение по осям. Если тебе необходимо неравное масштабирование, то в матрицу передается переменная S с масштабом, т.е ты можешь в каждую строку матрицы передать разный масштабный коэффициент...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 21.04.2011 в 11:43.
Елпанов Евгений вне форума  
 
Непрочитано 21.04.2011, 12:04
#17
Сергей Дубина


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


1. В лиспе я ноль, поэтому твой код могу понять лишь весьма поверхностно.
2. Мой код на вба. На работе его я не нашел.
Любая комбинация поворотов, перемещений и равного масштабирования работает. Стоит изменить отношение масштабов или сдвига (не перемещения!) акад ругается... и я это дело забросил.
Мне такое редко нужно. Сейчас делаю так: акад -> ыксель -> акад , гемор,сам понимаешь, еще тот...
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 21.04.2011, 12:21
#18
Елпанов Евгений

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


Сергей Дубина, В моем коде, все трансформации сразу прописаны в одну матрицу, поэтому она не очень наглядна. Попробуй сделать на вба три матрицы и перемножить их, а потом уже применить. Обязательно проверь, что получится после перемножения - может у тебя в этом месте ошибка.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 21.04.2011, 12:39
#19
Сергей Дубина


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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Обязательно проверь, что получится после перемножения - может у тебя в этом месте ошибка.
Из математики очевидно что операции с матрицей трансформации при любых коэффициентах (кроме переполнения, а это не тот случай т.к. коэффициенты были достаточно малыми) не должны приводить к ошибке, если последняя строка в ней равна (0 0 0 1).
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 25.04.2011, 09:18 Почему Transform не работает избирательно?
#20
Сергей Дубина


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


Задан квадрат:
1,1
1,2
2,2
2,1

Матрица трансформации
(как видите "криминала" в ней нет)
5 3 0 0
1 2 0 0
0 0 1 0
0 0 0 1

Результат должен быть таким:
(разномасштабирование+поворот+сдвиг)
3,5
4,7
6,10
5,8
Графически это продемонстрировано во вложении.
функция Transform из AutoCAD в таких случаях возвращает ошибку.

Проверьте может у кого Transform нормально пашет?
Вложения
Тип файла: dwg
DWG 2007
Пример.dwg (72.4 Кб, 1417 просмотров)
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > алгоритм трансформации множества точек



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт координат точек из файла съемки тахеометра Trimble M3 в AutoCAD Red Nova Программирование 33 17.05.2011 16:46
Объединение множества точек 666 AutoCAD 7 12.03.2010 02:16
Алгоритм сортировки точек _Andre_ Программирование 6 08.06.2006 12:39
Нужна помощь! Полилиния с равными интервалами опорных точек. pffafer AutoCAD 8 14.03.2005 21:24