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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Угол по 3м сторонам.

Угол по 3м сторонам.

Ответ
Поиск в этой теме
Непрочитано 11.11.2010, 17:52 #1
Угол по 3м сторонам.
Mozgunov
 
Начинающий проектировщик
 
Санкт-Петербург
Регистрация: 07.02.2008
Сообщений: 443

Ребят помогите если можете вот с чем. Хотел сделать функция для определения угла по 3м сторонам. Да вот не разберусь никак c "pi".

Код:
[Выделить все]
(defun ugol (rd1 rd2 rd3 / result rd1 rd2 rd3 cos_gamma sin_gamma);фунция возвращает угол между rd1 rd2 в радианах
(setq cos_gamma (/ (- (* rd3 rd3 ) (* rd1 rd1) (* rd2 rd2)) (* -2.0 rd1 rd2)))
(setq sin_gamma (sqrt (- 1 (* cos_gamma cos_gamma))))
(setq result  (atan (/ sin_gamma cos_gamma)))
);end_ugol
Должна определять градус между отрезками rd1 rd2. Но никак не соображу когда нужно отнимать pi когда прибавлять.
Просмотров: 3473
 
Непрочитано 11.11.2010, 18:29
#2
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


у тебя угол в радианах высчитывается, в смысле result в радианах?
2pi радиан - это 360 градусов.
result- это X градусов.
Хмурый вне форума  
 
Автор темы   Непрочитано 11.11.2010, 20:16
#3
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Хмурый, Спасибо это-то я всё понимаю. Я специально в градусы не переводил, чтобы использовать этот угол для прорисовки. Смотри например для трегольника со сторонами 4 5 7 вызываем функцию (ugol 4 5 7) т.е измеряю угол между 4 и 5.

Код:
[Выделить все]
Command: (ugol 5 4 7)
-1.36944
Функция возвращает отрицательную величину угла. Угол 5-4 равен: pi-1.36944 =3.14-1.36944=1,77056 рад. Мне нужно на самом деле вот это число 1.77, но оно не всегда находиться как пи вычесть значение возвращаемое моей функции. Что нужно поправить чтобы функция возвращала сразу угол между прямыми 4-5. Вот я что не пойму.
Миниатюры
Нажмите на изображение для увеличения
Название: ugol.JPG
Просмотров: 64
Размер:	18.0 Кб
ID:	48021  

Последний раз редактировалось Mozgunov, 11.11.2010 в 22:34.
Mozgunov вне форума  
 
Непрочитано 11.11.2010, 20:34
#4
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


а функцию getangle не пробовал применить?
Хмурый вне форума  
 
Автор темы   Непрочитано 11.11.2010, 21:27
#5
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Мне не нужно запрашивать у пользователя угол (поэтому не пробовал). Треугольник я для примера нарисовал. На самом деле его нет. И тыкать указателем некуда) При помощи этой функции я ищу точку пересечения двух окружностей. Нужно просто точку найти для прорисовки...
Mozgunov вне форума  
 
Непрочитано 12.11.2010, 09:04
#6
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Может, все же точки пересечения? Их либо ни одной, либо 2 (ну, если объекты лежат в одной плоскости). И почему бы не использовать vla-intersectwith?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 12.11.2010, 09:21
#7
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Может, все же точки пересечения?
-Нет. Угол между прямыми длиной 4 и 5. На рисунке я показал угол который нужно найти. На рисунке он отмечен как угол примерно в 102 градуса
Mozgunov вне форума  
 
Непрочитано 12.11.2010, 09:24
#8
Meknotek

Проектирование заборов уже в прошлом
 
Регистрация: 29.10.2009
Рязань
Сообщений: 2,089


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Может, все же точки пересечения? Их либо ни одной, либо 2
все-таки одна может быть (когда окружности "касаются" друг друга)

Mozgunov, если я правильно понял задачу, то стоит посмотреть в сторону "теоремы косинусов"...

Последний раз редактировалось Meknotek, 12.11.2010 в 09:30.
Meknotek вне форума  
 
Автор темы   Непрочитано 12.11.2010, 09:33
#9
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Да с окружностями я уже всё выяснил. Остался один вопрос. Подработать функцию так, чтобы она возвращала угол в радианах, не отрицательные углы! А такой угол домножив который на 180 м поделив на пи я бы получил его градусный эквивалент. Нужен угол именно между этими прямыми. Я просто не знаю как уже понятней объяснить.

Meknotek привет! Теорема косинусов уже была использована вот здесь:
Код:
[Выделить все]
(setq cos_gamma (/ (- (* rd3 rd3 ) (* rd1 rd1) (* rd2 rd2)) (* -2.0 rd1 rd2)))
Теперь нужно разобраться почему получаются отрицательные углы! Т.е. когда отнимать от 2pi это число когда от pi. Ну или ещё как-то.
Mozgunov вне форума  
 
Непрочитано 12.11.2010, 09:55
#10
Meknotek

Проектирование заборов уже в прошлом
 
Регистрация: 29.10.2009
Рязань
Сообщений: 2,089


Цитата:
Сообщение от Mozgunov Посмотреть сообщение
Теперь нужно разобраться почему получаются отрицательные углы! Т.е. когда отнимать от 2pi это число когда от pi. Ну или ещё как-то.
http://ru.wikipedia.org/wiki/%D0%9E%...86%D0%B8%D0%B8

рез-т "арктангенса" будет в пределах -П/2 < atan < +П/2
Meknotek вне форума  
 
Непрочитано 12.11.2010, 10:02
#11
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Meknotek, про этот момент я как-то забыл, спасибо
Код удалил, т.к. не проверил работу
Mozgunov, скажу честно - я не очень понимаю, почему твой исходный код работает Параметры вызова и локальные переменные имеют одни и те же названия, что в принципе не есть сильно хорошо.
---
Добавлено:
Код:
[Выделить все]
(defun get-angle-by-points (point1 point2 point3 / a b cos_ang res)
                           ;|
Возвращает угол между прямыми point1-point2 и point2-point3 в радианах
|;
  (setq a       (mapcar '- point1 point2)
        b       (mapcar '- point3 point2)
        cos_ang (/ (apply '+ (mapcar '* a b))
                   (apply '*
                          (mapcar
                            (function (lambda (item)
                                        (sqrt (apply '+ (mapcar '(lambda (x) (expt x 2)) item)))
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                            (list a b)
                            ) ;_ end of mapcar
                          ) ;_ end of apply
                   ) ;_ end of /
        res     (atan (/ (sqrt (- 1. (expt cos_ang 2))) cos_ang))
        ) ;_ end of setq
  (cond
    ((< res 0)
     (+ pi res)
     )
    (t res)
    ) ;_ end of cond
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 12.11.2010 в 10:24.
Лиспер вне форума  
 
Непрочитано 12.11.2010, 10:21
#12
Meknotek

Проектирование заборов уже в прошлом
 
Регистрация: 29.10.2009
Рязань
Сообщений: 2,089


Mozgunov, добавь строчку вида
(if (< angle_a 0) (setq angle_a (+ angle_a PI)) )
и все...

т.к. tan ( a ) = tan ( a + pi)

Прошу прощения за мой французский lisp
Meknotek вне форума  
 
Автор темы   Непрочитано 12.11.2010, 10:29
#13
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Цитата:
Сообщение от Meknotek Посмотреть сообщение
Mozgunov, добавь строчку вида
(if (< angle_a 0) (setq angle_a (+ angle_a PI)) )
и все...
Спасибо. Сейчас добавлю и проверю, но походу дела это не всё. Отпишусь потом ) Счас по работе нужно кое что делать. Ближе к вечеру буду разбираться. Лиспер, спасибо. Буду разбираться позже.
Mozgunov вне форума  
 
Непрочитано 12.11.2010, 15:09
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Посмотри на эти примеры заодно
Код:
[Выделить все]
(if (not c:cal)(arxload "geomcal"))

 Then send your points to the calculator:  

(setq myAng (cal "ang(p1,p2,p3)"))
Код:
[Выделить все]
;; another way  by gile:

           Assume the first point is the angle summit.

            The angle is returned in radians.

            The routine also works in 3D whatever the UCS.

           ;; written by gile (Gilles Chanteau)
            (defun angle_3pts (som p1 p2 / d1 d2 d3)
            (setq d1 (distance som p1)
            d2 (distance som p2)
            d3 (distance p1 p2)
            )
            (if (not (vl-some 'zerop (list d1 d2 d3)))
            (ACOS (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3)))
            (* 2 d1 d2)
            ) 
            )
            )
            )

            (defun ACOS (num)
            (if (<= -1 num 1)
            (atan (sqrt (- 1 (expt num 2))) num)
            )
            )
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 13.11.2010, 14:23
#15
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Олег (jr.), Спасибо подошло. То что нужно! Не внимательно прочитал что делает функция atan. В моём случае на "0" делилось число если угол был 90 грудусов. Урезал только лишнее, теперь вот так:
Код:
[Выделить все]
(defun ugol (rd1 rd2 rd3 / );фунция возвращает угол между rd1 rd2 в радианах

(acos (/ (+ (* rd1 rd1) (* rd2 rd2) (- (* rd3 rd3)))
            (* 2 rd1 rd2)))
);end_ugol

(defun acos (num)
            (if (<= -1 num 1)
            (atan (sqrt (- 1 (expt num 2))) num)
            )
);end acos
Mozgunov вне форума  
 
Непрочитано 13.11.2010, 15:20
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Успехов
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Угол по 3м сторонам.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Угол внутреннего трения. Таблицы? pbykov Конструкции зданий и сооружений 8 04.04.2021 11:25
опорный угол в команде ARRAY mikmiron AutoCAD 7 31.10.2012 14:32
Поворот примитивов на заданный угол относительно собственной базовой точки в AutoCAD LT cancercat AutoCAD 2 25.11.2009 17:21
Комфортный угол наклона авто рампы VS автолифт stoper Архитектура 15 29.09.2008 21:50
Направление штриховки (Как указать угол на чертеже) dm_kondakov AutoCAD 7 23.04.2007 09:28