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

Вернуться   Форум 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.
Просмотров: 42495
 
Автор темы   Непрочитано 03.12.2009, 17:29
#101
Supermax

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


О! Штангенциркуль в ход пошел! (...inters...) Зачем в самом деле париться, если Автокад может пособить.

Но я вот по поводу угла между векторами хочу спросить, я правильно функцию наваял?

Код:
[Выделить все]
(defun ugol-vector (a b)
(/ 10 (* (sqrt (apply '+ (mapcar '(lambda (f) (* f f)) a))) (sqrt (apply '+ (mapcar '(lambda (f) (* f f)) b)))))
)
вот формулы cos(a^b) в самом низу.
http://www.bymath.net/studyguide/alg/sec/alg25.html

Гугл уже поюзал и именно скалярное произведение требует косинуса угла между векторами.

Немного недоглядел. Исправил. Хорошо, что атомную станцию не считаю.

Последний раз редактировалось Supermax, 03.12.2009 в 17:49.
Supermax вне форума  
 
Непрочитано 03.12.2009, 17:43
#102
zamtmn

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


>>Гугл уже поюзал и именно скалярное произведение требует косинуса угла между векторами.
нет,
если в руках транспортер а на ватмане 2 вектора - считают через косинус.
если извесны координаты, то x1*x2 + y1*y2+z1*z2, а заодно потом через него (скалярное произведение) и угол между векторами найти можно
zamtmn вне форума  
 
Непрочитано 03.12.2009, 17:43
#103
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
И как узнать при каких обстаятельствах и как определить паралельны они или нет?
Код:
[Выделить все]
;;; PARALLELP
;;; Evaluates if p1 p2 segment is parallel to p3 p4 segment
;;;
;;; Arguments = 4 points
(defun parallelp (p1 p2 p3 p4)
  (and
    (not (inters p1 p2 p3 p4 nil))
    (or    (inters p1 p4 p3 p2 nil)
    (inters p1 p3 p4 p2 nil)
    )
  )
)

;;; PERPENDICULARP
;;; Evaluates if p1 p2 segment is perpendicular to p3 p4
;;;
;;; Arguments = 4 points
(defun perpendicularp (p1 p2 p3 p4)
  (equal (vxv (vec1 p1 p2) (vec1 p3 p4)) 0 1e-8)
)
Добавлено
Код:
[Выделить все]
; Угол между векторами (скалярное произведение векторов)
;---------------------
;Параметры:
;Wekt1, Wekt2 - вектора
;Возвращает  угол между векторами
;http://www.elecran.com.ua/index.php?pagename=programer.php
(defun 3d_angw1w2 (Wekt1 Wekt2 / CosA)
 (if (equal (setq CosA (/ (apply '+ (mapcar '* Wekt1 Wekt2))
			  (distance '(0 0 0) Wekt1) (distance '(0 0 0) Wekt2))) -1.0 1e-6)
  Pi
  (if (equal CosA 0.0 1e-6) (* 0.5 PI)(atan (sqrt (- 1 (* CosA CosA))) CosA))
 )
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.12.2009, 18:05
#104
Supermax

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


VVA, про паралельность я спрашиваю с точки зрения требуемой точности для автокада. Вот какие две, якобы паралельные линии считаются таковыми в Автокаде? Скажем на расстоянии в километр какая дельта х y z может быть?
Вот при каких значениях нормали Автокад автоматически разворачивает ось ПСК объекта в 1,0,0?
Я считаю, что именно такое значение расхождения в паралельности и нужно закладывать в функцию как "крайний рубеж".
Ну что такое -12 степень? А может -16 сглотнет? Нет точных данных.
Supermax вне форума  
 
Непрочитано 03.12.2009, 21:53
#105
zamtmn

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


>>с точки зрения требуемой точности для автокада
В автокаде точность настраивается, такчто или получить ее значение, или забить и использовать свою точность
цитата из "дубового" перевода документации по arx:
Цитата:
Допуски
Много методов принимают значение допуска как один из их параметров. Это значение имеет AcGeTol класс и всегда имеет значение по умолчанию, как определено в AcGeContext:: gTol. Функции типа isClosed () и isPlanar () вычисляют,являются ли точки начала и оконечные точки в пределах определенного допуска перед возвращением Булева значения. Вы можете изменять допуск для одного специфического функционального запроса, или Вы можете изменять глобальное значение допуска.
AcGeTol класс обеспечивает две функции для установки допуска для точек и векторов:

void
setEqualPoint(double);

void
setEqualVector(double);

AcGeTol класс также обеспечивает две функции для получения допуска для точек и векторов:

double equalPoint() const;
double equalVector() const;

EqualPoint и equalVector значения допуска используются следующим образом:
 Две точки, p1 и p2, являются равным если
( p1 - p2) .length () < = equalPoint
 Два вектора, v1 и v2, являются равным если
( v1 - v2) .length () < = equalVector
 Два вектора, v1 и v2, являются параллельным если
( v1/v1.length () - v2/v2.length ()) .length () < equalVector
ИЛИ (v1/v1.length () + v2/v2.length ()) .length () < equalVector
 Два вектора, v1 и v2, являются перпендикулярным если
abs((v1.dotProduct(v2))/(v1.length()*v2.length())) < = equalVector
 Две линии или лучи - параллельный (перпендикуляр), если их направленные векторы - параллельный (перпендикуляр)
 Две линии равен, если точки в параметре 0 равны, и их направления равны

ОБРАТИТЕ ВНИМАНИЕ, что эти правила подразумевают, что две линии - близко к друг другу как точечные множества в части пространства моделирования диаметра diam только, если допуск equalVector установлен более плотным чем equalPoint/diam.
zamtmn вне форума  
 
Автор темы   Непрочитано 04.12.2009, 11:34
#106
Supermax

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


Я это понимаю, но ответ на мой вопрос
Цитата:
Вот при каких значениях нормали Автокад автоматически разворачивает ось ПСК объекта в 1,0,0?
так и не получен. Допустим я могу загрубить точность расчета (неплохо бы узнать как) это повлияет на этот разворот?
Вы понимаете, что надо насильно в функцию перемножения векторов вставлять это дело?
Потом, результат перемножения укорачивает результирующий вектор и дальнейшее использование этих данных вынуждает работать с очень маленькими значениями, что ухудшает погрешность дальнейших вычислений.
В функцию надо вставить вычисление точки отложенной от 0,0,0 в строну результирующего вектора длинною 1мм. Это и будет возвращаемое значение функции. И это функция уже не перемножения векторов, а определение вектора оси Х ПСК (промежуточной системы координат).
Люди, VVA, ну граблями я функции пишу. Что вам стоит пару строчек черкнуть?
И функцию пересечения плоскости прямой тоже надо дописать, ведь все уже есть!

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

Хочу чтобы слейс и мувфасес не убивали историю.
Supermax вне форума  
 
Непрочитано 04.12.2009, 12:00
#107
zamtmn

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


>>Вы понимаете, что надо насильно в функцию перемножения векторов вставлять это дело?

зачем? надо заранее смотреть и не перемножать паралельных векторов
используя
Цитата:
If (abs (Nx) < 1/64) and (abs (Ny) < 1/64) then
Ax = Wy X N (where “X” is the cross-product operator).
Otherwise,
Ax = Wz X N.
Scale Ax to unit length.
ты гарантированно не перемножишь паралельные вектора при расчете ск объекта

Последний раз редактировалось zamtmn, 04.12.2009 в 12:14.
zamtmn вне форума  
 
Непрочитано 04.12.2009, 12:21
#108
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


То же что сказал и zamtmn (если я правильно понял)
1. Вычисляешь единичный вектор
2. Сравниваешь точность по X,Y,Z
Код:
[Выделить все]
(defun pl-geom-single-vector (Vekt)
;;; Вычисление орта (единичного вектора)
;;;-------------------------------------
;;;;Параметр: Vekt - любой вектор
;;; Возвращает: Единичный вектор
((lambda (l)
     (if (not(equal 0.0 l 1e-6))
       (mapcar (function (lambda (x) (/ x l))) Vekt)
     )
   )
    (distance '(0 0 0) Vekt)
  )
  )
Пример
Код:
[Выделить все]
(defun C:TEST ()
  (setq FUZZ (/ 1. 64)) ; точность
  (setq vect '(100 100 10000)) ;_Вектор
  (setq ort (pl-geom-single-vector Vect)) ;_Орт
  (if (and ;_см zamtmn
	  (< (abs(car ort)) FUZZ)
	  (< (abs(cadr ort)) FUZZ)
       )
  (alert "Меньше точности 1/64")
  (alert "OK")
    )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.12.2009, 13:40
#109
Supermax

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


Кто-то из нас видимо что-то не понимает.
zamtmn, я с тобою полностью согласен, что надо проверять на паралельность ДО того. Но как проверять. Функции VVA на паралельность может и подойдут, если они действуют в соответствии с
Цитата:
If (abs (Nx) < 1/64) and (abs (Ny) < 1/64) then
Ax = Wy X N (where “X” is the cross-product operator).
Otherwise,
Ax = Wz X N.
Scale Ax to unit length.
Но черт побери! вектора 0,0,0 не существует в природе! Это точка!
И в Автокаде надо 1,0,0 вместо нее ставить! Результат перемножения векторов должен быть вектор!
Кто-нибудь напишет НОРМАЛЬНУЮ функцию перемножения векторов? Чтобы и проверка на паралельность, точность и единичный вектор возвращала? Сколько можно одно и то же мусолить? Давайте делать!
Supermax вне форума  
 
Непрочитано 04.12.2009, 13:47
#110
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
И в Автокаде надо 1,0,0 вместо нее ставить! Результат перемножения векторов должен быть вектор!
Кто-нибудь напишет НОРМАЛЬНУЮ функцию перемножения векторов? Чтобы и проверка на паралельность, точность и единичный вектор возвращала?
Считаю задание настолько неверным, что решил заявить - такая функция, появись она на форуме для всеобщего обозрения, будет больше вредить, чем помогать!!!

Для параллельных векторов, при перемножении нельзя выдавать что нибудь. Это как сделать свою функцию деления, в которой при делении на ноль, всегда возвращалось бы какое либо заранее заданное число...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 04.12.2009, 13:54
#111
Supermax

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


Елпанов Евгений, ну вроде тоже верные мысли, но как быть?
Придется закинуть эту математику к .. фене и сделать самим Автокадом методом штангенциркуля.
Так я это уже и сделал! См. http://forum.dwg.ru/showpost.php?p=480556&postcount=24

Вот как сам автокад этот ежик повернул - так тому и быть! Какая там точность?, Какая паралельность? - Все в тумане, но выше этого уже никакой математикой не прыгнешь!
Supermax вне форума  
 
Непрочитано 04.12.2009, 14:14
#112
zamtmn

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


>>Кто-нибудь напишет НОРМАЛЬНУЮ функцию перемножения векторов?
>>Чтобы и проверка на паралельность, точность и единичный вектор
>>возвращала? Сколько можно одно и то же мусолить? Давайте делать!

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

предположим ты считаешшь ск объекта: используй arbatrary axis - результат будет коректен, всё развернется как надо его смысл какраз в том чтобы не перемножить паралельные вектора.

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

Елпанов Евгений дело говорит, подправлять под свои хотелки математическую функцию и называть это "НОРМАЛЬНУЮ функцию перемножения векторов" - вредительство)))

(0,0,0) почему не вектор? нормальный вектор нулевой длины.
zamtmn вне форума  
 
Автор темы   Непрочитано 04.12.2009, 14:21
#113
Supermax

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


Да бог с ним, не надо мне уже ничего перемножать.
Я только наведу маленько тень на плетень и пойду.
1/64=0.015625 это дельта 15,625 миллиметров на метр. С такой точностью можно и локтями измерить.
Автокад устанавливает точность на много-много порядков больше.
Так что 1/64 - мягко говоря туфта.
Supermax вне форума  
 
Непрочитано 04.12.2009, 14:28
#114
Александр Ривилис

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Я только наведу маленько тень на плетень и пойду.
Именно этим и занимаешься.
Александр Ривилис вне форума  
 
Непрочитано 04.12.2009, 14:31
#115
zamtmn

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


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.
zamtmn вне форума  
 
Непрочитано 04.12.2009, 14:35
#116
Елпанов Евгений

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


Supermax, Все, замяли с умножением векторов!

Вспоминаю код, явно писали инудсы... Видимо у них постоянно вылетала ошибка деления на ноль, так они в куче мест программы, все нули меняют на 1е-8. Стоит один раз запустить такую программу в чертеже и работать с ним становится невозможно - заменяются нули в 10 и 210 кодах dxf.

ой, забыл самое главное - еще все углы во всех примитивах (дуги, тексты итд...)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 04.12.2009 в 15:17.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 04.12.2009, 15:14
#117
Supermax

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


Александр Ривилис, наводить тень на плетень тоже нужно, иначе в мозгах застой образуется. Точнее в ваших мозгах, а в моем он не образуется, он там постоянно прописан.
zamtmn, не знаю как там повелось, но 1/64 и 1е-12 вещи настолько разные, что как-то не верится, что спецы AutoDesk при < 1/64 считают вектора паралельными. А я еще и 1е-16 и 1е-18 видел.
Елпанов Евгений, а вот тут я не догнал чуток.
"округляются нули" ты говоришь, что они 0 заменили на 1е-8, какое это округление?
Цитата:
округляются нули в 10 и 210 кодах dxf.
я понимаю как было 1е-8, а стало 0. Вот это округление. И е-8 что-то маловато для Автокада, не кажется?

Завязать с перемножением не получится. Я забыл, что есть благородная задача написать функцию получения координат точки на линии, пересекающей плоскость. А там перемножение - основа.
Supermax вне форума  
 
Непрочитано 04.12.2009, 15:19
#118
Елпанов Евгений

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


Supermax, извини, описался...
Имел в виду, что в начале работы программы, сканируется весь чертеж и в кодах 10 11 210 50 и возможно еще каких то, все нули меняются на 1е-8
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 04.12.2009, 15:24
#119
Supermax

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


Ну тогда я понимаю, 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.
Supermax вне форума  
 
Непрочитано 04.12.2009, 15:32
#120
zamtmn

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


1\64 ни как на ТОЧНОСТЬ вычислений не влият. прими они 1\32 все было бы также, угол бы скакал чуток позже, но всё по прежнему вращалось бы также корректно.

>>что спецы AutoDesk при < 1/64 считают вектора паралельными
это сделано чтоб не множить паралельные вектора, но это не значит что считают что они паралельны. на месте 1\64 должна быть какаято цифра почему ты думаешь что 1\64 много?
zamtmn вне форума  
Ответ
Вернуться   Форум 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