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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите написать код в ЛИСПе для построения развертки двух пересекающихся цилиндров

Помогите написать код в ЛИСПе для построения развертки двух пересекающихся цилиндров

Ответ
Поиск в этой теме
Непрочитано 04.09.2013, 20:30 #1
Помогите написать код в ЛИСПе для построения развертки двух пересекающихся цилиндров
Bezzvyka
 
Регистрация: 10.06.2013
Сообщений: 2

есть 2 пересекающихся цилиндра под прямым углом и развертка выглядит примерно так (извиняюсь за кривизну рисовал в пейнте), нужно написать программу где мы будем вводить радиусы двух цилиндров и нам будет рисоваться эта развертка, уравнение нижней синусойды y=R-(R^2-(2*r*sinx)^2)^(1/2), где х [0; 2*PI*r], верхняя линия равна 2*PI*r, боковые пусть буду r (R-радиус большого цилиндра, r-радиус цилиндра поменьше сообственно которого и производиться развертка. Смог сделать только 3 линии, как написать код для построения этой синусойды не знаю, помогите пожалуйста.

Миниатюры
Нажмите на изображение для увеличения
Название: развертка.png
Просмотров: 60
Размер:	10.7 Кб
ID:	111307  Нажмите на изображение для увеличения
Название: развертка1.png
Просмотров: 999
Размер:	4.4 Кб
ID:	111308  

Просмотров: 6392
 
Непрочитано 04.09.2013, 22:52
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


строй полилинию по точкам, так же, как и вручную
gomer вне форума  
 
Автор темы   Непрочитано 04.09.2013, 23:11
#3
Bezzvyka


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


Я тебя не понял, я смог только сделать
Цитата:
(defun C:rzv (/ P1 P2 P3 P4)

(setq P1 (getpoint "начальная точка:"))

(setq L (getdist P1 "длина квадрата:"))

(setq P2 (polar P1 0.0 L))

(setq P3 (polar P2 (/ PI 2) (* 2 PI L)))

(setq P4 (polar P3 PI L))

(command "_LINE" P1 P2 P3 P4 "С" )
)

мне бы хотя бы код для построения синусойды y=R-(R^2-(2*r*sinx)^2)^(1/2), где х [0; 2*PI*r]

Последний раз редактировалось Bezzvyka, 05.09.2013 в 10:39.
Bezzvyka вне форума  
 
Непрочитано 09.09.2013, 18:15
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Добавил в формулу ABS (модуль) [Выделил в коде красным], т.к.
при R=20, r=14 и x=1
формула R^2-(2*r*sinx)=-155,3 и извлечение корня дает ошибку

Код:
[Выделить все]
(defun C:rzv (/ P1 P2 Rbig Rsmall X Y Xmax lst P3 step)
  (initget 3)
  (setq Rbig (getdist "\nРадиус большого цилидра: "))
  (initget 3)
  (while (>= (setq Rsmall (getdist "\nРадиус маленького цилидра: "))
            Rbig)
    (princ "\nРадиус должен быть мешьше чем ")
    (princ Rbig)
    (initget 1)
    )
(initget 3)
(setq Step (getdist "\nШаг по оси X: "))
(initget 1)  
(setq P1 (getpoint "\nНачальная точка: "))
(command "_.PLINE" "_non" P1
         "_non" (setq P2 (polar P1 (* 0.5 pi) Rsmall))
         "_non" (setq P2 (polar P2 0 (* 2 pi Rsmall)))
         "_non" (setq P2 (polar P2 (* 1.5 pi) Rsmall))
         ""
         )
  ;;;Построение синусоиды
  ;;;Формула y=R-(R^2-(2*r*sinx)^2)^(1/2), где x [0; 2*PI*r]
  (setq X (- 0. step)
        Xmax (* 2 pi Rsmall)
        )
  (while (<= (setq X (+ X step)) Xmax)
    (setq P3 (- (* Rbig Rbig)(*(* 2 Rsmall (sin x))(* 2 Rsmall (sin x)))))
    (if (minusp P3)
      (setq P3 (- 0. (sqrt(abs P3))))
      (setq P3 (sqrt P3))
      )
    (setq Y (- Rbig P3))
    (setq lst (cons (list X Y) lst))
    )
  (command "_.PLINE" "_non" P1)
  (foreach pt (reverse lst)
    (command "_non" (mapcar '+ P1 pt))
    )
  (command P2 "")
  (while (> (getvar "CMDACTIVE") 0) (command))
  (princ)
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 10.09.2013 в 09:16. Причина: новая версия
VVA вне форума  
 
Непрочитано 09.09.2013, 19:40
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


VVA,не пойдет программа, развертка строится по количеству опорных точек, а не по расстоянию между ними. Во-вторых, в результате получается черти что, а не развертка.
gomer вне форума  
 
Непрочитано 10.09.2013, 09:16
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


gomer, количество опорных точек=длина развертки/шаг
Внес изменения в #4. На синусоиду похоже больше.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.09.2013, 11:40
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Нда... студенту задали задачу, а Вы за него решение пишите. Не стыдно?
Boxa вне форума  
 
Непрочитано 10.09.2013, 13:21
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы за него решение пишите. Не стыдно?
Не умничайте. VVA развертка не должна пересекать себя, попробуйте диаметры 500, 800 и шаг 156
gomer вне форума  
 
Непрочитано 10.09.2013, 18:33
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


gomer, Я реализовал формулу. Вспоминать начерталку про развертки мне некогда
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.09.2013, 17:46
#10
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Поскольку я вплотную занимаюсь этим чудом, то сделал для себя несколько функций для разверток. Все это узкоспециализировано под мои задачи, но работает безотказно - не одна сотня деталей сделана по ним. Может быть поможет.
В архив кинул вроде бы все причастные файлы для развертки отвода, ненужное можно выбросить.
Основная функция "at_stutzen", остальные вспомогательные.
Вложения
Тип файла: zip at_stutzen.zip (6.3 Кб, 93 просмотров)
alex8888 вне форума  
 
Непрочитано 11.09.2013, 18:02
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


где I:AT_LIST->ARRAY?
gomer вне форума  
 
Непрочитано 11.09.2013, 18:05
#12
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Может быть еще какую пропустил, пишите. Так уж повелось - все под разные проекты, не писать же в каждый одно и тоже.
Вложения
Тип файла: lsp at_list-array.LSP (1.2 Кб, 61 просмотров)
alex8888 вне форума  
 
Непрочитано 11.09.2013, 19:40
#13
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Вроде оно, но в чем разница не могу разобраться пока, вроде формула одна, а результат разный...
gomer вне форума  
 
Непрочитано 11.09.2013, 22:23
#14
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Вроде оно, но в чем разница не могу разобраться пока, вроде формула одна, а результат разный...
А в чем проблема?
alex8888 вне форума  
 
Непрочитано 11.09.2013, 23:44
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Да, похоже что VVA линейные и угловые величины намешал. А общий случай пересечения цилиндров у вас есть?
gomer вне форума  
 
Непрочитано 12.09.2013, 00:41
#16
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Что значит общий случай? Что конкретно?
В моем лиспе можно вместо параметров указать nil или просто () и тогда он будет спрашивать шаг за шагом диаметр трубы, диаметр отвода, высоту от оси трубы до верхней плоскости отвода (это чтобы высоту развертки подсчитать), потом ненужные для вас, но нужные мне текстовые пометки на развертку, можно пропустить нажатием ввода, наконец спросит отступ от продольной оси трубы до оси отвода, в случае если плоскости совпадают, т.е. равно 0, то можно оставить пустым и нажать ввод. Последним запросит точку куда вставить развертку, путем тыка мышкой, от нее потом считается вся развертка. Хотелось бы, чтобы можно было уже потом, после построения указывать где разместить получившуюся полилинию, при этом чтобы она "висела" на курсоре, но при этом не являлась бы блоком - блок потом расчленять надо, а это лишние телодвижения.
alex8888 вне форума  
 
Непрочитано 12.09.2013, 00:58
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Что значит общий случай? Что конкретно?
Штуцер может быть и под углом
gomer вне форума  
 
Непрочитано 12.09.2013, 09:09
#18
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от gomer Посмотреть сообщение
Штуцер может быть и под углом
Такая ситуация в моей практике еще не встречалась, поэтому, естественно , я ее не обыгрывал. Единственное, что в расчеты надо принимать угол наклона оси штуцера к оси трубы. В случае, когда цилиндры пересекаются под углом 90 град. синус угла равен 1, в остальных случаях нет и его как-то нужно добавлять к расчетам. Спинным мозгом чувствую, что сложного ничего нет, просто где-то надо на этот синус поделить, возможно в строке 95-96:
Код:
[Выделить все]
 (- Stutzen_hoehe (sqrt (- (expt (* 0.5 Kopf_D) 2.0)(expt (+ (* m (* 0.5 Stutzen_D)) Stutzen_Abstand) 2.0))))
, но не разбирался с этим. Если есть желание разобраться, сообщи результат потом, хорошо?
alex8888 вне форума  
 
Непрочитано 12.09.2013, 09:17
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от gomer Посмотреть сообщение
Да, похоже что VVA линейные и угловые величины намешал.
У меня так же на это есть подозрения.
Бегло просмотрел код alex8888, у него
Цитата:
(setq
a (list n) ;создание пустого списка делений длины отвода
winkel_list (list (* 2 pi)) ;создание списка углов
а у ТС
Цитата:
для построения синусоиды y=R-(R^2-(2*r*sinx)^2)^(1/2), где х [0; 2*PI*r]
Думаю собака зарыта где-то здесь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите написать код в ЛИСПе для построения развертки двух пересекающихся цилиндров



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19