Тема: ActivX метод TransformBy В VLISP
Народ , кто нибуть использовал метод TransformBy в
Лиспе ?
Подскажите какие елементы матрицы отвечают за вращение объекта и вокруг каких осей происходит вращение .
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → ActivX метод TransformBy В VLISP
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Народ , кто нибуть использовал метод TransformBy в
Лиспе ?
Подскажите какие елементы матрицы отвечают за вращение объекта и вокруг каких осей происходит вращение .
Вопрос наверно очень сложный.
Уточню. Мне необходимо трансформировать объект из
OCS в текущую UCS . Преобразовать так , чтобы две перпендикулярные прямые объекта совпадали с осями UCS , а точка их пересечения с центром UCS .Изначально объект имеет такое положение в OCS. Метод получения матрицы из UCS
функцией VLA-GetTramsformMatrix помогает лиш в редких случаях , в основном глючит.
Спасибо.
Если я правильно понял, стоит задача перерасчета точек из одной системы координат в другую. Если так, то это чистая математика.
Для начала начала несколько определений:
1. Направляющими косинусами cos(ax), cos(ay), cos(az) направленного отрезка P1P2 называются косинусы углов между P1P2 и положительными направлениями осей Ox, Oy, Oz, соответственно:
cos(ax) = (x2-x1) / SQRT ( (x2-x1)^2 + (y2-y1)^2 (z2-z1)^2 )
cos(ay) = (y2-y1) / SQRT ( (x2-x1)^2 + (y2-y1)^2 (z2-z1)^2 )
cos(az) = (z2-z1) / SQRT ( (x2-x1)^2 + (y2-y1)^2 (z2-z1)^2 )
(cos(ax))^2 + (cos(ay))^2 + (cos(az))^2 = 1
;^2 - это в квадрате
Направляющие косинусы направленного отрезка P2P1 - это (-cos(ax)), (-cos(ay)), (-cos(az))
2. Направление прямой может быть также определено любыми тремя числами ax, ay, az, пропорциональными направляющим косинусам cos(ax), cos(ay), cos(az); в этом случае:
cos(ax) = ax / SQRT ( (ax)^2 + (ay)^2 (az)^2 )
cos(ay) = ay / SQRT ( (ax)^2 + (ay)^2 (az)^2 )
cos(az) = az / SQRT ( (ax)^2 + (ay)^2 (az)^2 )
Знак перед корнем должен быть одинаковым во всех трех равенствах; его выбор определяет положительное направление на прямой. Направляющие косинусы являются координатами еденичного вектора, совпадающего по направлению с P1P2.
Перенос осей.
Пусть x, y, z - координаты произвольной точки P относительно одной системы координат, пусть x', y', z' - координаты той же точки P относительно другой системы координат, оси которой направленны так же, как оси первой системы, и начало которой имеет относительно системы Oxyz координаты x0, y0, z0. Тогда:
x' = x - x0
y' = y - y0
z' = z - z0
и
x = x' + x0
y = y' + y0
z = z' + z0
Поворот осей.
Пусть x, y, z и x', y', z' - координаты одной и той же точки P относительно двух различных систем координат с общим началом O; пусть вторая из них расположена относительно системы Oxyz таким образом, что
ось Ox' имеет направляющие косинусы t11, t21, t31
ось Oy' имеет направляющие косинусы t12, t22, t32
ось Oz' имеет направляющие косинусы t13, t23, t33
Тогда относительно системы Ox'y'z' :
ось Ox имеет направляющие косинусы t11, t12, t13
ось Oy имеет направляющие косинусы t21, t22, t23
ось Oz имеет направляющие косинусы t31, t32, t33
Формулы, связывающие координаты x, y, z с координатами x', y', z' :
x' = t11*x + t21*y + t31*z
y' = t12*x + t22*y + t32*z
z' = t13*x + t23*y + t33*z
и
x = t11*x' + t12*y' + t13*z'
y = t21*x' + t22*y' + t23*z'
z = t31*x' + t32*y' + t33*z'
Одновременный перенос и поворот осей.
Если начало системы Ox'y'z' не совпадает с началом системы Oxyz и имеет относительно последней координаты x0, y0, z0, тогда:
x' = t11*(x-x0) + t21*(y-y0) + t31*(z-z0)
y' = t12*(x-x0) + t22*(y-y0) + t32*(z-z0)
z' = t13*(x-x0) + t23*(y-y0) + t33*(z-z0)
и
x = t11*x' + t12*y' + t13*z' + x0
y = t21*x' + t22*y' + t23*z' + y0
z = t31*x' + t32*y' + t33*z' + z0
Но лучше всего открыть любой справочник по математике, там все это есть.
Я конечно, понимаю, что это не математическое решение, но почему бы не воспользоваться функцией C:ALIGN ?
Большое спасибо lehе , возможно Это мне когда нибудь пригодится. Но я хотел бы узнать у кого нибудь о методеTransformby.
Есть матрица : R11 R21 R31 T1
R21 R22 R23 T2
R31 R32 R33 T3
0 0 0 1
T1 , T2 , T3 - компоненты сдвига по осям X Y и Z соответственно
(в мировой системе координат)
Остальные товечают за вращение и масштабирование .
Но вот как именно - ЭТО я хотел узнать .
Точнее , какие комбинации Rij соответствуют вращению и около чего объект вращается.
Функцию Align использовал с командной строки .
Иногда глючит .
Хотелось бы с ActivX -это работает надежнее .
Надеюсь найдутся спецы по TransformBy.
Спасибо.
Функция C:ALIGN - иногда глючит, когда в качестве первого аргумента ей передается примитив, а не набор. Даже если один элемент - передавай (ssadd Prim)
Если Я правильно понял , то примитив необходимо передать как набор объектов .
Спасибо Олег , Я попробую.
Я надеюсь что всетаки ктото выскажется по поводу TransformBy
Спасибо Олег .
Функция работает почти хорошо .
Но случается такой глюк .
Specify first source point: -9.45175923,0.00000000,5.89656025
Specify first destination point: 0,0,0
Specify second source point: -9.45175923, 80.00000000,5.89656025
Specify second destination point: 0,80.00000000,0
Specify third source point or <continue>: -3.45175923,0.00000000,5.89656025
Specify third destination point: 6.00000000,0,0
The first and third destination points coincide.
Ну разве первая и третья точки совпадают ?
Я полагаю , что ты спец в функции Align .
Может быть ты знаешь из-за чего этот глюк ?
Cпасибо .
Не знаю. У меня все получилось.
Вообще, с алигном были какие-то проблемы (что конкретно сейчас не вспомю). Один наш сотрудник его переписал, используя более стабильные функции. Таким сейчас и пользуемся.
Сейчас сброшу на почтовый ящик.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → ActivX метод TransformBy В VLISP
Форум работает на PunBB, при поддержке Informer Technologies, Inc