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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Разминка мозгов для знатных геометров

Разминка мозгов для знатных геометров

Ответ
Поиск в этой теме
Непрочитано 16.08.2005, 14:26 #1
Разминка мозгов для знатных геометров
fixo
 
Lisp/VBA/VB.NET Hobbyist
 
Славен Град Петров
Регистрация: 24.03.2005
Сообщений: 367

У меня самого не хватает мозгов, а горит срочная халтура!
Кто знает как вычислять точки кастельной к окружности
и точки дуги (или угол дуги) по известной длине стягивающей
ее хорды и радиусу дуги.
Вся проблема в том, что вычисления должны быть на
обычном Автолиспе, а не с применением объектных
методов (vla-функций)
Заранее благодарен за помощь
См. attchment

Fatty
[ATTACH]1124188103.dwg[/ATTACH]
Просмотров: 6121
 
Непрочитано 16.08.2005, 14:54
#2
Разработчик

Ну типа прочнист
 
Регистрация: 12.01.2005
Москва
Сообщений: 1,649
<phrase 1=


У меня нет Автокада, поэтому рисунок не видел, но по словесному описанию задачки:
1. Длины хорды (l) недостаточно, нужны еще данные.
2. Если известен радиус (R), то
угол дуги = 2*arcsin(l/2/R)
расстояние от центра окружности до точки пересечения касательных к краям дуги = 2*R^2/sqrt(4*R^2-l^2)
__________________
ZZH
Разработчик вне форума  
 
Автор темы   Непрочитано 16.08.2005, 15:01
#3
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
У меня нет Автокада, поэтому рисунок не видел, но по словесному описанию задачки:
1. Длины хорды (l) недостаточно, нужны еще данные.
2. Если известен радиус (R), то
угол дуги = 2*arcsin(l/2/R)
расстояние от центра окружности до точки пересечения касательных к краям дуги = 2*R^2/sqrt(4*R^2-l^2)
Спасибо, кажется по второй части то что надо!
А по первой части необходимо найти точки касательных
к отстоящей от дуги окружности, которые исходят из концов
этой дуги

Успехов

Fatty
fixo вне форума  
 
Непрочитано 16.08.2005, 15:10
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Ну если построения уже сделаны, то для линий-касательных (я так полагаю, что они строились с применением
Код:
[Выделить все]
(command "_.Line" "_Tan" pause "_End" pause "")
получение начальной точки:
Код:
[Выделить все]
(setq start_point (assoc 10 (entget(car(entlast))))
  end_point (assoc 11 (entget(car(entlast)))))
Надо вызывать сразу после программного рисования отрезков. Если уже нарисовано, то заменить (entlast) надо будет на (entsel) либо любым другим способом получить объекты отрезков.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.08.2005, 15:25
#5
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
У меня нет Автокада, поэтому рисунок не видел, но по словесному описанию задачки:
1. Длины хорды (l) недостаточно, нужны еще данные.
2. Если известен радиус (R), то
угол дуги = 2*arcsin(l/2/R)
расстояние от центра окружности до точки пересечения касательных к краям дуги = 2*R^2/sqrt(4*R^2-l^2)
Попробовал обкатать формулу: угол дуги = 2*arcsin(l/2/R)
не знаю у меня на компьютере построения дают угол в 2 раза
меньше, может быть двойка лишняя?

Fatty
fixo вне форума  
 
Автор темы   Непрочитано 16.08.2005, 15:27
#6
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от kpblc
Ну если построения уже сделаны, то для линий-касательных (я так полагаю, что они строились с применением
Код:
[Выделить все]
(command "_.Line" "_Tan" pause "_End" pause "")
получение начальной точки:
Код:
[Выделить все]
(setq start_point (assoc 10 (entget(car(entlast))))
  end_point (assoc 11 (entget(car(entlast)))))
Надо вызывать сразу после программного рисования отрезков. Если уже нарисовано, то заменить (entlast) надо будет на (entsel) либо любым другим способом получить объекты отрезков.
Спасибо за содействие, но дело в том, что мне нужны обязательно
вычисления точек
В натуре ничего не построено, только заданы предварительные значения, в том то и вопрос...

Regards,
Fatty
fixo вне форума  
 
Непрочитано 16.08.2005, 15:32
#7
Разработчик

Ну типа прочнист
 
Регистрация: 12.01.2005
Москва
Сообщений: 1,649
<phrase 1=


Положи картинку в формате картинки (jpg, bmp), а то уже не ясно, есть еще какие-то окружности...
__________________
ZZH
Разработчик вне форума  
 
Непрочитано 16.08.2005, 15:40
#8
Разработчик

Ну типа прочнист
 
Регистрация: 12.01.2005
Москва
Сообщений: 1,649
<phrase 1=


Цитата:
Попробовал обкатать формулу: угол дуги = 2*arcsin(l/2/R)
не знаю у меня на компьютере построения дают угол в 2 раза
меньше, может быть двойка лишняя?
Не лишняя, если хорда - диаметр, то l=2R, arcsin(1)=90 градусов и дуга, соответственно - 180, т.е. пол-окружности.
__________________
ZZH
Разработчик вне форума  
 
Автор темы   Непрочитано 16.08.2005, 15:57
#9
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
Положи картинку в формате картинки (jpg, bmp), а то уже не ясно, есть еще какие-то окружности...
Посылаю рисунок, ну точено, наверняка многие
делали такую деталь...

Fatty
[ATTACH]1124193431.GIF[/ATTACH]
fixo вне форума  
 
Автор темы   Непрочитано 16.08.2005, 16:32
#10
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
Цитата:
Попробовал обкатать формулу: угол дуги = 2*arcsin(l/2/R)
не знаю у меня на компьютере построения дают угол в 2 раза
меньше, может быть двойка лишняя?
Не лишняя, если хорда - диаметр, то l=2R, arcsin(1)=90 градусов и дуга, соответственно - 180, т.е. пол-окружности.
Извини, двойка на своем месте, неправильно написал
функцию арксинуса, вот правильный вариант, правда, точность
только до пятого знака, как сделать точнее не знаю, может,
это не принципиально?

Код:
[Выделить все]
(defun asin (an) 
  (if (= (atof (rtos (abs an))) 1) 0
    (atan (/ an (sqrt (1+ (* (- an) an)))))
    )
)
Fatty
fixo вне форума  
 
Непрочитано 16.08.2005, 17:06
#11
Разработчик

Ну типа прочнист
 
Регистрация: 12.01.2005
Москва
Сообщений: 1,649
<phrase 1=


Теперь понятно.

Итак R - большой радиус (800)
r - малый (75), предполагается что центр у них общий
l - ширина пластины, полная, т.е. 192.7

добавим два угла:
a = arcsin(l/2/R) - половина угла дуги
b = arcsin(r/R)

Начало координат в центре окружностей
точка p1
x = sqrt(R^2-l^2/4)
y = l/2
точка p4
x = sqrt(R^2-l^2/4) - (R^2-r^2)*cos(a-b)
y = l/2 - (R^2-r^2)*sin(a-b)
точки p2 и p3 - симметрично.
__________________
ZZH
Разработчик вне форума  
 
Непрочитано 16.08.2005, 17:22
#12
Разработчик

Ну типа прочнист
 
Регистрация: 12.01.2005
Москва
Сообщений: 1,649
<phrase 1=


В lisp не программирую, так что с синтаксисом не знаком, хотя понятно, что считаешь arcsin через atan, и то, что arcsin(a)=atan(a/sqrt(1-a^2)) тоже верно. А количество знаков - это уже заморочки lisp, видимо и сам atan считается примерно так же.
В предыдущем посте для p4 пропущены sqrt, т.е
точка p4
x = sqrt(R^2-l^2/4) - sqrt(R^2-r^2)*cos(a-b)
y = l/2 - sqrt(R^2-r^2)*sin(a-b)
__________________
ZZH
Разработчик вне форума  
 
Автор темы   Непрочитано 16.08.2005, 17:49
#13
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
В lisp не программирую, так что с синтаксисом не знаком, хотя понятно, что считаешь arcsin через atan, и то, что arcsin(a)=atan(a/sqrt(1-a^2)) тоже верно. А количество знаков - это уже заморочки lisp, видимо и сам atan считается примерно так же.
В предыдущем посте для p4 пропущены sqrt, т.е
точка p4
x = sqrt(R^2-l^2/4) - sqrt(R^2-r^2)*cos(a-b)
y = l/2 - sqrt(R^2-r^2)*sin(a-b)
Спасибо, что тратите столько времени на меня
Буду жевать, результаты доложу

Fatty
fixo вне форума  
 
Автор темы   Непрочитано 16.08.2005, 18:33
#14
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Разработчик
В lisp не программирую, так что с синтаксисом не знаком, хотя понятно, что считаешь arcsin через atan, и то, что arcsin(a)=atan(a/sqrt(1-a^2)) тоже верно. А количество знаков - это уже заморочки lisp, видимо и сам atan считается примерно так же.
В предыдущем посте для p4 пропущены sqrt, т.е
точка p4
x = sqrt(R^2-l^2/4) - sqrt(R^2-r^2)*cos(a-b)
y = l/2 - sqrt(R^2-r^2)*sin(a-b)
Все построения по вашим формулам сходятся до последнего знака!!!

ВОСХИЩЕН!

Вы сэкономили мне уйму времени теперь я успею доделать
свою работу до ночи

Всех благ

Best regards,

Fatty
fixo вне форума  
 
Непрочитано 16.08.2005, 20:01
#15
Vlad®

розмысл
 
Регистрация: 12.06.2005
Иркутск
Сообщений: 1,973
<phrase 1=


в Компасе 3D V6 для такой задачи есть штатная функция - "постоение касательной через внешнюю точку"
[ATTACH]1124208100.jpg[/ATTACH]
Vlad® вне форума  
 
Непрочитано 17.08.2005, 06:49
#16
che

Прораб
 
Регистрация: 16.05.2005
Osh
Сообщений: 52


>Fatty

Написал вчера, а сеть вырубили. Может и сгодится:

Код:
[Выделить все]
(defun asin (a /)
  (if (< a 1)
    (atan (/ a (sqrt (- 1 (* a a)))))
    (print "введите а<1")
  )
)

(defun 2d_inters_circle (P1 R1 P2 R2 / A A1 CosA D)
 (setq D (distance P1 P2)   A1 (angle P1 P2))
 (cond
  ((equal D (+ R1 R2) 0.001) (list (polar P1 A1 R1) (polar P1 A1 R1)))
  ((> D (+ R1 R2)) nil)
  (T
   (setq CosA (/ (- (+ (* R1 R1) (* D D)) (* R2 R2)) 2.0 R1 D)
         A (atan (sqrt (- 1 (* CosA CosA))) CosA)
   )
   (list (polar P1 (+ A1 A) R1) (polar P1 (- A1 A) R1))
  )
 )
)

(defun kasat ()
  (setq p0 '(0 0))
  (setq r0 75)
  (setq R1 800)
  (setq l1 192.7)

  (setq osn (getvar "osmode"))
  (setvar "osmode" 0)
  (setq alpha (asin (/ (/ l1 2) R1)))
  (setq p1 (polar p0 alpha R1))
  (setq p2 (polar p1 (* -0.5 pi) l1))
  (setq L2 (* (cos (asin (/ r0 R1))) R1))

  (setq p4_1 (car (2d_inters_circle p0 r0 P1 L2)))
  (setq p4_2 (cadr (2d_inters_circle p0 r0 P1 L2)))

  (setq p3_1 (car (2d_inters_circle p0 r0 p2 L2)))
  (setq p3_2 (cadr (2d_inters_circle p0 r0 p2 L2)))

  (if (> (distance p1 p4_1) (distance p2 p4_2)) (setq p4 p4_1) (setq p4 p4_2))
  (if (> (distance p2 p3_1) (distance p1 p3_2)) (setq p3 p3_1) (setq p3 p3_2))

  (vl-cmdf "arc" "c" p0 p4 p3)
  (vl-cmdf "arc" "c" p0 p2 p1)
  (vl-cmdf "line" p1 p4 "")
  (vl-cmdf "line" p2 p3 "")
  (setvar "osmode" osn)
);defun
Использованя две вспомогательные функции по арксинусу и пересечению двух окружностей.
che вне форума  
 
Автор темы   Непрочитано 17.08.2005, 13:35
#17
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от che
>Fatty

Написал вчера, а сеть вырубили. Может и сгодится:

.............
Ещё как сгодилось-то!

Делает то же самое, но и 10 раз быстрее, вот в чем прикол!
Посьба если не хочешь открывать свое имя,
напиши мне его приватно на мой e-mail, чтобы я мог
указать автора

Regards

Fatty
fixo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Разминка мозгов для знатных геометров