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

Вернуться   Форум 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.
Просмотров: 35059
 
Автор темы   Непрочитано 08.12.2009, 14:51
#141
Supermax

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


А я тупой. Вот никак не могу понять, какого фига мне таскать за каждой лиспиной целую библиотеку. И мне не понятно, почему нельзя сделать такую библиотеку, чтобы я мог просто черпать идеи, а не готовые простыни, где текста порой больше самого кода. Все равно при компиляции весь этот мусор выбрасывается.
И погодите, такое складывается впечатление, что это я администратор форума и главный распорядитель библиотеки функций. Что вы меня обвиняете, что идея с библиотекой не пошла как следует?
Она пошла, но не так как хотелось бы. И это не я ее загубил. Просто было несколько подпорок, а они почему-то время от времени куда-то отлучаются и конструкция шатается. Она не упала. Это я малость передернул.

Вот классический пример:
VVA написал функцию, которая считает все в треугольнике.
http://forum.dwg.ru/showthread.php?t=15697
А мне не надо это все, мне только один угол надо.
И то, я его вместе с другими задачами решаю. Мне надо принцип понять и свои задачи решить более совершенно.
А тут функция а ссылается на функцию б, та на с, та на д и т.д.
Смотрю на код и не понимаю как он работает.

И вообще, мое мнение, это мое мнение. Причем тут библиотека?
Supermax вне форума  
 
Непрочитано 08.12.2009, 16:12
#142
Елпанов Евгений

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


Supermax, я в свое время, тоже предлагал сделать не библиотеку функций, а библиотеку алгоритмов...


ps. несколько функций из библиотеки:

проверка двух поверхностей, что они лежат на одной плоскости (совпадают)
Код:
[Выделить все]
(defun eq-plane (p1 p2 v1 v2)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; проверка двух поверхностей, что они лежат на одной плоскости (совпадают)
 ;; проверка производится на пересечение нормалей
 ;; и расстояние между плоскостями
 ;; p1 - точка на первой плоскости
 ;; p2 - точка на второй плоскости
 ;; v1 - вектор нормали первой поверхности
 ;; v2 - вектор нормали второй поверхности
 ;; (setq fuzz 1e-6)
 ;;(eq-plane '(0. 0. 1) '(1. 1. 1) '(0. 0. 1) '(0. 0. 5))
 (and (null (inters '(0. 0. 0.) v1 '(0. 0. 0.) v2 nil))
      (equal (- (caddr (trans p2 0 v1)) (caddr (trans p1 0 v1))) 0. fuzz)
 ) ;_  and
) ;_  defun
функция пересечения прямой и плоскости, прямая задается двумя точками
Код:
[Выделить все]
(defun inters_w-line-2p (P1 P2 V VP / P)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; функция пересечения прямой и плоскости, прямая задается двумя точками
 ;; P1 P2 - прямая
 ;; V     - вектор нормали плоскости
 ;; VP    - точка на плоскости
 ;;(inters_w-line '(5. 5. 5.) '(10. 10. 10.) '(1. 0. 0.) '(0. 0. 2))
 (if (setq p ((lambda (a b)
               (inters a
                       b
                       (list (car a) (cadr a) (caddr vp))
                       (list (car b) (cadr b) (caddr vp))
                       nil
               ) ;_  inters
              ) ;_  lambda
              (trans p1 0 v)
              (trans p2 0 v)
             )
     ) ;_  setq
  (trans p v 0)
 ) ;_  if
) ;_  defun
функция пересечения прямой и плоскост, прямая задается точкой и вектором
Код:
[Выделить все]
(defun inters_w-line-vp (PL VL V VP / P)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; функция пересечения прямой и плоскости,
 ;; прямая задается точкой и вектором
 ;; PL    - точка на прямой
 ;; VL    - вектор направления прямой
 ;; VP    - точка на плоскости
 ;; V     - вектор нормали плоскости
 ;;(inters_w-line-vp '(5. 5. 5.) '(1. 1. 1.) '(1. 0. 0.) '(0. 0. 2))
 (if (setq p ((lambda (a b)
               (inters a
                       b
                       (list (car a) (cadr a) (caddr vp))
                       (list (car b) (cadr b) (caddr vp))
                       nil
               ) ;_  inters
              ) ;_  lambda
              (trans pl 0 v)
              (trans (mapcar (function +) pl vl) 0 v)
             )
     ) ;_  setq
  (trans p v 0)
 ) ;_  if
) ;_  defun
функция вычисления единичного вектора по двум точкам
Код:
[Выделить все]
(defun pp-edv (p1 p2 / d)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; функция вычисления единичного вектора по двум точкам
 ;; p1 - точка на первой плоскости
 ;; p2 - точка на второй плоскости
 ;;(pp-edv '(5. 5. 5.) '(1. 1. 1.))
 (cond ((zerop (setq d (distance p1 p2))) nil)
       ((mapcar (function (lambda (a b c) (/ (- a b) c))) p2 p1 (list d d d)))
 ) ;_  cond
) ;_  defun
функция вычисления единичного вектора из вектора
Код:
[Выделить все]
(defun v-edv (v / d)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; функция вычисления единичного вектора из вектора
 ;; V - вектор
 ;; (v-edv '(5 5 5))
 (cond ((zerop (setq d (distance '(0. 0. 0.) v))) nil)
       ((mapcar (function /) v (list d d d)))
 ) ;_  cond
) ;_  defun

Функция вычисления вектора нормали по двум векторам
Код:
[Выделить все]
(defun v_norm_2v (v1 v2)
 ;; ElpanovEvgeniy
 ;; 10.01.07
 ;; Функция вычисления вектора нормали по двум векторам
 ;; (v_norm_2v v1 v2)
 ;; (v_norm_2v '(5. 10. 0.) '(1. 2. 3.))
 ((lambda (a b)
   (mapcar (function (lambda (a1 b1 a2 b2) (- (* a1 b1) (* a2 b2))))
           a
           (cdr b)
           b
           (cdr a)
   ) ;_  mapcar
  ) ;_  lambda
  (list (cadr v1) (caddr v1) (car v1) (cadr v1))
  (list (cadr v2) (caddr v2) (car v2) (cadr v2))
 )
) ;_  defun
функции из библиотеки Григория Черевкова (Элекран)
Функция вычисления вектора нормали по двум векторам
Код:
[Выделить все]
(defun 3d_wnorm (W1 W2)
 ;; функции из библиотеки Григория Черевкова (Элекран)
 ;; Функция вычисления вектора нормали по двум векторам
 ;;(v_norm_2v '(5. 10. 0.) '(1. 2. 3.))
 (list (- (* (cadr W1) (caddr W2)) (* (caddr W1) (cadr W2)))
       (- (* (caddr W1) (car W2)) (* (car W1) (caddr W2)))
       (- (* (car W1) (cadr W2)) (* (cadr W1) (car W2)))
 ) ;_  list
) ;_  defun
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 08.12.2009 в 16:31.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 08.12.2009, 17:12
#143
Supermax

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


Как нибудь соберусь с духом и подправлю первый пост. Что-то очень много одинаковых по назначению функций собралось. Надо выбрать самые красивые.
А библиотеку функций надо просто модернизировать. Как? - пока не знаю.

Есть очень интересная задача, связанная, между прочим, с 1 DXF кодами солидов да, да. Спасибо тебе Евгений, за подарок.

Есть пространство, в нем куча точек, точнее мы имеем список списков точек с их координатами. Надо найти две самые удаленные друг от друга точки. Если таких больше двух - nil
Supermax вне форума  
 
Непрочитано 08.12.2009, 17:25
#144
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Если таких больше двух - nil
опять применительно к частностям? Если есть облако точек и три находятся на одинаковом и максимальном расстоянии, то надо либо вернуть одну пару, те. только две точки, либо все три пары! Случай, когда информация уже не нужна - частный случай, который подходит для твоей конкретной задачи. Хотя, на основе основного кода, можно сделать функцию проверки - сколько пар найдено...


Цитата:
Сообщение от Supermax Посмотреть сообщение
Спасибо тебе Евгений, за подарок.
Какой подарок?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 08.12.2009, 19:44
#145
Supermax

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


Да я скромно, так, чтобы не наглеть. Стал писать про вектора, анализ, и понял - пошлют. Остановился на двух точках.

А про подарок - http://dwg.ru/dnl/4451
Забыл? А я расколупал. Сделал функцию, которая считает длинну цилиндра, даже если ты его порезал с обеих концов и дырок в нем насверлил.
Правда я дырок не сверлю, и наискосок почти никогда не режу, но солидами трубы делаю. Мне надо для исполнительной длинну каждой. И оси в них линиями делать. Вот тут ты мне помог! Низкий мой поклон. Без этой инфы - как без рук был.


Могу выложить в новой теме для освистания.

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

Последний раз редактировалось Supermax, 08.12.2009 в 19:52.
Supermax вне форума  
 
Непрочитано 08.12.2009, 19:52
#146
Елпанов Евгений

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


Ааа, ну тогда ладно...
Просто все представленные мной, в этой теме, функции - настоящий оффтоп! Там никакой тригонометрии и даже линейной алгебры. Максимум - перемножение векторов...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 08.12.2009, 20:09
#147
zamtmn

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


Цитата:
Есть пространство, в нем куча точек, точнее мы имеем список списков точек с их координатами. Надо найти две самые удаленные друг от друга точки.
и
Цитата:
А смысл следующий. Есть установка, что облако точек делится на две группы. Одна - все точки в одной плоскости, а другая - в другой. Расстояние между этими плоскостями и есть искомый результат.
совсем разные вещи.
дергать информацию из солидов - всеравно что распечатать чертеж а потом оцифровывать и мерить длины. охота объемных труб - добро пожаловать в МЕП
zamtmn вне форума  
 
Непрочитано 08.12.2009, 20:16
#148
Елпанов Евгений

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


Спасибо zamtmn, я понял про облако точек. Supermax, ты что, не стал разбираться с солидами, а просто вытащил оттуда точки и пытаешься восстановить размеры цилиндров? Я то думал, ты действительно разобрался с описанием трехмерных тел - там не так сложно, тем более, если только цилиндры, а получилось, ты научился извлекать точки и придумал, что делать дальше. Если ты действительно разберешься с описанием формата - будет проще и точнее. А задачку про облако точек - оставим студентам...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 08.12.2009, 20:55
#149
Supermax

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


Вы как террористы. Народ конкретикой озабочен (я в смысле), а вы его на научные подвиги толкаете.
Вот стала у меня задача колом в горле, я ее и решил. Да что там решать?
В цилиндре всего две плоскости с радиусом
Код:
[Выделить все]
("ellipse-curve $-1 -1 $-1 148.07186247359115 77.578418280957393 -2.3205436570539785e-030 
                           -0.91537347899412247 0.4026057549938859 -0 
                           -6.7629448227472997 -15.376383108923761 -3.9464094645501665e-015 
                           0.95249809790483786 I I #" 
"ellipse-curve $-1 -1 $-1 273.40350000000001 64.382500000000022 3.5045967281109811e-030 
                           0.99450287985200081 -0.10470922579255794 4.622231866529366e-032
                           -1.675347612680927 -15.912046077632013 -3.9464094645501665e-015 
                           1 I I #")
Первых три - x,y,z центра плоскости
Вторые три - x,y,z нормали плоскости
Третьи три - x,y,z вектор-радиуса
потом коофициент элипсности (или как там его)
А все остальное - пока подождет.
Если в трубе "штаны" не вырезать и прямоугольным профилем пазы не резать - больше ничего колупать не надо.
Если трубу сделать полую, то четыре ellipse-curve. Два с одним радиусом, а два с другим. Посортировал по радиусам и баеньки.
Все остальное - ЕГОР и на помойку.
Если я буду в эти английские письмена тщательно вчитываться - помру.

p.s. Между прочим, я не для себя хочу задачку решить, а для народа, который прокатом озабочен.

p.s.2 Изучая эти ...curve заметил интересную особенность. Оказывается есть 0 и есть -0 и это не спроста. Вот тут и почитать не грех.

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 519 18.09.2019 18:52
Определение высот рельефа по близлежащим точкам 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