|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Тригонометрические функции и векторная алгебра
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 44445
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Так покрасивше будет
Код:
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 14.06.2015 в 12:18. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Делаем L=1 и пересчитываем ту точку, от которой делали отсчет в 0,0,0.
чтоб получить единичный вектор, достаточно разделить каждую координату на длинну этого вектроа, ненадо ничего никуда переносить >>Функцию можно назвать points-vector. вообщето это называется - нормализация Почитайте чтонибудь по геометрии, например http://algolist.ru/maths/geom/index.php, подобных вопросов возникать не будет |
|||
![]() |
|
||||
zamtmn,
"Чукча не читатель, Чукча - писатель!" Цитата:
Видишь, я функции граблями пишу, а люди (VVA) - душою. Или у тебя тоже грабли? |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Честно говоря прочитал через строку - если нужна функция получения единичного вектора - "моя бибилиотечная":
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
О! Укуси меня пчела!
![]() Ну, наверное надо тему переименовать в "Тригонометрические функции" Мне еще надо превращать единичный вектор оси Z объекта, который 210 парой показывается в: 1: Его атипод (-Z) 2: Вектор абсцисс (Х) 3: Антипод абсцисс (-Х) 4: Вектор ординат (Y) 5: Антипод ординат (-Y) Вот в MTEXT-е 11 пара - вектор абсцисс объекта MTEXT. А в других объектах его нет, надо вычислять. Нужна функция, которая по начальной точке, вектору и длинне дает координаты точки. Нужны еще несколько функций и в Автокаде можно будет крутить-вертеть все, что угодно. Дима_, только надо pt1 и pt2 местами поменять. первая точка должна быть "из", а вторая "в", а не наоборот. Последний раз редактировалось Supermax, 22.11.2009 в 13:02. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Возможно - я его писал когда нужно было смоделировать плоскую модель тела при просмотре с некого вектора - видимо поэтому и получилось "наоборот" - это просто с какой стороны смотреть.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Ну, наверное надо тему переименовать в "Тригонометрические функции"
тригонометрия - sin, cos и т.д., такчто переименовать лучше чтоб в названии векторная алгебра фигурировала >>Или у тебя тоже грабли? к сожалению на лиспе ни граблями ни чем другим не умею)) >>Вот в MTEXT-е 11 пара - вектор абсцисс объекта MTEXT. А в других объектах его нет, надо вычислять. в других объектах есть угол поворота, вычисление 0x в этом случае описано в разделе arbitrary axis algorithm DXF Reference |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Чую и синусы понадобятся.
Понадобятся только чтоб перейти от угла к вектору или создать матрицу поворота. >>А про песчет векторов с учетом угла поворота - ссылочку плииз! ссылочки нету, но если нужно получить 0x из угла поворота(u): 0x=(cos(u),sin(u),0) это если 0z=0,0,1 если нет, сначала нужно получить 0x используя arbitrary axis algorithm, потом повернуть его на угол u вокруг 0z >>В MTEXT и угол поворота есть и х-вектор и z-вектор. А нужны все, и не для коллекции. насколько помню, в MTEXT - угол поворота и ox - одно и тоже если есть 0x,0z, то 0y - векторное произведение 0x и 0z (нужно промнить что векторное произведение зависит от мерестановки мест, какая последовательность 0x*0z или 0z*0x я не помню) >>Нужны еще несколько функций и в Автокаде можно будет крутить-вертеть все, что угодно. чтобы крутить всё что угодно нужно: векторное произведение скалярное произведение умножение вектора на матрицу умножение матрицы на матрицу создание матрицы поворота вокруг 0x создание матрицы поворота вокруг 0y создание матрицы поворота вокруг 0z создание матрицы поворота вокруг произвольного вектора лисп насколько понимаю - очень неудобный для этого язык Последний раз редактировалось zamtmn, 22.11.2009 в 19:26. |
|||
![]() |
|
||||
Ну зачем так сложно? В Автокаде все уже почти есть.
Воспользуемся услужливо нам даденным MTEXT-ом. Создаем временный объект с точкой вставки 0,0,0 и задаем ему угол поворота и вектор, получаем из 11 пары вектор Х. Крутим вокруг него на 90 гр. и получаем Y. антиподы делаются простой сменой знаков. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Ну зачем так сложно? В Автокаде все уже почти есть.
>>Воспользуемся услужливо нам даденным MTEXT-ом. Ну я бы не сказал что создать объект проще чем сделать несколько векторных произведений, такой подход с добру не приведет |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
не очень понимаю, чем trans не угодил? Или это вообще не в теме?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Ну, типа, дан единичный вектор Z и угол поворота вокруг него. Надо найти координату оси Х и т.д.
Ясно дело, если угол = 0, то Х= (1,0,0), а если не нулю? Кулик Алексей aka kpblc , не, не угодил. Он переводит пользовательские координаты в мировые и обратно, ну еще экранные. А тут речь идет о том, в какую сторону откладывать расстояние, если тебе дана не та ось, что тебе надо. Вот сделай MTEXT, поверни его в нескольких плоскостях и попробуй сделать вокруг него рамку. И GetBoundingBox тебе не поможет. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
могу дать расчет системы координат вставки блока на паскале, там есть и нормаль и поворот, но используется матричное вычисление и векторное произведение, в лиспе это можно заюзать?
>>Ясно дело, если угол = 0, то Х= (1,0,0), а если не нулю? нет, 0x зависит не только от угла но и от нормали (группа 210 помоему) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Можно, конечно
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
ок. на входе имеем Local.oz - нормаль, rotate - угол поворота. расчитываем Local.ox, Local.oy и матрицу перевода мировых координат в систему координат блока. матрицы приняты 4х мерными.
используя arbitrary axis algorithm считаем неповернутые Local.ox, Local.oy, тут YWCS и ZWCS соответственно равны 0,1,0 и 0,0,1 Код:
Код:
Код:
Код:
|
|||
![]() |
|
||||
Вообще-то проще 6 раз перейти из одного пользовательского пространства в другое и списать значения 210 пары переведенные в ПСК.
Чего голову морочить? Правда если модель перегружена объектами могут тормоза начаться, но можно попытаться. Можно из линий ежика сделать, объединить их в блок, развернуть и взорвать, получив координаты концов линий. Что-то чую я, трудно будет математикой это сделать. |
||||
![]() |
|
||||
Вот, сделано через Ж, но работает.
Код:
Получаем (z (то есть то, что дали) -Z X -X Y -Y) Пример (vektor-translate '(-0.34202 0.0 0.939693) 1.91986) Получаем: ((-0.34202 0.0 0.939693) (0.34202 0.0 -0.939693) (0.883023 0.342018 0.321394) (-0.883023 -0.342018 -0.321394) (-0.321392 0.939693 -0.116977) (0.321392 -0.939693 0.116977)) Чуток подправил функцию. Теперь она просто летает, поскольку не прорисовывает. Создаем блок, в нем другой блок, там его крутим и все удаляем. Все происходит чисто в памяти, без вывода графики на экран, как раньше. Последний раз редактировалось Supermax, 23.11.2009 в 03:31. |
||||
![]() |
|
||||
Supermax, Привет!
![]() Я честно пытался понять, что же необходимо получить. Прочел тему полтора раза, но не понял. Нахождение векторов, их преобразование и вращение, можно делать гораздо проще. Как уже говорилось, либо по формулам аффинных преобразований, либо через векторы и функцию trans. Поясните для меня, что именно необходимо получить...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Я дочитал еще те 0.5 раза, которые не смог Евгений и так же не понял
![]() По поводу trans, OCS и 3D у меня в закладках потрясающая и исчерпывающая тема gile. Там требуется регистрация, но советую почитать. About trans and OCS in 3D Пример оттуда. Получет вектор, который пишется в 210 поле Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Поясняю (ну как смогу, конечно).
Что такое 210 пара? Можно много красивых слов находить, но по детски очень трудно сформулировать. 210 пара - ось Z объекта в сторону положительных значений. Берем любой примитив, лучше МTEXT, поворачиваем его туда-сюда и наигравшись смотрим куда смотрит его ось Z, тобишь, читаем значение нормали (210 пары). Что такое единичная сфера и единичный вектор смотрим в википидии. Но положение тела в пространстве определяется не только точкой вставки и ориентацией Z оси объекта, а еще и углом поворота вокруг этой оси. Хотя можно задавать просто две точки, как в MTEXT-е (210 и 11 пары). Мне надо отложить по оси Y объекта необходимую длинну. Для этого мне надо определить, куда смотрит ось Y объекта. Имея единичный вектор, который соответствует оси ординат объекта я могу строить вокруг него нужные мне геометрические фигуры, как бы он не был повернут в пространстве. Да я тупо сделал функцию. Нарисовал "ежик" с 6-ю лучами и задавая ему поворот и направление нормали получаю все 6 векторов. Есть один вектор и угол поворота вокруг него, надо найти все остальные вектора. Да гляньте вы на список, что возвращается. если Z = первой координате, то -Z - второй и все остальные тоже отличаются только знаками. Последний раз редактировалось Supermax, 23.11.2009 в 10:46. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
кстати отрицательные значения не нужны, они автоматом получатся при откладывании отрицательной длины в нужном направлении
имеем единичный вектор dir нужного направления, нужно отложить 5 едениц в обе стороны dir*5 в положительном dir*(-5) в отрицательном |
|||
![]() |
|
||||
Это вектор, причем ничего не мешает использовать "длинный" вектор, т.е. его длина не обязательно должна равняться единице! Это верно для всех примитивов акада...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Цитата:
Для ручного указания направления сойдет что угодно, а для изменения ориентации объекта? Допустим, мне надо повернуть объект вокруг его оси X на 90 градусов по часовой стрелке. Лишние направления не лишни. Даже первый список, который вегда равен тому, который задаешь аргументом не грех сравнивать с исходным. Вот кто мне скажет почему надо сначала поворачивать, а потом менять нормаль? В свойстве "Rotation" ведь указан поворот вокруг оси, которая задана нормалью. Если нормаль крутишь-вертишь он не меняется, а стоит его поменять - нормаль летит к чертям. Вот переставьте в моей функции вот эти две строчки местами. Код:
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Вот кто мне скажет почему надо сначала поворачивать, а потом менять нормаль?
3д повороты зависят от порядка в котором они произведены, поменяешь их местами - получишь другой результат, зависят от системы координат в которой они производятся. вектор ты крутишь в мировой системе координат, а угол задаешь уже в локальной ск объекта Имхо правильней задавать не угол а направление 0x, угол - для наглядности в 2D, в 3D его наглядность теряется Последний раз редактировалось zamtmn, 23.11.2009 в 12:16. |
|||
![]() |
|
||||
Цитата:
Попробуй для любого объекта задать длинный вектор или как вариант - удлинить его.. Как пример - удлиняем вектор в 11 раз: Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
zamtmn, не, "ты Борис не прав". Угол, что значится в свойстве Rotation ни к каким пространствам отношения не имеет. Он (по идее) всегда обозначает поворот вокруг нормали. То есть вокруг оси Z объекта.
В какую ты систему не пересчитывай нормаль, а угол всегда один и тот же. Но процесс установки угла и нормали, если это делать путем замены точечных пар, у блока, к примеру, сбивает настройку точки вставки. Причем в 10 паре указано одно, а vla-get-InsertionPoint показывает совсем другое. И врет при этом 10 пара. Если сделать vla-put... то блок становится на свое место, а 10 пара, угол поворота и нормаль остаются прежними. Глюки, короче. Тут тоже видимо глюк. Этот Rotation, ведет себя так, буд-то объект вращают вокруг оси Z пространства, где расположен объект. Я правда только на блоках и MTEXT-ах практиковался. Елпанов Евгений, ценная инфа, могет пригодиться. Правда в свете глюковатости самого када, как бы глюков не прибавилось. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
в системе координат блока угол это поворот вокруг 0,0,1, а в мировой системе системе поворот вокруг нормали блока. при переходе между системами значение угла не меняется, меняется вокруг чего он задает вращение.
Не знаю как в лиспе а в dxf файле значение точки вставки хранится в системе координат объекта, такчто ее тоже нужно пересчитывать в мировую систему, приведеные мной выше куски кода работают при чтении dxf файла, возможно в лиспе точка вставки автоматом переведена в МСК |
|||
![]() |
|
||||
Supermax, Есть одна тонкость, но ее необходимо учитывать и при передаче единичного вектора. Если ты присваиваешь одинаковый вектор нормали нескольким объектам и для каждого объекта вычисляешь этот вектор заново, может оказаться, что объекты лежат в разных плоскостях и соответственно не могут пересекаться, объединяться и.т.д... А всему виной точность. Т.е. в одном месте будет 0.0 а в другом 1е-16. и уже разные вектора.
Я, обычно, использую небольшое округление векторов. Это позволяет меньше зависеть от точности акада...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
point -> WCS
insert -> OCS Я у себя на сайте по этому вопросу развлекался...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
to Supermax
если тебе надо сделать boundingBox для повернутого mtexta то оно вот, спасибо VVA. - это функция из экспресс тулз, что подается ей на вход остается только гадать, но вот так работает: Код:
Код:
|
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Может кому пригодится.
http://www.caduser.ru/forum/index.ph...D=44&TID=41129 http://www.caduser.ru/forum/index.ph...D=44&TID=27943
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
zamtmn,
Цитата:
Изменение этого параметра никоим образом не должно изменять значение нормали объекта. Куда ось Z объекта была направлена, туда и должна остаться быть направленной. А она рушиться. И точка вставки блока порою улетает. Во! Sleekka, Функция acet-geom-textbox написана без учета глючности Автокада. Если объект не повернут - она работает, а если повернут в двух плоскостях - рамка улетает черт знает куда (при объекте MTEXT). Код:
Немного размерность массива подправил. Причем! Если объект TEXT - все тип топ. А если MTEXT - и в 2006, и в 2007, и в 2010 - рамка улетает вниз. Уж от типа объекта все никак не должно зависить. Еще малость изменил, чтобы рамку рисовало из любой ПСК. Надо наверное и в функцию оформить. Sleekka, будь добр, переведи на русский язык функции и укажи значения аргументов. Я в первом посте ссылку дам. Сам я все понял, но "надо Федя, надо". Pastor, спасибо за вклад. Последний раз редактировалось Supermax, 24.11.2009 в 19:42. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Изменение этого параметра никоим образом не должно изменять >>значение нормали объекта. Куда ось Z объекта была направлена,
>>туда и должна остаться быть направленной. А она рушиться. >>И точка вставки блока порою улетает. Во! Не факт, но я думаю: Положение тела в 3D однозначно задоется 3мя базисными векторами, 0x,0y,0z (вернее сказать 2мя, т.к. третий всегда можно посчитать по 2 изза взаимоортогональности) Угол - это угол между 0x фактической 0x расчитаной по arbitrary axis algorithm, когда ты меняешь нормаль - угол может поменяться, а ты ему присваиваешь старое значение - вот всё и летит. Угол нужен только в 2д, там с ним всё понятно, в 3д - он только мешает, т.к. не матрица преобразования расчитывается по углу, а угол расчитывается из матрицы преобразований. |
|||
![]() |
|
||||
На этом форуме, встречается мой код, для вставки блока с поворотом вокруг произвольной оси. Вставка выполняется с отслеживанием курсора, через grread. Создавая этот код я столкнулся с проблемой - при указании угла поворота в произвольной системе координат, угол отличается от подразумевавшегося. т.е. если блок находится в точке не лежащей на XY мировой и нормаль отличается от мировой, то указывая точку на экране не так просто вычислить действительный угол поворота в плоскости блока. Для этой цели, я переводил указанную точку в систему координат экрана, далее вычислял еще одну точку, в которой z была другой, но xy в экранной системе координат совпадали. Далее, находил точку пересечения плоскости блока с линией, заданной этими двумя точками. Угол в системе координат блока, относительно оси Х и вектором из точки вставки и найденной точкой и давали искомый угол.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Цитата:
хотя... Контура подрезки xclip хранят в своих dxf кодах матрицы, причем сразу две матрицы 4х4, одна для подрезаемого объекта, вторая для самого контура подрезки. ps. Конечно, матрицы хранятся не в самих объектах, а в словарях, как впрочем и контура...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>матрица трансформации не хранится в объекте, а услужливо вычисляется при запросе.
ИМХО Это угол не хранится, а услужливо вычисляется (под объектом я подразумеваю не то что видно в лисп, а то что действительно лежит в закрамах автокада), без матриц в 3d графике шагу ни ступить. |
|||
![]() |
|
|||||
zamtmn,
Цитата:
Цитата:
И я не старое значение присваиваю, а новое. И когда нормаль я меняю - угол не меняется, в смысле в свойствах объекта он остается прежним. Цитата:
Цитата:
И почему изменение свойства Rotation в объекте TEXT нормаль не меняет, а в MTEXT меняет? Елпанов Евгений, о, как я тебя понимаю! Через экран? Это круто! Мы люди технические. Математика для нас как клоунов план производства работ. Мы любые проблемы решаем исключительно штангенциркулем. Если очень надо, то используем микрометр. Вот не только MTEXT страдает глюком, блоки тоже не хотят крутится вокруг нормали, еще и труднопредсказуемым перемещением страдают. Люди! Если вы, по случайности, залезли в свойство Rotation объектов Автокада, не забудьте после этого восстановить нормаль и точку вставки. Последний раз редактировалось Supermax, 24.11.2009 в 20:52. |
|||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Или одним и углом поворота вокруг него, что собственно в Автокаде и присутствует.
Да елки палки, чтоб этот угол применить надо: знать вокруг чего вращат - знаем (нормаль); исходное состояние которое вращаем - его не знаем! тут вся хитрость - исходное состояние это расчет оси 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, опять не-е-е.
Цитата:
Цитата:
Маленькая функция на основе моей vektor-translate: Возвращает точку вставки объекта и три его единичных вектора (X Y Z) (естественно в МСК). Если точки вставки нет, то за точку вставки принимается (0.0 0.0 0.0) Если угла нет, то при расчете угол равен 0.0 (может так станет всем понятно что мне надо) Применение: (vectors-x-y-z (car (entsel))) Код:
Последний раз редактировалось Supermax, 24.11.2009 в 21:54. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>А про точку вставки забыл? Положение объекта в Автокаде определено точкой вставки, нормалью и углом поворота вокруг нее
Нет, не забыл. я имел ввиду поворотную ориентацию объекта. еще пример неоднозначности нормали и угла и зависимость угла от нормали: Втыкаем вилку в монитор - это будет нормаль 1 - поворачиваем вилку чтоб смотрела вертикально вверх, не вращая 2 - поворачиваем вилку чтоб смотрела влево , не вращая 3 - поворачиваем вилку в исходное положение (чтоб смотрела вперед) , не вращая вилка в исходном положении, вращения вокруг вилки небыло, почему монитор набоку и вилка повернута? edit: вот еще цитата про X-axis dir из описания мтекста в OpenDWG R13/R14/R2000/R2004/R2007 File Format Specification Цитата:
Последний раз редактировалось zamtmn, 24.11.2009 в 22:30. |
|||
![]() |
|
||||
Э! Ты меня так просто не поймаешь! Ты его поворачиваешь сначала вокруг оси X МСК, затем вокруг оси Z МСК, а потом вокруг оси Y МСК, так чего ты хочешь? Ты на него сначала смотришь в фас, затем снизу, затем опять снизу, затем опять в фас, но с поворотом.
Если поворачивать монитор не от себя вертикально, а от себя влево под 45 градусов, то он должен (если нет поворота) стать на угол, а у тебя при прохождении 45 градусов, во время поворота влево он все время смотрит на тебя боком. Вот тут он у тебя и вращается! Последний раз редактировалось Supermax, 24.11.2009 в 23:18. |
||||
![]() |
|
||||
Ага, за один поворот 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. |
||||
![]() |
|
||||
А, пардон по е забыл!
Только что проверил. в 2007 каде функция entmod при замене 50 пары сбивает точку вставки у текста, а у мтекста не сбивает. И сбивает она потому, что список сформирован с нарушением порядка расположения точечных пар. А про порядок расположения точечных пар в списках для функций entmod b entmakex вообще, нигде, ни гу гу. Последний раз редактировалось Supermax, 25.11.2009 в 15:00. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Гляжу справку
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, я ничего не добиваюсь, и если ты думаешь, что я днями напролет ползаю по объектам Автокада и ищу в нем глюки, так я тебе отвечу - делать мне больше нечего, как заниматься такой ерундой.
Тут тема, про ориентацию объектов, и управление этой ориентацией. Это понятно? Из всех доступных способов это сделать, только один - установить объекту угол поворота, направление нормали и точку вставки. Это надеюсь понятно? Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно? То, что при этом с некоторыми объектами происходят нехорошие вещи не моя вина, но тем, ради кого я эту тему открыл, знать это необходимо. Это понятно? Если ты хочешь на собственном опыте убедиться в этом - изучай AutoLISP. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Да не кипятись ты, мне эти нормали повороты также интересны как и тебе.
Я с ними поковырялся выше крыши, и сделал вывод: Это огрызок внутреннего представления объектов автокада, пригодный для экономного хранения объектов на диске, но практически не причодный для переориентации объекта. >>Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно? не, не понятно. хочешь просто и понятно крутануть объект на произвольные углы в 3D - применяй к ниму матрицу преобразования (посчитаную тобой), если это возможно в лиспе. автокад заботливо вернет тебе новый, посчитаный "угол" и нормаль. Последний раз редактировалось zamtmn, 25.11.2009 в 17:50. |
|||
![]() |
|
||||
Цитата:
Ну посчитал я нужный мне угол и нормаль, а что дальше? А дальше - надо их установить! А как? - А вот так: Скопируй вот это в буфер и вставь в командную строку Автокада. (entget (car (entsel))) И жми ентер. Тебя попросят указать объект - ткни в него. Подними планку окна просмотра событий и ты увидишь распечатку точечных пар объекта. Этот список передается аргументом функции (entmod '(список точечных пар)) и если в нем есть отличие от того, которое есть в натуре - объект модифицируется в соответствии с новыми данными. Можно заменить 50 точечную пару (это угол поворота) на новую и модифицировать объект. Только вот такой метод модификации приводит к сбоям если точечная пара стоит не на своем месте в списке (а в конце, так проще ее к списку приаттачить). Есть тема про обучение на Лиспе, там и тряси народ на инфу. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
1. из угла и нормали можно восстановить векторы.
2. из векторов можно посчитать угол. 3. получить нужное положение присвоив нормаль и угол можно только при гарантии что между каждым присвоением автокад ничего не пересчитывает, ты же говоришь что всё летит - значит пересчитывает, или ты чтото делаешь не так(( >>Скопируй вот это в буфер и вставь в командную строку Автокада... У нас разговор слепого с глухим)) Скажи: в лиспе можно преобразовывать объекты матрицами? чтонибудь наподобии TransformBy в ARX. если есть то ими и нужно пользоваться для переориентации. В лиспе можно для блока получить его матрицу трансформации? если можно то из нее можно вынуть нужные тебе 0x, 0y без лишних вычислений Последний раз редактировалось zamtmn, 25.11.2009 в 18:46. |
|||
![]() |
|
||||
Цитата:
Цитата:
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
TransformBy таки в лиспе есть -
http://www.technopark.spb.ru/files/i...sp/tmatrix.lsp ну и матрицу получить тоже должно быть можно |
|||
![]() |
|
||||
zamtmn, Supermax,
Хватит ругаться! Вы оба неправы... Во первых, матрицу можно применить к любому объекту, через лисп. Во вторых, все объекты автокада, в том числе блоки, корректно вращаются и изменяют нормали. В третьих, действительно, многострочный текст имеет дополнительные настройки, в отличии от остальных объектов, для него всегда автоматом вычисляется вектор нормали и оценивается его направление. Отсюда и глюк! Попробуйте написать многострочник и отзеркалить его. Текст будет автоматически перевернут для правильного отображения... ps. Если необходимо это исправить, есть специальная переменная, на память не помню и акад не запущен - ищите сами, она с давних пор запротоколирована.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Елпанов Евгений
>>Хватит ругаться! Вы оба неправы... я не ругаюсь. и думаю никто не прав, включая Вас. >>Во первых, матрицу можно применить к любому объекту, через лисп. В этом всё удовольствие, не надо думать что модифицировать, умножил на матрицу и всё. линия, блок, мтекст. в случае линии - ее координаты умножатся на матрицу, в случае объекта с своей системой координат - его матрица умножится на нашу. все преобразования в одном - перемещения, масштаб и поворот >>Во вторых, все объекты автокада, в том числе блоки, корректно вращаются и изменяют нормали. смотря что подразумевать под корректным вращением: установите объекту нормаль 1,0,0 он повернется, но вдобавок либо повернется вокруг оси, либо изменится rotatin хотя мы его не меняли (rotate3d - меняется rotation, в лиспе не проверял) Вы кстати выше описывали пример вращения с использованием экранных координат - это корректно? Последний раз редактировалось zamtmn, 25.11.2009 в 20:34. |
|||
![]() |
|
||||
Цитата:
![]() я менял все через лисп, прямым редактированием dxf... При изменении вектора нормали, ничего подобного не происходит - меняется система координат объекта, точнее, только вектор нормали - направление по Z у объекта... Если перевести пользовательскую систему координат в полученную для объекта, то и направление угла поворота будет корректным.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>При изменении вектора нормали, ничего подобного не происходит - меняется система координат объекта.
Вращаю мтекст c нормалью 0,0,1 rotation 0 командой 3drotate вокруг оси Y на 90 градусов, в результате нормаль 1,0,0, rotation 270. объясните пожалуйста тоже самое на 1 градус, снова rotation 270. Последний раз редактировалось zamtmn, 25.11.2009 в 21:09. |
|||
![]() |
|
||||
я же писал о многострочнике...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
zamtmn, ты мне все время говоришь о команде 3drotate, а здесь раздел форума по программированию. Я все объяснения делал применительно к программному редактированию объектов, т.е. без использования командной строки и стандартных команд автокада. Я редактирую объекты автокада через объектные методы либо через описания dxf объекта и его словарей. Математику пересчитываю сам...
Исходя из этого, ответственно заявляю, я активно использую блоки в 3д, в том числе вращаю и преобразую углы и нормали. Еще ни одного раза не наталкивался на ошибки автокада.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Елпанов Евгений
Я понимаю почему так происходит. и максу пытась объясняю почему так - повернули на градус а rotation уже не тот, или тот а выглядит не так >>Математику пересчитываю сам... а никто за тебя ее не пересчитает)), но матрицами математика в разы проще и наглядней |
|||
![]() |
|
||||
Мне уже все равно... Когда много последовательных преобразований, я накапливаю их в матрице. Если же надо просто повернуть или сдвинуть - обхожусь без них...
Как пример, если нужно сделать отражение одной точки относительно произвольной плоскости - проще обойтись без матриц. Но когда необходимо вычислить серию отражений, те. положение нескольких точек после десятка отражений от произвольных плоскостей - здесь проще накапливать положение в одной матрице и потом применить матрицу к серии точек и вычислить новое положение. То же относится к объектам автокада... ps. кстати, матрица отражения в автокаде не запротоколирована...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
zamtmn, поворот вокруг произвольной оси, все равно будет описываться как перевод в систему координат, где ось поворота направлена в верх, потом поворот на нужный угол и перевод в исходную систему координат. Описать сразу поворот вокруг произвольной оси, не проходящей через центр координат в текущей системе, это слишком сложно и не универсально - проще делать в три действия, т.е. три матрицы и перемножить. Либо, как вариант, если это единичные вычисления для единственной точки, можно сделать такие же преобразования без матрицы, например через trans для поворота, смены системы координат и обычные смещения через mapcar...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
поворот вокуг произвольной оси: перенос оси в начало координат, поворот вокруг произвольной оси проходящей через 0 - перенос обратно. да 3 дейстрия. - одна матрица и один унифицированный метод для всех объектов, помоему очень удобно
формирование матрицы поворота вокруг произвольной оси проходящей через 0 - формирование 9ти ее элементов примерно по 3 умножения на каждый. но чаще повернуть нужно нацелив ось (не обязательно чтоб это была нормаль) на точку, тогда матрицу сформировать проще. нет такого математического апарата - задание ориентации осью и углом - это надстройка над матрицами Сразу не обратил внимание: >>Если перевести пользовательскую систему координат в полученную для объекта Эту матрицу перехода систем координат можно получить на лиспе?, если да - проблема Supermax решена Последний раз редактировалось zamtmn, 25.11.2009 в 23:57. |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Цитата:
В основе лежит вектор с началом в 000 МСК и некоторым направлением. С этим вектором однозначно связаны три угла: нутации, прецессии и чистого вращения. Подробности можно узрить в любом справочнике по математике ( у меня старенький для инженеров, авторы Бронштейн и Семендяев). Где то выше я приводил ссылку на готовую функцию вычисления этих углов. Один раз разобраться, и все проблемы с СКО отпадут навсегда.
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
Елпанов Евгений,
Цитата:
Вот тут, в библиотеке функций, лежат две функции _dwgru-conv-ent-to-ename и _dwgru-ent-modify-autoregen (первая нужна для работы второй). Не поленись, сделай милость, и все кто это читает, повторите то, что я сейчас напишу, и скажите что получилось. Плииз. Открываем чистый файл. Переходим в вид сверху (Top). По центру экрана ваяем любой текст (MTEXT). Набиваем в ком. строку или копируем через буфер прямо от сюда (entget (car (entsel))) должно вернуть что-то типа такого: Код:
точку вставки (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 градусов по часовой. смотрим что получилось Код:
нормаль (210 0.0 0.0 1.0) осталась прежней абсцисса (11 0.939693 0.34202 0.0) повернулась поворот (50 . 0.349066) в радианах Далее: переходим в вид спереди (Front) Командой _Rotate крутим наш текст (он еле заметная линия) по часовой на 20 градусов и возвращаемся в план (вид сверху). Смотрим что получилось Код:
Нормаль (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 текст стал вертикально Код:
нормаль (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. |
||||
![]() |
|
||||
Что мне объяснили? Кто объяснил? Никто ничего толком сказать не может.
Вот вы мне скажите, что такое 50 пара? Вот прямо, что за угол такой, что при наклоне текста осью нормали влево на один градус резко начинает показывать 1.5708 радиан, что означает 90 градусов и так стоит пока нормаль не повернется на 180 градусов. Что вы все, мне матрицами мозг забиваете. Да какая в ж разница чем этот угол вычислять? почему, когда нормаль строго вертикально, этот угол четко вращает объект вокруг нормали, а стоит чуть-чуть нормаль наклонить, даже не во всех плоскостях, а только вокруг Y и этот угол-не угол показывает а черте-что. Я по малоопытности и недалекости считал, что это угол поворота вокруг нормали, но в Автокаде творится что-то совсем мне не понятное. Я хотел всего лишь по нормали и этому углу вычислить оси X и Y, тут все матрицы, матрицы! Ну и где ваши матрицы? Математики? Где продвинутые в мат отношении функции? Что слабо? Я тоже в аптеку за лекарствами могу посылать, и книжек у меня хоть библиотеку открывай, и Интернет весь до дыр в мозгу исходил. Хоть бы с углом этим ... разобраться помогли. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Supermax
>>Вот вы мне скажите, что такое 50 пара? Это еденичный вектор оси 0x объекта. >>Что вы все, мне матрицами мозг забиваете. Да какая в ж разница чем этот угол вычислять? есть разница, с матрицами его вообще вычислять ненадо >>Я хотел всего лишь по нормали и этому углу вычислить оси X и Y, тут все матрицы, матрицы! Ну и где ваши матрицы? Математики? Я выше приводил расчет осей из нормали и угла. математика что на лиспе что на паскале одинакова. >>Хоть бы с углом этим ... разобраться помогли. выше всё написано, почему угол скачит |
|||
![]() |
|
||||
Цитата:
Как вектор может быть определен одной цифрой? И в описании DXF кодов что написано? Цитата:
Цитата:
Я краем своих извилин что-то припоминаю, что на практике, чтобы избежать операций связанных то ли с умножением на 0, то ли с делением, в каждом случае положения нормали дают прибавку к углу поворота. Эта прибавка потом вычитается при необходимости. Я покрутил текст и вычислил. Если нормаль двигать строго по осям X или Y - нижняя дуга - 0, левая - 90 градусов, правая - 270 и верхняя 180. А вот в промежутках - пока не догнал принцип. Последний раз редактировалось Supermax, 26.11.2009 в 19:37. |
||||
![]() |
|
||||
Supermax,
1. без матриц нельзя описать поворот в 3д. 2. а если все это проделать не с многострочным текстом, а с другим примитивом, например блоком? Цитата:
По поводу многострочного текста, я уже говорил, сначала сделай, чтоб при зеркалировании, текст отображался зеркально, а потом рассказывай про эксперименты с текстом - автокад пытается правильно отобразить текст...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 26.11.2009 в 19:33. |
||||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
DXF пара 50 - это угол чистого вращения (тот самый "от Эйлера").
Система координат объекта (СКО, она же OCS) представляет собой следующее: 1. Начало совпадает с 000 МСК. 2. Направление Z совпадает с вектором нормали из 210 пары. 3. Ось X всегда лежит в плоскости XY МСК, а её направление вычисляется, как векторное произведение оси Z МСК и вектора нормали объекта. Т.е мысленно вращаем кратчайшим образом Z МСК до совпадения с вектором нормали и по правилу правого винта получаем направление X СКО. 4. Ось Y CКО однозначно определяется через Z и X так, чтобы образовалась правая тройка векторов. Вот и вся математика. Теперь пример. Возьмем текст, лежащий в плоскости XY МСК с нулевым углом поворота (чистого вращения). Если его "взять" за конец нормали и слегка "наклонить влево" то оси СКО изменят свое направление. Ось Z - это нормаль, которую мы "слегка наклонили влево". Ось X вычисляется как векторное произведение (Z МСК * нормаль) и смотрит в данном случае строго вниз ( -Y МСК). В этой новой системе координат объекта текст оказывается повернут относительно оси X СКО на 90 градусов. Поэтому и в паре 50 оказывается новое значение согласованное с новой СКО.
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>3. Ось X всегда лежит в плоскости XY МСК, а её направление вычисляется, как векторное произведение оси Z МСК и вектора нормали объекта
не совсем так, используется arbitrary axis algorithm. углы Эйлера удобны когда надо делать интерполяцию вращения. всерано когда надо конкретно считать - их прибется переводить в матричную форму Последний раз редактировалось zamtmn, 26.11.2009 в 19:54. |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Цитата:
Цитата:
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
Pastor, О! Это уже конкретный базар пошел! Жму пять!
Буду завтра разбираться и тщательно вникать. zamtmn, с твоими мат. примерами тоже. Тебе тоже спасибо за помощь. Елпанов Евгений, Цитата:
Всегда, поворачивая объект вокруг нормали, надо считывать существующий угол и прибавлять к нему нужное значение поворота, а не заменять тупо одно на другое. Ладно, на сабантуй прийду с ноутбуком. Там и пообщаемся. 19-00 буду. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>В этом особом случае СКО принимается совпадающим с МСК и считать
>>ничего не требуется. Так же особым является случай, когда нормаль >>противонаправлена оси Z МСК. Тогда ось X СКО надо принять (-1, 0, 0) . А если нормаль чуть чуть отличается от 0,0,1 ну совсем чуток чуть больще чем погрешность. Получится что Вы перемножите почти паралельные вектора и результат будет неверным. поэтому делается так: Цитата:
|
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Цитату не понял. Равно как и не понял проблему.
Вот функция, вычисляющая векторное произведение. Если результат слишком близок к (0 0 0), то функция принимает решение, что вектора коллинеарны и возвращает nil. Код:
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Цитату не понял. Равно как и не понял проблему.
Вы говорите что: Цитата:
"близкой" = X и Y нормали < 1/64. конечно в жизни такие нормали бывают не часто, но бывают |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Признаю свою ошибку.
AutoCAD вводит четко определенные правила при вычислении СКО для векторов нормали близких к оси Z МСК. Как указывал выше zamtmn, всё описано в acad_dxf.chm. Кстати, число 1/64 не такое уж и маленькое. В пересчете на градусы отклонения от Z МСК это между 0.8 и 0.9. >>zamtmn Спасибо за вашу настойчивость. Лоб то у меня медный ![]()
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
Вставлю свои пять копеек.
Замечу, что функция перемножения векторов никогда, подчеркивю НИКОГДА не должна возвращать nil! Если вектора практически слились в одну линию, то надо чтобы функция все равно возвращала какой-то вектор. В частности, если мы перемножаем нормаль на вектор Z МСК, то функция вырождается в: Код:
Результирующий вектор должен быть перпендикулярен нормали. То есть он лежит в плоскости XY МСК, но перпендикулярен и оси Z МСК и нормали одновременно. Тогда мне понятно как отложить угол от этого вектора к оси X СКО. Y равна перевернутому X нормали, а X - Y нормали. Получается 90 градусов. Вот так - правильно! Смущает одно, надо продлевать значения X и Y результирующего вектора до точки на единичной окружности. Чтобы функция не бесконечно малые числа возвращала, а путевый единичный вектор. Последний раз редактировалось Supermax, 29.11.2009 в 22:30. |
||||
![]() |
|
||||
Supermax, Действительно, невнимательно смотрел код...
В данном случае, я хотел сказать - если необходимо всегда давать вектор - значит надо давать, но это не значит, что при ошибке всегда давать какой то заранее заданный. Такой подход, в будущем приведет к очень сложно находимым ошибкам...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Остается вместо nil вставить вектор. (1.0 0.0 0.0)?
вообщето для паралельных векторов результат долженбыть (0.0 0.0 0.0) по определению векторного произведения. разруливать паралельность нужно вызывающей программой, а не программой умножения. |
|||
![]() |
|
||||
Я считаю, что надо сначала сравнивать векторы на паралельность, а потом решать что с этим делать. И как узнать при каких обстаятельствах и как определить паралельны они или нет?
Функция не доработана. А надо. Очень надо вычислять точку пересечения прямой и плоскости. Плоскость по трем точкам, а прямая по двум. Последний раз редактировалось Supermax, 03.12.2009 в 14:48. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
универсальный способ проверить на паралльность - посчитать векторное произведение
>>Очень надо вычислять точку пересечения прямой и плоскости. Плоскость по трем точкам, а прямая по двум. вся необходимая математика: http://algolist.ru/maths/geom/index.php перекатать это на лиспе думаю труда не составть Последний раз редактировалось zamtmn, 03.12.2009 в 15:40. |
|||
![]() |
|
||||
Чтобы туда-сюда не лазить сюда перенес суть.
Цитата:
Код:
Ладно, переделываем функцию перемножения на классику. Код:
Код:
Последний раз редактировалось Supermax, 03.12.2009 в 17:57. |
||||
![]() |
|
||||
проверить параллельность двух плоскостей можно проще, по векторам:
Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>дальше застрял. Угол между векторами надо найти.
дальше не нужно угол искать. нужно поюзать гугл и посмотреть определение скалярного произведения. можно вот так посчитать: Цитата:
|
|||
![]() |
|
||||
О! Штангенциркуль в ход пошел! (...inters...)
![]() Но я вот по поводу угла между векторами хочу спросить, я правильно функцию наваял? Код:
http://www.bymath.net/studyguide/alg/sec/alg25.html Гугл уже поюзал и именно скалярное произведение требует косинуса угла между векторами. Немного недоглядел. Исправил. Хорошо, что атомную станцию не считаю. Последний раз редактировалось Supermax, 03.12.2009 в 17:49. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Гугл уже поюзал и именно скалярное произведение требует косинуса угла между векторами.
нет, если в руках транспортер а на ватмане 2 вектора - считают через косинус. если извесны координаты, то x1*x2 + y1*y2+z1*z2, а заодно потом через него (скалярное произведение) и угол между векторами найти можно |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, про паралельность я спрашиваю с точки зрения требуемой точности для автокада. Вот какие две, якобы паралельные линии считаются таковыми в Автокаде? Скажем на расстоянии в километр какая дельта х y z может быть?
Вот при каких значениях нормали Автокад автоматически разворачивает ось ПСК объекта в 1,0,0? Я считаю, что именно такое значение расхождения в паралельности и нужно закладывать в функцию как "крайний рубеж". Ну что такое -12 степень? А может -16 сглотнет? Нет точных данных. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>с точки зрения требуемой точности для автокада
В автокаде точность настраивается, такчто или получить ее значение, или забить и использовать свою точность цитата из "дубового" перевода документации по arx: Цитата:
|
|||
![]() |
|
||||
Я это понимаю, но ответ на мой вопрос
Цитата:
Вы понимаете, что надо насильно в функцию перемножения векторов вставлять это дело? Потом, результат перемножения укорачивает результирующий вектор и дальнейшее использование этих данных вынуждает работать с очень маленькими значениями, что ухудшает погрешность дальнейших вычислений. В функцию надо вставить вычисление точки отложенной от 0,0,0 в строну результирующего вектора длинною 1мм. Это и будет возвращаемое значение функции. И это функция уже не перемножения векторов, а определение вектора оси Х ПСК (промежуточной системы координат). Люди, VVA, ну граблями я функции пишу. Что вам стоит пару строчек черкнуть? И функцию пересечения плоскости прямой тоже надо дописать, ведь все уже есть! Я чего бъюсь? - мне надо подрезать слейсом 3Dсолид и восстанавливать, а точнее переписывать историю. Чтобы всегда можно было узнать длинну объекта, не зависимо от того, сколько дырок вы в нем насверлили или как подрезали. Изначально считаем, что все 3D солиды имеют свои истории. Читам историю, смотрим осевую 3Dсолида, вычисляем точку пересечения с плоскостью реза, замеряем длинну, которая остается и после реза записываем новые данные точки вставки, длинны осевой и координат. Хочу чтобы слейс и мувфасес не убивали историю. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Вы понимаете, что надо насильно в функцию перемножения векторов вставлять это дело?
зачем? надо заранее смотреть и не перемножать паралельных векторов используя Цитата:
Последний раз редактировалось zamtmn, 04.12.2009 в 12:14. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
То же что сказал и zamtmn (если я правильно понял)
1. Вычисляешь единичный вектор 2. Сравниваешь точность по X,Y,Z Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Кто-то из нас видимо что-то не понимает.
zamtmn, я с тобою полностью согласен, что надо проверять на паралельность ДО того. Но как проверять. Функции VVA на паралельность может и подойдут, если они действуют в соответствии с Цитата:
И в Автокаде надо 1,0,0 вместо нее ставить! Результат перемножения векторов должен быть вектор! ![]() Кто-нибудь напишет НОРМАЛЬНУЮ функцию перемножения векторов? Чтобы и проверка на паралельность, точность и единичный вектор возвращала? Сколько можно одно и то же мусолить? Давайте делать! |
||||
![]() |
|
||||
Цитата:
Для параллельных векторов, при перемножении нельзя выдавать что нибудь. Это как сделать свою функцию деления, в которой при делении на ноль, всегда возвращалось бы какое либо заранее заданное число...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Елпанов Евгений, ну вроде тоже верные мысли, но как быть?
Придется закинуть эту математику к .. фене и сделать самим Автокадом методом штангенциркуля. Так я это уже и сделал! См. http://forum.dwg.ru/showpost.php?p=480556&postcount=24 Вот как сам автокад этот ежик повернул - так тому и быть! Какая там точность?, Какая паралельность? - Все в тумане, но выше этого уже никакой математикой не прыгнешь! |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Кто-нибудь напишет НОРМАЛЬНУЮ функцию перемножения векторов?
>>Чтобы и проверка на паралельность, точность и единичный вектор >>возвращала? Сколько можно одно и то же мусолить? Давайте делать! Ну ты упертый чувак)) в функции перемножеения должно быть только перемножение. Ничего другого пихать туда нельзя - это будет уже другяю программа реализующая какойто свой алгоритм на основе умножения. предположим ты считаешшь ск объекта: используй arbatrary axis - результат будет коректен, всё развернется как надо его смысл какраз в том чтобы не перемножить паралельные вектора. или ты считаешь нормаль плоскости заданной тремя точками: если векторное произведение вернуло (0,0,0) значит точки на одной прямой и плоскостей описываемых ими много. выбрать какуюто одну плоскость - это уже твое дело, а не процедуры умножения. Елпанов Евгений дело говорит, подправлять под свои хотелки математическую функцию и называть это "НОРМАЛЬНУЮ функцию перемножения векторов" - вредительство))) (0,0,0) почему не вектор? нормальный вектор нулевой длины. |
|||
![]() |
|
||||
Да бог с ним, не надо мне уже ничего перемножать.
Я только наведу маленько тень на плетень и пойду. 1/64=0.015625 это дельта 15,625 миллиметров на метр. С такой точностью можно и локтями измерить. ![]() Автокад устанавливает точность на много-много порядков больше. Так что 1/64 - мягко говоря туфта. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
1/64 - это не точность
это граница на которую может отклониться нормаль от 0,0,1 если отклонено больше - считаем 0x = Wz X N (т.е. нормаль не близка (не паралельна) к 0,0,1) если меньше - 0x = Wy X N (т.е. нормаль близка (паралельна) к 0,0,1) Это не предел для прощедуры векторного умножения, а условная граница переход через которую сдваигает 0x объекта. Наверно когдато давно, когда компы были большими а точность вычислений маленькой - 1\64 было близко к пределу влияющему на точность, сейчас нет. Просто так повелось Последний раз редактировалось zamtmn, 04.12.2009 в 14:44. |
|||
![]() |
|
||||
Supermax, Все, замяли с умножением векторов!
![]() Вспоминаю код, явно писали инудсы... Видимо у них постоянно вылетала ошибка деления на ноль, так они в куче мест программы, все нули меняют на 1е-8. Стоит один раз запустить такую программу в чертеже и работать с ним становится невозможно - заменяются нули в 10 и 210 кодах dxf. ой, забыл самое главное - еще все углы во всех примитивах (дуги, тексты итд...)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 04.12.2009 в 15:17. |
||||
![]() |
|
||||
Александр Ривилис, наводить тень на плетень тоже нужно, иначе в мозгах застой образуется. Точнее в ваших мозгах, а в моем он не образуется, он там постоянно прописан.
zamtmn, не знаю как там повелось, но 1/64 и 1е-12 вещи настолько разные, что как-то не верится, что спецы AutoDesk при < 1/64 считают вектора паралельными. А я еще и 1е-16 и 1е-18 видел. Елпанов Евгений, а вот тут я не догнал чуток. "округляются нули" ты говоришь, что они 0 заменили на 1е-8, какое это округление? Цитата:
Завязать с перемножением не получится. Я забыл, что есть благородная задача написать функцию получения координат точки на линии, пересекающей плоскость. А там перемножение - основа. |
||||
![]() |
|
||||
Supermax, извини, описался...
Имел в виду, что в начале работы программы, сканируется весь чертеж и в кодах 10 11 210 50 и возможно еще каких то, все нули меняются на 1е-8
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Ну тогда я понимаю, 1е-8 это уже не 1/64, но тем не менее тоже не сахар.
И вообще, разозлися не на шутку. Провел линию в 100 метров! и повернул ее на 0.00015 радиан, а вектор отклонил (210 -0.00015 0.0 1.0)) по Х на 15 миллиметров на 100 метрах! Ну и где ваши 1/64? Вы посмотрите, в 210 паре даже е-хх не появилось, а оно там бывает, будьте уверены! Вот, подправил 1 миллиметр на 100 метрах (210 -1.0e-005 0.0 1.0) и тоже все в шоколаде. Последний раз редактировалось Supermax, 04.12.2009 в 15:29. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
1\64 ни как на ТОЧНОСТЬ вычислений не влият. прими они 1\32 все было бы также, угол бы скакал чуток позже, но всё по прежнему вращалось бы также корректно.
>>что спецы AutoDesk при < 1/64 считают вектора паралельными это сделано чтоб не множить паралельные вектора, но это не значит что считают что они паралельны. на месте 1\64 должна быть какаято цифра почему ты думаешь что 1\64 много? |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Я думаю 1/64 много? Да я думаю это очень-очень мало! Раз так в 100000
т.е. надо (1\64)*100000=1562,5? или мало в смысле много)))? кароче, пример расчета ox в цифрах 1) отклонение меньше 1\64,например нормаль = (-9,9999999995e-06, 0, 0,99999999995) Код:
Код:
в каком месте 1\64 повлияла на точность? нормаль как была так и осталась, ниче не округрилось Последний раз редактировалось zamtmn, 05.12.2009 в 00:50. |
|||
![]() |
|
||||
Самое пресамое что у нас есть по перемножению векторов это
Код:
Но мне настойчиво предлагают не перемножать вектора если их координаты X Y отличаются от 0 на < 0.015625. Если последовать этому совету, то у меня на расстоянии в 1 метр уже не совпадут полученные координаты на 15,625 мм с требуемым значением. Функция VVA C:TEST должна с моей точки зрения выглядеть так: Код:
Далее, я конечно понимаю, что истина дороже, и длинна полученного вектора, хоть и близка по размерам к точке, но она натуральна, но стоит этот вектор вытянуть до орбиты единичной окружности и что? X Y уже могут и не попасть под шаблон 1е-12. Я считаю, что надо забыть про формулировку "перемножение векторов" и принять формулировку "получение единичного вектора результата перемножения векторов". В эту функцию по перемножению надо вставить функцию VVA pl-geom-single-vector и только после нее сравнивать на 1е-12. Код:
Но это для Автокада! А для функции получения точки на прямой пересекающей плоскость, может надо оставить все как есть. zamtmn , надо 1/6400000 если не больше (в смысле меньше) Еще, вот есть у нас два вектора, их надо перемножить, от их длинны зависит результат перемножения? Я думаю да. А результат нам нужен для чего? Почему все время фигурирует понятие "вектор"? Если нам нужны длины отрезков, а не направления этих отрезков, так давайте так и говорить. А если нам нужны точные направления, так давайте умножим длины исходных векторов на миллион и потом посчитаем результат. Я бъюсь за точность направления, а за длинну имеет смысл биться только если она имеет значение при расчетах. Взял функцию VVA parallelp и проверил на паралельность два отрезка длинной в 100000 мм один из которых повернут на 1 мм на 100м и она ответила nil, что означает, что они не паралельны. Все, мозг мой усох совсем. Последний раз редактировалось Supermax, 04.12.2009 в 18:23. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Самое пресамое что у нас есть по перемножению векторов это
вполне нормальная функция. >>здесь установлена точность 1e-12, что хоть и не обосновано (ну, типа мне никто так и не обосновал) а что тут обосновывать? принята и всё, в жизни с такими величинами работать редко приходится >>Но мне настойчиво предлагают не перемножать вектора если их координаты X Y отличаются от 0 на < 0.015625. так принято в автокаде с незапамятных времен, хочешь сам считать СК объекта придется делать также. >>Еще, вот есть у нас два вектора, их надо перемножить, от их длинны зависит результат перемножения? конечно зависят, насколько помню длина результата - площадь паралепипида образованного исходными векторами. но это используется очень редко, заметь результат всегда нормализуется, в данном и большинстве случаев нам важно только направление вектора |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Когда считаешь ск - да, делаешь по ARBITRARY AXIS ALGORITHM.
В других случаях - нет, умножаешь если =ноль паралельны, нет - всё ок, получили нормаль. Когда считаешь плоскость по 3м точкам точки обычно заведомо берутся не на прямой. если уж получилось что точки на прямой - проверяй, не проверяй а однозначно плоскость через них никак не провести Когда считаешь ск объекты часто выровнены по осям, соответственно нужно проверять. есть 2 варианта расчета 1 - через YWCS, 2 - через ZWCS + четко установлена граница - 1\64, когда какой использовать. Последний раз редактировалось zamtmn, 05.12.2009 в 01:03. |
|||
![]() |
|
||||
Вот так всегда. Ни да, ни нет. Для функции вычисления точки на прямой, пересекающей плоскость, надо векторы на паралельность проверять, или нет?
Сейчас попытаюсь ее доделать. Мы, товарищи, пойдем своим путем! Функция получения точки на отрезке (прямой), пересекающий плоскость. Код:
Принцип прост, до слез. Немного пришлось функцию VVA покрамсать. Добавил один аргумент, чтобы вычислять координаты от любой, произвольной точки. Код:
Последний раз редактировалось Supermax, 07.12.2009 в 14:32. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Вот так всегда. Ни да, ни нет. Для функции вычисления точки на
>>прямой, пересекающей плоскость, надо векторы на паралельность >>проверять, или нет? какие? ты читаешь че тебе пишут? >Мы, товарищи, пойдем своим путем! своих путей в этой области нет. всё давно придумано до нас сейчас ты плоскость задаешь нормалью и точкой. Т.е. ты автоматически считаешь что векторное произведение из задания плоскости тремя точками не равно 0. а проверить на перпендикулярность нормаль плоскости и направление прямой не помешает)) удобнее плоскость задавать нормалью и "высотой" т.е. стандартное уравнение Ax + By + Cz + D = 0. (A,B,C) - нормализованная нормаль плоскости. тогда процедура нахождения пересечения будет выглядеть примерно так: Код:
Последний раз редактировалось zamtmn, 07.12.2009 в 02:03. |
|||
![]() |
|
||||
Я всегда задаю плоскость нормалью и точкой - для меня плоскость является еще и системой координат...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
zamtmn,
Цитата:
У нас есть исходные данные, а именно: Три точки, описывающие плоскость. (можно тупо заменить на нормаль и точку и оставить своим потомкам ломать голову как ее получить). Эти точки могут все три иметь одно и то же значение, что, надо проверять, или нет? Если пользователь три раза ткнул в одну и ту же точку, то что должна выдать функция? Я думаю ЕГОР. Так она и так его выдаст. Если две точки одинаковые, то значит, что пользователь или его тупой программный продукт два раза ткнул в одну и ту же точку. Что должна вернуть функция? - Конечно ЕГОР! Так она его и так выдаст в этом случае. Все три точки разные, а если нет - ЕГОР. Вот и все. А если точки разные - то мы можем смело перемножать АВ на ВС. Далее: Ваша функция хромает одним местом, а именно константой D. Ее надо вычислять, а если ее вычислять, то максимум на что мы можем расчитывать, так это на проекцию на плоскость, а не на пересечение. Вот в моей функции есть хомут, но его никто пока не заметил. Я его сейчас подправлю. Подправил. Функция, возвращающая угол между двумя векторами в градусах. (от точки 0,0,0) Код:
Последний раз редактировалось Supermax, 07.12.2009 в 18:15. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Елпанов Евгений
Тогда больше похоже на "я всегда задаю ск нормалью и точкой, она для меня еще и плоскость". почти во всех расчетах на плоскость D присутствует, ты так или иначе ее считаеш. если важна "точка начала коорбинат" то конечно, но в обычном понимании плоскости этой точки нет. Supermax >>векторы, которые мы собрались перемножать. Опять какие? нет, вернет 0 или NIL что тебе удобней, вот и проверка - нормали для этих векторов нет. >>Все три точки разные, а если нет - ЕГОР. Вот и все. все 3 точки не лежат на одной прямой, а если нет - ЕГОР. Вот и все. >>А если точки разные - то мы можем смело перемножать АВ на ВС. можем смело перемножать даже одинаковые |
|||
![]() |
|
||||
zamtmn, все просто, у меня тоже, часто рождается эта плоскость из трех точек. Делаем из них два вектора и перемножаем их - получаем нормаль, потом берем любую из этих трех точек и называем ее базовой точкой - для случая нахождения пересечения линии и плоскости - достаточно...
ps. Появится немного свободного времени, оформлю для сайта несколько базовых функций для 3д преобразований, из своих частных запасов.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Когда-то по этому адресу была выложена библиотека функций на lisp. 3d_polarp - одна из них. Вот еще одна (не проверял)
Код:
Во вложении все, что я скачал в свое время.
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 08.12.2009 в 16:52. Причина: Обновил readme.txt во вложении |
|||
![]() |
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
вот описание всего, что было выложено по вышеуказанному адресу
Цитата:
|
|||
![]() |
|
||||
Вот это, да!
![]() Надо уже в библиотеку функций это все перенести. Ну почему так всегда, бъешся, бъешся, никто ничем помочь не может (или не хочет), а стоит наконец-то сделать и выложить, так сразу оказывается, что у всех все есть. Ну где вы раньше были? ![]() |
||||
![]() |
|
||||
Supermax, Во многих темах, тебе пытались объяснить, что библиотечные функции должны быть универсальными, а не такими, как тебе нужно в данный конкретный момент. И еще, универсальность, это не значит, что делает все кроме кофе. Универсальность, это когда выполняет одну операцию, но качественно.
ps. только без обид - я не хочу обидеть!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
А я тупой. Вот никак не могу понять, какого фига мне таскать за каждой лиспиной целую библиотеку. И мне не понятно, почему нельзя сделать такую библиотеку, чтобы я мог просто черпать идеи, а не готовые простыни, где текста порой больше самого кода. Все равно при компиляции весь этот мусор выбрасывается.
И погодите, такое складывается впечатление, что это я администратор форума и главный распорядитель библиотеки функций. Что вы меня обвиняете, что идея с библиотекой не пошла как следует? Она пошла, но не так как хотелось бы. И это не я ее загубил. Просто было несколько подпорок, а они почему-то время от времени куда-то отлучаются и конструкция шатается. Она не упала. Это я малость передернул. Вот классический пример: VVA написал функцию, которая считает все в треугольнике. http://forum.dwg.ru/showthread.php?t=15697 А мне не надо это все, мне только один угол надо. И то, я его вместе с другими задачами решаю. Мне надо принцип понять и свои задачи решить более совершенно. А тут функция а ссылается на функцию б, та на с, та на д и т.д. Смотрю на код и не понимаю как он работает. И вообще, мое мнение, это мое мнение. Причем тут библиотека? |
||||
![]() |
|
||||
Supermax, я в свое время, тоже предлагал сделать не библиотеку функций, а библиотеку алгоритмов...
ps. несколько функций из библиотеки: проверка двух поверхностей, что они лежат на одной плоскости (совпадают) Код:
Код:
Код:
Код:
Код:
Функция вычисления вектора нормали по двум векторам Код:
Функция вычисления вектора нормали по двум векторам Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 08.12.2009 в 16:31. |
||||
![]() |
|
||||
Как нибудь соберусь с духом и подправлю первый пост. Что-то очень много одинаковых по назначению функций собралось. Надо выбрать самые красивые.
А библиотеку функций надо просто модернизировать. Как? - пока не знаю. Есть очень интересная задача, связанная, между прочим, с 1 DXF кодами солидов ![]() Есть пространство, в нем куча точек, точнее мы имеем список списков точек с их координатами. Надо найти две самые удаленные друг от друга точки. Если таких больше двух - nil |
||||
![]() |
|
||||
опять применительно к частностям? Если есть облако точек и три находятся на одинаковом и максимальном расстоянии, то надо либо вернуть одну пару, те. только две точки, либо все три пары! Случай, когда информация уже не нужна - частный случай, который подходит для твоей конкретной задачи. Хотя, на основе основного кода, можно сделать функцию проверки - сколько пар найдено...
Какой подарок?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Да я скромно, так,
![]() ![]() А про подарок - http://dwg.ru/dnl/4451 Забыл? А я расколупал. Сделал функцию, которая считает длинну цилиндра, даже если ты его порезал с обеих концов и дырок в нем насверлил. Правда я дырок не сверлю, и наискосок почти никогда не режу, но солидами трубы делаю. Мне надо для исполнительной длинну каждой. И оси в них линиями делать. Вот тут ты мне помог! Низкий мой поклон. Без этой инфы - как без рук был. ![]() Могу выложить в новой теме для освистания. А смысл следующий. Есть установка, что облако точек делится на две группы. Одна - все точки в одной плоскости, а другая - в другой. Расстояние между этими плоскостями и есть искомый результат. Надо определить наличие таких плоскостей, а они есть и даже вектора к ним есть, все точки к ним уже приписаны. Осталось только как-то расстояние между плоскостями замерить. Точки по плоскости разбросаны, но каждая имеет пару на противоположной. Грубо говоря, солид имеет несколько плоскостей и надо замерить длинну у тех, которые самые маленькие по площади, или площадь уже известна, в виде аргумента функции дается. Последний раз редактировалось Supermax, 08.12.2009 в 19:52. |
||||
![]() |
|
||||
Ааа, ну тогда ладно...
Просто все представленные мной, в этой теме, функции - настоящий оффтоп! Там никакой тригонометрии и даже линейной алгебры. Максимум - перемножение векторов...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Цитата:
Цитата:
дергать информацию из солидов - всеравно что распечатать чертеж а потом оцифровывать и мерить длины. охота объемных труб - добро пожаловать в МЕП |
|||
![]() |
|
||||
Спасибо zamtmn, я понял про облако точек. Supermax, ты что, не стал разбираться с солидами, а просто вытащил оттуда точки и пытаешься восстановить размеры цилиндров? Я то думал, ты действительно разобрался с описанием трехмерных тел - там не так сложно, тем более, если только цилиндры, а получилось, ты научился извлекать точки и придумал, что делать дальше. Если ты действительно разберешься с описанием формата - будет проще и точнее. А задачку про облако точек - оставим студентам...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Вы как террористы. Народ конкретикой озабочен (я в смысле), а вы его на научные подвиги толкаете.
Вот стала у меня задача колом в горле, я ее и решил. Да что там решать? В цилиндре всего две плоскости с радиусом Код:
Вторые три - x,y,z нормали плоскости Третьи три - x,y,z вектор-радиуса потом коофициент элипсности (или как там его) А все остальное - пока подождет. Если в трубе "штаны" не вырезать и прямоугольным профилем пазы не резать - больше ничего колупать не надо. Если трубу сделать полую, то четыре ellipse-curve. Два с одним радиусом, а два с другим. Посортировал по радиусам и баеньки. Все остальное - ЕГОР и на помойку. Если я буду в эти английские письмена тщательно вчитываться - помру. p.s. Между прочим, я не для себя хочу задачку решить, а для народа, который прокатом озабочен. p.s.2 Изучая эти ...curve заметил интересную особенность. Оказывается есть 0 и есть -0 и это не спроста. Вот тут и почитать не грех. Последний раз редактировалось Supermax, 08.12.2009 в 21:17. |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рифмоплетство. | 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 |