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

Вернуться   Форум 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.
Просмотров: 43587
 
Непрочитано 25.11.2009, 20:06
#61
zamtmn

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


TransformBy таки в лиспе есть -
http://www.technopark.spb.ru/files/i...sp/tmatrix.lsp

ну и матрицу получить тоже должно быть можно
zamtmn вне форума  
 
Непрочитано 25.11.2009, 20:12
#62
Елпанов Евгений

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


zamtmn, Supermax,
Хватит ругаться! Вы оба неправы...
Во первых, матрицу можно применить к любому объекту, через лисп. Во вторых, все объекты автокада, в том числе блоки, корректно вращаются и изменяют нормали. В третьих, действительно, многострочный текст имеет дополнительные настройки, в отличии от остальных объектов, для него всегда автоматом вычисляется вектор нормали и оценивается его направление. Отсюда и глюк! Попробуйте написать многострочник и отзеркалить его. Текст будет автоматически перевернут для правильного отображения...

ps. Если необходимо это исправить, есть специальная переменная, на память не помню и акад не запущен - ищите сами, она с давних пор запротоколирована.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 20:27
#63
zamtmn

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


Елпанов Евгений
>>Хватит ругаться! Вы оба неправы...
я не ругаюсь. и думаю никто не прав, включая Вас.

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

>>Во вторых, все объекты автокада, в том числе блоки, корректно вращаются и изменяют нормали.
смотря что подразумевать под корректным вращением: установите объекту нормаль 1,0,0 он повернется, но вдобавок либо повернется вокруг оси, либо изменится rotatin хотя мы его не меняли (rotate3d - меняется rotation, в лиспе не проверял)
Вы кстати выше описывали пример вращения с использованием экранных координат - это корректно?

Последний раз редактировалось zamtmn, 25.11.2009 в 20:34.
zamtmn вне форума  
 
Непрочитано 25.11.2009, 20:37
#64
Елпанов Евгений

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Вы кстати выше описывали пример вращения с использованием экранных координат - это корректно?
конечно корректно.
я менял все через лисп, прямым редактированием dxf...

Цитата:
Сообщение от zamtmn Посмотреть сообщение
установите объекту нормаль 1,0,0 он повернется, но вдобавок либо повернется вокруг оси, либо изменится rotatin хотя мы его не меняли (rotate3d - меняется rotation, в лиспе не проверял)
При изменении вектора нормали, ничего подобного не происходит - меняется система координат объекта, точнее, только вектор нормали - направление по Z у объекта... Если перевести пользовательскую систему координат в полученную для объекта, то и направление угла поворота будет корректным.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 20:47
#65
zamtmn

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


>>При изменении вектора нормали, ничего подобного не происходит - меняется система координат объекта.

Вращаю мтекст c нормалью 0,0,1 rotation 0 командой 3drotate вокруг оси Y на 90 градусов, в результате нормаль 1,0,0, rotation 270. объясните пожалуйста
тоже самое на 1 градус, снова rotation 270.

Последний раз редактировалось zamtmn, 25.11.2009 в 21:09.
zamtmn вне форума  
 
Непрочитано 25.11.2009, 21:00
#66
Елпанов Евгений

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Вращаю мтекст c нормалью 0,0,1 поворотом 0 командой 3drotate вокруг оси Y на 90 градусов, в результате нормаль 1,0,0, угол 270. объясните пожалуйста
я же писал о многострочнике...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 21:05
#67
zamtmn

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


А есть разница? с блоком тоже самое
zamtmn вне форума  
 
Непрочитано 25.11.2009, 21:38
#68
Елпанов Евгений

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


zamtmn, ты мне все время говоришь о команде 3drotate, а здесь раздел форума по программированию. Я все объяснения делал применительно к программному редактированию объектов, т.е. без использования командной строки и стандартных команд автокада. Я редактирую объекты автокада через объектные методы либо через описания dxf объекта и его словарей. Математику пересчитываю сам...
Исходя из этого, ответственно заявляю, я активно использую блоки в 3д, в том числе вращаю и преобразую углы и нормали. Еще ни одного раза не наталкивался на ошибки автокада.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 21:56
#69
zamtmn

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


Елпанов Евгений
Я понимаю почему так происходит. и максу пытась объясняю почему так - повернули на градус а rotation уже не тот, или тот а выглядит не так
>>Математику пересчитываю сам...
а никто за тебя ее не пересчитает)), но матрицами математика в разы проще и наглядней
zamtmn вне форума  
 
Непрочитано 25.11.2009, 22:19
#70
Елпанов Евгений

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


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

ps. кстати, матрица отражения в автокаде не запротоколирована...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 22:36
#71
zamtmn

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


Тут речь про вращение. отражение, перенос легко в голове представить и понять, с поворотом труднее.
в математике они все запротоколированы))

Последний раз редактировалось zamtmn, 25.11.2009 в 22:42.
zamtmn вне форума  
 
Непрочитано 25.11.2009, 22:46
#72
Елпанов Евгений

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


zamtmn, поворот вокруг произвольной оси, все равно будет описываться как перевод в систему координат, где ось поворота направлена в верх, потом поворот на нужный угол и перевод в исходную систему координат. Описать сразу поворот вокруг произвольной оси, не проходящей через центр координат в текущей системе, это слишком сложно и не универсально - проще делать в три действия, т.е. три матрицы и перемножить. Либо, как вариант, если это единичные вычисления для единственной точки, можно сделать такие же преобразования без матрицы, например через trans для поворота, смены системы координат и обычные смещения через mapcar...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 23:44
#73
zamtmn

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


поворот вокуг произвольной оси: перенос оси в начало координат, поворот вокруг произвольной оси проходящей через 0 - перенос обратно. да 3 дейстрия. - одна матрица и один унифицированный метод для всех объектов, помоему очень удобно

формирование матрицы поворота вокруг произвольной оси проходящей через 0 - формирование 9ти ее элементов примерно по 3 умножения на каждый. но чаще повернуть нужно нацелив ось (не обязательно чтоб это была нормаль) на точку, тогда матрицу сформировать проще.

нет такого математического апарата - задание ориентации осью и углом - это надстройка над матрицами

Сразу не обратил внимание:
>>Если перевести пользовательскую систему координат в полученную для объекта
Эту матрицу перехода систем координат можно получить на лиспе?, если да - проблема Supermax решена

Последний раз редактировалось zamtmn, 25.11.2009 в 23:57.
zamtmn вне форума  
 
Непрочитано 26.11.2009, 00:09
#74
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
нет такого математического апарата - задание ориентации осью и углом - это надстройка над матрицами
Есть такой математический аппарат. Называется углы Эйлера.
В основе лежит вектор с началом в 000 МСК и некоторым направлением. С этим вектором однозначно связаны три угла: нутации, прецессии и чистого вращения. Подробности можно узрить в любом справочнике по математике ( у меня старенький для инженеров, авторы Бронштейн и Семендяев). Где то выше я приводил ссылку на готовую функцию вычисления этих углов. Один раз разобраться, и все проблемы с СКО отпадут навсегда.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 26.11.2009, 00:27
#75
zamtmn

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


Нет, углы Эйлера - это 3 угла, тут вектор и один угол. Конечно автокадовскую систему можно привести к углам Эйлера, также как к матрицам или кватернионам.
zamtmn вне форума  
 
Автор темы   Непрочитано 26.11.2009, 16:34
#76
Supermax

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


Елпанов Евгений,
Цитата:
... Исходя из этого, ответственно заявляю, я активно использую блоки в 3д, в том числе вращаю и преобразую углы и нормали. Еще ни одного раза не наталкивался на ошибки автокада.
Вот скажи, ты функциям Kpblc-а доверяешь?
Вот тут, в библиотеке функций, лежат две функции
_dwgru-conv-ent-to-ename
и _dwgru-ent-modify-autoregen
(первая нужна для работы второй).

Не поленись, сделай милость, и все кто это читает, повторите то, что я сейчас напишу, и скажите что получилось. Плииз.

Открываем чистый файл. Переходим в вид сверху (Top).
По центру экрана ваяем любой текст (MTEXT).
Набиваем в ком. строку или копируем через буфер прямо от сюда

(entget (car (entsel)))

должно вернуть что-то типа такого:

Код:
[Выделить все]
Select object: ((-1 . <Entity name: 7ed45640>) (0 . "MTEXT") (330 . <Entity name: 7ed43cf8>) (5 . "238") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1543.13 1270.98 0.0) (40 . 2.5) (41 . 25.326) (46 . 0.0) (71 . 1) (72 . 5) (1 . "dghdghdghdghdgh") (7 . "Standard") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 28.779) (43 . 3.23499) (50 . 0.0) (73 . 1) (44 . 1.0))
копируем себе в блокнотик
точку вставки (10 1543.13 1270.98 0.0)
нормаль (210 0.0 0.0 1.0)
ось абсцисс (11 1.0 0.0 0.0)
угол поворота вокруг нормали (50 . 0.0)

Теперь, поворачиваем командой _Rotate наш текст вокруг его точки вставки на 20 градусов по часовой. смотрим что получилось

Код:
[Выделить все]
Command: (entget (car (entsel)))
Select object: ((-1 . <Entity name: 7ed45640>) (0 . "MTEXT") (330 . <Entity name: 7ed43cf8>) (5 . "238") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1543.13 1270.98 0.0) (40 . 2.5) (41 . 25.326) (46 . 0.0) (71 . 1) (72 . 5) (1 . "dghdghdghdghdgh") (7 . "Standard") (210 0.0 0.0 1.0) (11 0.939693 0.34202 0.0) (42 . 28.779) (43 . 3.23499) (50 . 0.349066) (73 . 1) (44 . 1.0))
точка вставки (10 1543.13 1270.98 0.0) не изменилась
нормаль (210 0.0 0.0 1.0) осталась прежней
абсцисса (11 0.939693 0.34202 0.0) повернулась
поворот (50 . 0.349066) в радианах

Далее: переходим в вид спереди (Front)
Командой _Rotate крутим наш текст (он еле заметная линия) по часовой на 20 градусов и возвращаемся в план (вид сверху).

Смотрим что получилось
Код:
[Выделить все]
Select object: ((-1 . <Entity name: 7ed45640>) (0 . "MTEXT") (330 . <Entity name: 7ed43cf8>) (5 . "238") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1543.13 1270.98 0.0) (40 . 2.5) (41 . 25.326) (46 . 0.0) (71 . 1) (72 . 5) (1 . "dghdghdghdghdgh") (7 . "Standard") (210 -0.34202 0.0 0.939693) (11 0.883022 0.34202 0.321394) (42 . 28.779) (43 . 3.23499) (50 . 1.91986) (73 . 1) (44 . 1.0))
Точка вставки (10 1543.13 1270.98 0.0) не изменилась
Нормаль (210 -0.34202 0.0 0.939693) наклонилась влево
Абсцисса (11 0.883022 0.34202 0.321394) тоже изменилась
Угол поворота вокруг нормали (50 . 1.91986) а был (50 . 0.349066)

Но это еще не все.
Переписываем в блокнотик функции Kpblc-a
_dwgru-conv-ent-to-ename и _dwgru-ent-modify-autoregen
загружаем их и меняем угол поворота вокруг нормали на 0.0.

(_dwgru-ent-modify-autoregen (car (entsel)) 50 0.0 T)

Не знаю как у всех, но у меня в 2010 текст стал вертикально

Код:
[Выделить все]
Command: (entget (car (entsel)))
Select object: ((-1 . <Entity name: 7ed45640>) (0 . "MTEXT") (330 . <Entity name: 7ed43cf8>) (5 . "238") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1543.13 1270.98 0.0) (40 . 2.5) (41 . 25.326) (46 . 0.0) (71 . 1) (72 . 5) (1 . "dghdghdghdghdgh") (7 . "Standard") (210 -0.34202 0.0 0.939693) (11 0.0 -1.0 0.0) (42 . 28.779) (43 . 3.23499) (50 . 0.0) (73 . 1) (44 . 1.0))
Точка вставки (10 1543.13 1270.98 0.0) не изменилась
нормаль (210 -0.34202 0.0 0.939693) как была наклонена влево, так и осталась.
Абсцисса (11 0.0 -1.0 0.0) смотрит строго вниз
угол поворота (50 . 0.0)

Если вернуть нормаль на место (перейти в вид Front и повернуть текст на -20 градусов)
то мы увидим
(10 1543.13 1270.98 0.0) (210 -1.11022e-016 0.0 1.0) (11 0.0 -1.0 0.0) (50 . 4.71239)
в нормали это - -1.11022e-016 почти 0, а угол стал правильным 4.71239 радиан, то есть 270 градусов.

А теперь посмотрите что у вас.

Последний раз редактировалось Supermax, 26.11.2009 в 16:51.
Supermax вне форума  
 
Непрочитано 26.11.2009, 17:33
#77
Александр Ривилис

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


К чему это все? Тебе кажется уже выше объяснили, что в ряде случаев изменение одного dxf-кода ведет к пересчету другого (других). Правильнее пользоваться матрицей преобразования или vla-методами.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 26.11.2009, 18:09
#78
Supermax

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


Что мне объяснили? Кто объяснил? Никто ничего толком сказать не может.

Вот вы мне скажите, что такое 50 пара?
Вот прямо, что за угол такой, что при наклоне текста осью нормали влево на один градус резко начинает показывать 1.5708 радиан, что означает 90 градусов и так стоит пока нормаль не повернется на 180 градусов.

Что вы все, мне матрицами мозг забиваете. Да какая в ж разница чем этот угол вычислять? почему, когда нормаль строго вертикально, этот угол четко вращает объект вокруг нормали, а стоит чуть-чуть нормаль наклонить, даже не во всех плоскостях, а только вокруг Y и этот угол-не угол показывает а черте-что.

Я по малоопытности и недалекости считал, что это угол поворота вокруг нормали, но в Автокаде творится что-то совсем мне не понятное.

Я хотел всего лишь по нормали и этому углу вычислить оси X и Y, тут все матрицы, матрицы! Ну и где ваши матрицы? Математики?
Где продвинутые в мат отношении функции? Что слабо? Я тоже в аптеку за лекарствами могу посылать, и книжек у меня хоть библиотеку открывай, и Интернет весь до дыр в мозгу исходил.

Хоть бы с углом этим ... разобраться помогли.
Supermax вне форума  
 
Непрочитано 26.11.2009, 18:41
#79
zamtmn

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


Supermax
>>Вот вы мне скажите, что такое 50 пара?
Это еденичный вектор оси 0x объекта.
>>Что вы все, мне матрицами мозг забиваете. Да какая в ж разница чем этот угол вычислять?
есть разница, с матрицами его вообще вычислять ненадо
>>Я хотел всего лишь по нормали и этому углу вычислить оси X и Y, тут все матрицы, матрицы! Ну и где ваши матрицы? Математики?
Я выше приводил расчет осей из нормали и угла. математика что на лиспе что на паскале одинакова.
>>Хоть бы с углом этим ... разобраться помогли.
выше всё написано, почему угол скачит
zamtmn вне форума  
 
Автор темы   Непрочитано 26.11.2009, 19:17
#80
Supermax

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


Цитата:
>>Вот вы мне скажите, что такое 50 пара?
Это еденичный вектор оси 0x объекта.
Чего, чего?

Как вектор может быть определен одной цифрой?
И в описании DXF кодов что написано?

Цитата:
50 - Rotation angle in radians
Цитата:
..выше всё написано, почему угол скачит
Это где выше? Ссылочку плииз.

Я краем своих извилин что-то припоминаю, что на практике, чтобы избежать операций связанных то ли с умножением на 0, то ли с делением, в каждом случае положения нормали дают прибавку к углу поворота. Эта прибавка потом вычитается при необходимости.
Я покрутил текст и вычислил. Если нормаль двигать строго по осям X или Y - нижняя дуга - 0, левая - 90 градусов, правая - 270 и верхняя 180. А вот в промежутках - пока не догнал принцип.

Последний раз редактировалось Supermax, 26.11.2009 в 19:37.
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