Дисциплина:
Раздел:
Выполнил:

Теоретическая механика

Динамика.Статика.

ЧГУ, матфак, 5 курс, Васильев С

www.domath.ru

>    #Подключим стандартные пакеты: пакет графики, пакет инструментария для работы с графикой.
restart:
with(plots):
with(plottools):

 

>   

#Важно отметить, что задача на графическое изображение данного механизма
#весьма сложна. В ООП принято сложные комплексы разбивать на отдельные более простые компоненты,
# являющиеся вполне независимыми друг от друга. Так легче тестировать и использовать их.
#В нашем случае механизм состоит из нескольких частей, для отображения каждой из которых

#потребуется четкая и логическая организация. Мы полагаем, что ниже представлена весьма эффективная организация системы.
 

>    #Процедура изображения цилиндра c центром в точке  (A,B) радиуса R
#Процедура от двух параметров первый это [A,B] произвольные
#координаты и R это радиус.Цвет цилиндра-колеса красный.


Cilindr:=proc(A,B,R)
                      circle([A,B],R,color=red):
end:

   #Процедура изображения окружности с центром в точке (x[i],y[i])
 #Данная процедура отлична от предыдущей тем, что первый параметр i указывает на
 #обе коодинаты точки. Однако такой подход ограничивается произвольностью выбора.
 #Такая процедура оказывается удобной в том случае, когда
 #требуется указать на конкретную точку. Цвет цилиндра-колеса синий

>    Koleso:=proc(i::integer,R)
           PLOT(circle([x[i],y[i]],R,color=blue))
end:

 

>    #Процедура изображения неподвижной опоры в точке i,
#часть механизма, которая неподвижна.
#Размеры были подобраны из геометрических соображений.


Opora:=proc(i::integer,R)
               local x0,x1,y0,h,N:

x0:= x[i]-R*0.55: x1:= x[i]+R*0.55:
y0:= y[i]-R*0.55: h:=  3*R:  N:=2:

display(PLOT(circle([x[i],y[i]],R,color=blue)),
        PLOT(CURVES([[x0,y0],[x[i]-h,y[i]-h]],
                    [[x1,y0],[x[i]+h,y[i]-h]],
                    [[x0-h,y[i]-h],[x1+h,y[i]-h]],
                seq([[x0-h*(-j/N+1),y[i]-h],
                    [x0-h*(-j/N+1)-h/4,y[i]-h*1.3]],j=0..2*N+1)  ))):
end:





  #Процедура изображения линии от точки i  к  j
 #Довольно простая процедура изображения прямой линий.
 #Обратите внимание, что внитри процедуры два параметра x,y глобального характера.
 #Данная процедура может быть полезна там, где потребуется изобразить линии соединяющие другие   #части.

>    Linia:=proc(i::integer,j::integer,k::integer)
                 global x,y:
                        PLOT(CURVES([[x[i],y[i]],[x[j],y[j]]])):
end:


  #Процедура изображения точек на вращающ.-ся колесе радиуса R c центром в точке i
 #Такая процедура будет полезна для визуального вращения колеса.

>    Points:=proc(i::integer,R,f)
                      local j::integer:

               PLOT(seq(POINTS([x[i]+R*cos(f+pi/3*j),
               y[i]+R*sin(f+pi/3*j)]),j=0..5)):

end:


  #Подписи шарниров на рисунке.
 #Массив из 4 элементов.

>    mas:=array(0..3,[O,A,B,C]):

   #Начальные значения и размеры (м)

>    OA:= 1.7: #длина шарнира(м)
R:=1:
           #радиус большого диска(м)
r:=OA-R:
#радиус неподвижного диска(м)

>    #Угловая  скорость OA равна 4 1/с
#и период обращения

>    omegaOA:= 4:
T:=2*pi/omegaOA:

#зададим точность до двух знаков включительно. Этого будет вполне достаточно.
pi:=evalf(Pi,2):

     #Координаты опоры O (*стартуем с нулевой точки*)

>    x[0]:=0:
y[0]:=0:

#Количество кадров K
K:=24:


>    #И теперь настало время, чтобы собрать все элементы воедино,
#и заставить их двигаться как один механизм.


>    #Создадим K кадров
for i from 0 to K
                  do
  
       
             
  #Закон движения  АO. Понятно, что ключевым параметром играет время.
               #Время непрерывно, однако мы можем заставить изменяться систему только
               #в дискретные моменты времени. Закон движения АO определяет движение системы.

                   t:=-sin(pi*i/K)*T/12;
                   phi:=pi/2+t*omegaOA;

        

               #Полярные координаты шарнира А N1

                     x[1]:= OA*cos(phi);            
                     y[1]:= OA*sin(phi);

 
# Создадим покадрово массив P.

 
 P[i]:= display(  
 
 
                   Points(1,R,-x[1]/R),

                   Cilindr(x[1],y[1],R),

                   Koleso(0,r),

                   Linia(0,1,7),

                   Koleso(1,0.05),

                   seq(TEXT([x[j]+0.1,y[j]+0.4],mas[j]),j=0..1)


):
od:

>    #Изображение механизма в движении. Все полученные кадры перебираем последовательно и получаем аннимированное движение.

>    Pic:=display(seq(P[i],i=0..K),insequence=true,thickness=2,scaling=constrained,axes=none):

>    display(Opora(0,0.1),Pic);

[Maple Plot]