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

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

Тригонометрические функции и векторная алгебра

Ответ
Поиск в этой теме
Непрочитано 20.11.2009, 18:38
Тригонометрические функции и векторная алгебра
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Решил переделать тему и собрать тут все, необходимое для вычислений в пространстве модели Автокада.

Вычисление расстояния от точки до точки:
(distance <точка1> <точка2>)
Аргуметы в виде списков (X Y Z)
В книге Н. Н. Полещука "AutoLISP и Visual Lisp в среде AutoCAD" в этой функции опечатка.
Цитата:
... Если точки трехмерные, то функция рассчитывает угол между осью Х и проекцией вектора, идущего из первой точки во вторую точку, на текущую плоскость построений. ...
Весь этот текст следует просто зачеркнуть. Остальное правильно.

Получение координат точки, лежащей на середине расстояния по прямой, между двумя точками:

Получение координат точки лежащей от точки P1 на расстоянии L в направлении точки P2:

Получение единичного вектора по двум точкам:

Функция EULER-XY
Вычисление углов Эйлера, определяющих разворот ПСК относительно МСК.
по двум векторам направления осей X и Y ПСК.

Функция EULER-Z
Вычисление углов Эйлера, определяющих разворот ПСК относительно МСК.
по направлением оси Z ПСК.

Функция ORT
Вычисляет орт двумерного или трехмерного вектора из точки 0,0,0 в указанную точку

Функция VXV
Вычисляет векторное произведения векторов.
Возврат: список из трех координат результирующего вектора.

Функция VAV.
Определяет взаимное направление 2х векторов. (к сожалению, вектора задаются как направление
из точки 0,0,0 в указанную точку)
Возврат: число - угол между векторами в радианах [0 ; Pi].


Функция GET-UCS-MATRIX
Вычисляет матрицу прямого или обратного преобразования для использования в ActiveX методе TransformBy.
Аргументы.
Функция получает в качестве 1-го аргумента точку начала мысленной ПСК (ПСК не обязана реально существовать).
В качестве второго и третьего аргументов - векторы осей X и Y ПСК.


Получение векторов Z, -Z, X, -X, Y и -Y ПСК объекта по его нормали и углу поворота

Функция по получению точки вставки и трех векторов объекта

Скалярное произведение векторов, однако!

Вычисление точки, лежащей на прямой, пересекающей плоскость.

Функция вычисления угла между векторами (в градусах и от 0 до 180).

Последний раз редактировалось Supermax, 07.12.2009 в 18:22.
Просмотров: 42313
 
Непрочитано 24.11.2009, 18:57
#41
zamtmn

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


>>Изменение этого параметра никоим образом не должно изменять >>значение нормали объекта. Куда ось Z объекта была направлена,
>>туда и должна остаться быть направленной. А она рушиться.
>>И точка вставки блока порою улетает. Во!

Не факт, но я думаю:
Положение тела в 3D однозначно задоется 3мя базисными векторами, 0x,0y,0z (вернее сказать 2мя, т.к. третий всегда можно посчитать по 2 изза взаимоортогональности)
Угол - это угол между 0x фактической 0x расчитаной по arbitrary axis algorithm, когда ты меняешь нормаль - угол может поменяться, а ты ему присваиваешь старое значение - вот всё и летит.
Угол нужен только в 2д, там с ним всё понятно, в 3д - он только мешает, т.к. не матрица преобразования расчитывается по углу, а угол расчитывается из матрицы преобразований.
zamtmn вне форума  
 
Непрочитано 24.11.2009, 19:13
#42
Елпанов Евгений

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


На этом форуме, встречается мой код, для вставки блока с поворотом вокруг произвольной оси. Вставка выполняется с отслеживанием курсора, через grread. Создавая этот код я столкнулся с проблемой - при указании угла поворота в произвольной системе координат, угол отличается от подразумевавшегося. т.е. если блок находится в точке не лежащей на XY мировой и нормаль отличается от мировой, то указывая точку на экране не так просто вычислить действительный угол поворота в плоскости блока. Для этой цели, я переводил указанную точку в систему координат экрана, далее вычислял еще одну точку, в которой z была другой, но xy в экранной системе координат совпадали. Далее, находил точку пересечения плоскости блока с линией, заданной этими двумя точками. Угол в системе координат блока, относительно оси Х и вектором из точки вставки и найденной точкой и давали искомый угол.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 24.11.2009, 19:30
#43
zamtmn

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


А почему вообще есть только угол? совместимость со старыми версиями?
Мтекст сравнительно новый приметив - у него всё ок
Если на лиспе можно получить матрицу трансформации объекта, из нее легко можно выдрать базисные вектора
zamtmn вне форума  
 
Непрочитано 24.11.2009, 19:55
#44
Елпанов Евгений

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Если на лиспе можно получить матрицу трансформации объекта, из нее легко можно выдрать базисные вектора
матрица трансформации не хранится в объекте, а услужливо вычисляется при запросе.

хотя...
Контура подрезки xclip хранят в своих dxf кодах матрицы, причем сразу две матрицы 4х4, одна для подрезаемого объекта, вторая для самого контура подрезки.

ps. Конечно, матрицы хранятся не в самих объектах, а в словарях, как впрочем и контура...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 24.11.2009, 20:01
#45
zamtmn

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


>>матрица трансформации не хранится в объекте, а услужливо вычисляется при запросе.
ИМХО Это угол не хранится, а услужливо вычисляется (под объектом я подразумеваю не то что видно в лисп, а то что действительно лежит в закрамах автокада), без матриц в 3d графике шагу ни ступить.
zamtmn вне форума  
 
Автор темы   Непрочитано 24.11.2009, 20:31
#46
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


zamtmn,
Цитата:
Положение тела в 3D однозначно задоется 3мя базисными векторами, 0x,0y,0z (вернее сказать 2мя, т.к. третий всегда можно посчитать по 2 изза взаимоортогональности)
Или одним и углом поворота вокруг него, что собственно в Автокаде и присутствует.

Цитата:
Угол - это угол между 0x фактической 0x расчитаной по arbitrary axis algorithm, когда ты меняешь нормаль - угол может поменяться, а ты ему присваиваешь старое значение - вот всё и летит.
Не, ты о другом угле говоришь. В свойствах объектов типа MTEXT Rotation - это угол поворота вокруг нормали. Там вообще кроме вектора нормали, точки вставки и угла поворота вокруг нормали ничего нет. Хотя вру, в MTEXT есть еще вектор оси абсцисс.

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

Цитата:
И кто мне объяснит, почему в 3D полилинии свойства Normal нет, а в простой линии и в 2D полилинии есть? Какого фига ее туда запихнули? Если объект можно описать расположением точек в пространстве МСК, зачем ему нормаль?
Устарело. В 3D полилинии нет свойства Normal, зато 210 точечная пара есть!

Цитата:
Мтекст сравнительно новый приметив - у него всё ок
Ага, а почему на нем не работает acet-geom-textbox корректно?
И почему изменение свойства Rotation в объекте TEXT нормаль не меняет, а в MTEXT меняет?

Елпанов Евгений, о, как я тебя понимаю! Через экран? Это круто!

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

Вот не только MTEXT страдает глюком, блоки тоже не хотят крутится вокруг нормали, еще и труднопредсказуемым перемещением страдают.

Люди! Если вы, по случайности, залезли в свойство Rotation объектов Автокада, не забудьте после этого восстановить нормаль и точку вставки.

Последний раз редактировалось Supermax, 24.11.2009 в 20:52.
Supermax вне форума  
 
Непрочитано 24.11.2009, 20:57
#47
zamtmn

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


>>Или одним и углом поворота вокруг него, что собственно в Автокаде и присутствует.
Да елки палки, чтоб этот угол применить надо:
знать вокруг чего вращат - знаем (нормаль);
исходное состояние которое вращаем - его не знаем!
тут вся хитрость - исходное состояние это расчет оси 0x описаный а dxf справке. меняем нормаль - меняется эта расчетная 0х - соответственно угол если его не пересчитать становится пальцем в небо;

Почувствуй разницу между окружностью и блоком
окружность симетрична вокруг нормали - для описания хватает одной оси z
блок не симетричен, нужно 2(3) оси, во времена доса память экономили - придумали этот хитрый способ с осью и углом (экономия 40 байт на объект)
еще пример - допустим нормаль равна 1,0,0 - чему равна исходная ось x которую надо повернуть на извесный угол?

>>И кто мне объяснит, почему в 3D полилинии и в 2D полилинии свойства Normal нет, а в простой линии есть?
в 2d полилинии есть (у нее своя соординаиная система), в линии и 3д полилинии нет (они в wcs)

ИМХО:
при 3д повороте блока в автокаде (при черчении) блок трансформируется матрицей - одновременно меняются базисные оси, точка вставки, потом считается угол.
ты пытаешся воспроизвести это пошагово,
1. 3Д вращательные операции не комутативны - результат зависит от порядка применения
2. нет гарантий что на каждом шаге умный автокад не пересчитывает чтото за тебя - типа точки вставки при изменении нормали
отсюда "глюки"

Последний раз редактировалось zamtmn, 24.11.2009 в 21:17.
zamtmn вне форума  
 
Автор темы   Непрочитано 24.11.2009, 21:42
#48
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


zamtmn, опять не-е-е.
Цитата:
Да елки палки, чтоб этот угол применить надо:
знать вокруг чего вращат - знаем (нормаль);
исходное состояние которое вращаем - его не знаем!
тут вся хитрость - исходное состояние это расчет оси 0x описаный а dxf справке. меняем нормаль - меняется эта расчетная 0х - соответственно угол если его не пересчитать становится пальцем в небо;
А про точку вставки забыл? Положение объекта в Автокаде определено точкой вставки, нормалью и углом поворота вокруг нее. Это что касается сложных объектов, а простые - описанием точек объекта. Повернул - описание изменилось. Только в 2D полилинии и линии с нормалью перестарались, хотя можно узнать в какой плоскости объект был создан изначально.

Цитата:
при 3д повороте блока в автокаде (при черчении) блок трансформируется матрицей - одновременно меняются базисные оси, точка вставки, потом считается угол.
ты пытаешся воспроизвести это пошагово,
1. 3Д вращательные операции не комутативны - результат зависит от порядка применения
2. нет гарантий что на каждом шаге умный автокад не пересчитывает чтото за тебя - типа точки вставки при изменении нормали
отсюда "глюки"
Да ничего я пошагово не пытаюсь изменить. Мне доступны всего три свойства объекта, при помощи которых я могу изменить положение и ориентацию объекта. А в некоторых случаях и их нет. В какой последовательности их менять по всем законам математики не имеет значение, а на деле - имеет.

Маленькая функция на основе моей vektor-translate:
Возвращает точку вставки объекта и три его единичных вектора (X Y Z) (естественно в МСК).
Если точки вставки нет, то за точку вставки принимается (0.0 0.0 0.0)
Если угла нет, то при расчете угол равен 0.0
(может так станет всем понятно что мне надо)
Применение: (vectors-x-y-z (car (entsel)))
Код:
[Выделить все]
(vl-load-com)
(defun vectors-x-y-z (obj / a norm ugol inspoint listvect)
(setq norm (cdr (assoc 210 (entget obj))))
(if (vlax-property-available-p (vlax-ename->vla-object obj) 'Rotation)
(setq ugol (vla-get-Rotation (vlax-ename->vla-object obj))) (setq ugol 0.0))
(if (vlax-property-available-p (vlax-ename->vla-object obj) 'InsertionPoint)
(setq inspoint (vlax-safearray-list (vlax-variant-value (vla-get-InsertionPoint (vlax-ename->vla-object  obj)))))
(setq inspoint  '(0.0 0.0 0.0)))
(setq listvect (vektor-translate norm ugol))
(setq a (append (list  inspoint (caddr listvect) (car (cddddr listvect)) (car listvect))))
)

Последний раз редактировалось Supermax, 24.11.2009 в 21:54.
Supermax вне форума  
 
Непрочитано 24.11.2009, 22:03
#49
zamtmn

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


>>А про точку вставки забыл? Положение объекта в Автокаде определено точкой вставки, нормалью и углом поворота вокруг нее

Нет, не забыл. я имел ввиду поворотную ориентацию объекта.
еще пример неоднозначности нормали и угла и зависимость угла от нормали:
Втыкаем вилку в монитор - это будет нормаль
1 - поворачиваем вилку чтоб смотрела вертикально вверх, не вращая
2 - поворачиваем вилку чтоб смотрела влево , не вращая
3 - поворачиваем вилку в исходное положение (чтоб смотрела вперед) , не вращая
вилка в исходном положении, вращения вокруг вилки небыло, почему монитор набоку и вилка повернута?

edit:
вот еще цитата про X-axis dir из описания мтекста в OpenDWG R13/R14/R2000/R2004/R2007 File Format Specification
Цитата:
Apparently the text x-axis vector. (Why not just a rotation?) ACAD maintains it as a unit vector.
т.е. люди тоже не догнали зачем автодеск отступил в этом примитиве от своих традицый

Последний раз редактировалось zamtmn, 24.11.2009 в 22:30.
zamtmn вне форума  
 
Автор темы   Непрочитано 24.11.2009, 22:36
#50
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Э! Ты меня так просто не поймаешь! Ты его поворачиваешь сначала вокруг оси X МСК, затем вокруг оси Z МСК, а потом вокруг оси Y МСК, так чего ты хочешь? Ты на него сначала смотришь в фас, затем снизу, затем опять снизу, затем опять в фас, но с поворотом.

Если поворачивать монитор не от себя вертикально, а от себя влево под 45 градусов, то он должен (если нет поворота) стать на угол, а у тебя при прохождении 45 градусов, во время поворота влево он все время смотрит на тебя боком. Вот тут он у тебя и вращается!

Последний раз редактировалось Supermax, 24.11.2009 в 23:18.
Supermax вне форума  
 
Непрочитано 24.11.2009, 22:57
#51
zamtmn

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


в чем прикол? у меня всё ок, накопилась небольшая ошибка

-2.44921e-016 - погрешность, обычное дело
zamtmn вне форума  
 
Автор темы   Непрочитано 24.11.2009, 23:05
#52
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ага, за один поворот 2 миллиметра по оси Y
за еще один поворот на 360
(210 0.0 -4.89843e-016 1.0)
Возьми и построй линию из этих координат в точку 0,0,0
А по тексту не скажешь, что он повернут.

В этой паре вообще не должно быть цифр выходящих за диапазон от -1 до 1
Елпанов Евгений устанавливал большие значения, но говорит, что машина сама потом единичный вектор устанавливает. А тут по оси Z 1 мм а по оси Y аж 2 это поворот больше 45 градусов! А я что-то не наблюдаю этого в живье.

Последний раз редактировалось Supermax, 24.11.2009 в 23:11.
Supermax вне форума  
 
Непрочитано 24.11.2009, 23:08
#53
zamtmn

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


-2.44921e-016=-0.000000000000000244921
такое на глаз не увидишь, а в программах всегда надо эту погрешность учитывать при сравнении чисел с плавающей запятой. тут куча тем на эту тему была
zamtmn вне форума  
 
Автор темы   Непрочитано 24.11.2009, 23:17
#54
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А, пардон по е забыл!

Только что проверил. в 2007 каде функция entmod при замене 50 пары сбивает точку вставки у текста, а у мтекста не сбивает. И сбивает она потому, что список сформирован с нарушением порядка расположения точечных пар.
А про порядок расположения точечных пар в списках для функций entmod b entmakex вообще, нигде, ни гу гу.

Последний раз редактировалось Supermax, 25.11.2009 в 15:00.
Supermax вне форума  
 
Непрочитано 25.11.2009, 15:34
#55
zamtmn

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


Гляжу справку
TEXT:
10 First alignment point (in OCS)
DXF: X value; APP: 3D point
MTEXT:
10 Insertion point
DXF: X value; APP: 3D point

может в этом всё дело? хотя и там и там ocs былоб логичнее и в книжке и там и там ocs.
Ты че добиваешся? разные примитивы - разное поведенье. глюки надо у себя искать, а не у автокада))
zamtmn вне форума  
 
Автор темы   Непрочитано 25.11.2009, 17:25
#56
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


zamtmn, я ничего не добиваюсь, и если ты думаешь, что я днями напролет ползаю по объектам Автокада и ищу в нем глюки, так я тебе отвечу - делать мне больше нечего, как заниматься такой ерундой.

Тут тема, про ориентацию объектов, и управление этой ориентацией. Это понятно?

Из всех доступных способов это сделать, только один - установить объекту угол поворота, направление нормали и точку вставки. Это надеюсь понятно?

Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно?

То, что при этом с некоторыми объектами происходят нехорошие вещи не моя вина, но тем, ради кого я эту тему открыл, знать это необходимо. Это понятно?

Если ты хочешь на собственном опыте убедиться в этом - изучай AutoLISP.
Supermax вне форума  
 
Непрочитано 25.11.2009, 17:44
#57
zamtmn

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


Да не кипятись ты, мне эти нормали повороты также интересны как и тебе.
Я с ними поковырялся выше крыши, и сделал вывод:
Это огрызок внутреннего представления объектов автокада, пригодный для экономного хранения объектов на диске, но практически не причодный для переориентации объекта.

>>Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно?
не, не понятно. хочешь просто и понятно крутануть объект на произвольные углы в 3D - применяй к ниму матрицу преобразования (посчитаную тобой), если это возможно в лиспе. автокад заботливо вернет тебе новый, посчитаный "угол" и нормаль.

Последний раз редактировалось zamtmn, 25.11.2009 в 17:50.
zamtmn вне форума  
 
Автор темы   Непрочитано 25.11.2009, 18:01
#58
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
>>Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно?
не, не понятно. хочешь крутануть объект на произвольные углы в 3D - применяй к ниму матрицу преобразования (посчитаную тобой) если это возможно в лиспе, автокад заботливо вернет тебе новый, посчитаный "угол" и нормаль.
А! Так все таки вернулись опять у углу и нормали?
Ну посчитал я нужный мне угол и нормаль, а что дальше? А дальше - надо их установить! А как? - А вот так:

Скопируй вот это в буфер и вставь в командную строку Автокада.
(entget (car (entsel)))
И жми ентер.
Тебя попросят указать объект - ткни в него.
Подними планку окна просмотра событий и ты увидишь распечатку точечных пар объекта.
Этот список передается аргументом функции (entmod '(список точечных пар)) и если в нем есть отличие от того, которое есть в натуре - объект модифицируется в соответствии с новыми данными. Можно заменить 50 точечную пару (это угол поворота) на новую и модифицировать объект.
Только вот такой метод модификации приводит к сбоям если точечная пара стоит не на своем месте в списке (а в конце, так проще ее к списку приаттачить).
Есть тема про обучение на Лиспе, там и тряси народ на инфу.
Supermax вне форума  
 
Непрочитано 25.11.2009, 18:32
#59
zamtmn

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


1. из угла и нормали можно восстановить векторы.
2. из векторов можно посчитать угол.
3. получить нужное положение присвоив нормаль и угол можно только при гарантии что между каждым присвоением автокад ничего не пересчитывает, ты же говоришь что всё летит - значит пересчитывает, или ты чтото делаешь не так((

>>Скопируй вот это в буфер и вставь в командную строку Автокада...
У нас разговор слепого с глухим))
Скажи:
в лиспе можно преобразовывать объекты матрицами? чтонибудь наподобии TransformBy в ARX. если есть то ими и нужно пользоваться для переориентации.
В лиспе можно для блока получить его матрицу трансформации? если можно то из нее можно вынуть нужные тебе 0x, 0y без лишних вычислений

Последний раз редактировалось zamtmn, 25.11.2009 в 18:46.
zamtmn вне форума  
 
Автор темы   Непрочитано 25.11.2009, 18:44
#60
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
У нас разговор слепого с глухим
Я только что хотел написать то же самое.
Цитата:
Скажи, в лиспе можно преобразовывать объекты матрицами? чтонибудь наподобии TransformBy в ARX
Нет. Можно посчитать матрицу, но преобразовывать объекты можно только меняя их свойства, или заменяя в списке распечатки entget точечные пары.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тригонометрические функции и векторная алгебра

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Определение высот рельефа по близлежащим точкам dextron3 Программирование 21 10.11.2011 13:14
Интерполяция между двумя точками postbudka Программирование 27 21.05.2009 10:00
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Координаты точки, лежащей на полилинии Al_Taron Программирование 1 27.11.2006 09:45