Лекция 4. Оптимизация и моделирование художественно-эстетической среды, связанных со скоростью

 
С О Д Е Р Ж А Н И Е
Введение
1. Движение объектов в зависимости от скорости по заданному пути.
Пример 1. Задача о пешеходе. Определить маршрут движения путника по скошенному и нескошенному лугам так, чтобы маршрут пешехода был оптимальным.
Пример 2. Задача Снеллиуса. Определить траекторию движения луча света по двум разным средам.
Пример 3. Задача о брахистохроне. Найти кривую наискорейшего спуска.
2. Выбор энергосберегающего (или безопасного) движения судна на основе спутниковой информации.
Пример 4. Определить движения судна, если известно, что часть пути оно может идти по течению воды.
3. Движение в заданном направлении в зависимости от расстояния, направления и времени
Пример 5. Запущенной ракетой сбить самолет (мишень).
Пример 6. Определить на каком наикратчайшем расстоянии пройдут два судна (pi, и pj), при их движении в пересекающихся маршрутах.
Пример 7. Определить на каком расстоянии пройдут суда, при их движении в пересекающихся маршрутах, если первое судно, пытаясь уйти от столкновения, все время сворачивает на заданный угол.
4. Моделирование эстетической среды с использованием фактора движения
Упражнения 1-7
Приложение: тексты МК

В в е д е н и е

Многие законы природы, связанные с распространением света, электричества, жидкости, газа и т.п. можно вывести на основе понятий минимизации. Так, например, принцип Ферма гласит: в неоднородной среде свет распространяется по такой траектории, что время, затрачиваемое им на преодоление пути от одной точки до другой, минимально.

В предыдущих темах были рассмотрены первые два этапа с позиций векторного моделирования (как геометрического места точек), а третий этап (анализ) - с помощью построения целевых функций (ЦФ).

Большой круг задач связан со скоростью и временем. Здесь также могут быть задачи оптимизационного и общего планов. Причем последние также можно свести к оптимизационным.


1. Движение объектов в зависимости от скорости по задаваемым отрезкам

Из физики известно, что скорость определяется, как расстояние поделенное на время.
v=s/t,
откуда время будет: расстояние поделенное на скорость:
t=s/v.
Используя данные определения, рассмотрим серию примеров.

Пример 1. Определить маршрут движения путника по скошенному и нескошенному лугам из точки p1 в точку p2 так, чтобы маршрут его движения был оптимальным. Скорость движения по скошенному лугу равна v1, по нескошенному - v2. Что минимизировать? Расстояние или время? Конечно, время.
1. Анализ:
Исходя из формул определяющих взаимосвязь скорости, времени и расстояния, определяем, что время неизвестно и его удобно выбрать в качестве минимизирующего параметра.

2. Алгоритмизация: время движения путника по лугу 1 и лугу 2 определяется:

t1=s1/v1=|p1-p|/v1
t2=s2/t1=|p2-p|/v2
Откуда общее время:
t=t1+t2=|p1-p|/v1+|p2-p|/v2
где p можно выразить по формуле
p=(1.-s)*p11+s*p12
0 < s < 1.

2. Формирование цели (ЦФ):

t=t1+t2 -> min
или
t=t1+t2=|p1-p|/v1+|p2-p|/v2 -> min,

3. Решение заключается в задании исходных данных, переборе возможных вариантов (точек на прямой р11-р12), расчете суммарного времени прохождения по тому или иному варианту, выборе из них наименьшее по времени, построения ЦФ (зависимости времени от, например, положения точки на р11-р12 - координаты х).
Ниже дана МК решения данной задачи на языке VBS в системе "Вектор"
' Задача о пешеходе по скошенному и не скошенному лугу
' Дано:
' p1 - начало движения
' p2 - конец движения
' Известно и скорость движеня v1 по скошенному и v2 нескошенному лугам
x1=0
y1=9
Ngpoint.s x1,y1,0
x2=13
y2=0
Ngpoint.s x2,y2,0
v1 = 11
v2 = 5
' Решение
'Найти минимум времени на преодолении данного пути
' Минимизируем время
' t1 = s1/v1
' t2 = s2/v2
' область ограничений) в котором возможно
' движения пешехода на границе лугов - это p11-p12
' Задаем координаты этих точек
x11=0
y11=4
x12=15
y12=4
Text.ss p(x11,y11,0), "p11"
Text.ss p(x12,y12,0), "p12"
otrezok.s x11, y11, 0, x12, y12, 0
' Задаем начальную точку для построения графика ЦФ
x103=x11
y103=y11
x104=x11
y104=y11
tmin=1000
' Организуем цикл перебора, вычислений, сравнений и отрисовки
For u = 0. To 1.01 Step 0.1
 x = (1.-u)*x11+ u*x12
 y = (1.-u)*y11+ u*y12
otrezok.s x1, y1, 0, x, y, 0
otrezok.s x2, y2, 0, x, y, 0
s1=sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))
s2=sqr((x2-x)*(x2-x)+(y2-y)*(y2-y))
t1=s1/v1
t2=s2/v2
t=t1+t2
otrezok.s x103, y103, 0, x, t+7, 0
x103=x
y103=t+7
' Фиксируем положение точки сворота (Pmin)
if t < tmin Then
tmin=t
otrezok.s x104, y104, 0, x, t+6, 0
x104=x
y104=t+6
Xmin=x
Ymin=y
End if
Next
krug.s xmin, ymin, 0, 0.35 ' окружность в точке Pmin
Text.ss p(x1,y1,0), "p1"
Text.ss p(x2,y2,0), "p2"
Text.ss p(xmin,ymin,0), "Pmin"
Text.ss p(x1,y1+2,0), "t(x)"
VbsMsg  "Время минимальное = " & tmin _
& vbCrLf  & "В точке Xmin= " & Xmin & " Ymin =  " & Ymin



Приведем несколько задач, которые решаются аналогично вышепоставленной

Пример 2. Задача Снеллиуса. Определить траекторию движения луча света из точки p1, в точку p2, по двум разным средам, если известно, что скорость распространения света в верхней среде v1, а в нижней - v2

Задача решается на основе дифференциальной геометрии и считается трудной. Однако умение формализовать задачу, в плане постановки задачи и перебора всевозможных вариантов ее решения делает возможным решение таких задач без привлечения дифференциальной геометрии.
Итак формализация задачи:
1) Задание исходных данных: начальная р1 и конечные р2 точки движения луча.
2) Задание границы сред: р11-р12
3) Формирование цели (целевой функции):
t=t1+t2 -> min
или
t=t1+t2=|p1-p|/v1+|p2-p|/v2 -> min,
где p
p=(1.-s)*p11+s*p12
Ограничения: 0 < s < 1.
Таким образом задача свелась к задаче о пешеходе по скошенному и не скошенному лугу.


Пример 3. Задача о брахистохроне. Найти кривую наискорейшего спуска. На этапе анализа замечаем, что скорость движения падающих  тел зависит от времени падения. Можно в точке pi на горизонтали, разделяющей пространство на две части принять, что скорость в верхней части определена v1, а в нижней v2 и  свести к задаче движения по скошенному и нескошенному лугу.

Формализация.
Целевая функция
t=t1+t2=|p1-pi|/v1+|pi-p2/v2 -> min
где
pi=(1.-s)*|p11 + s*p12
Ограничения
0 < s < 1
 

Графическая интерпретация постановки и нахождения ЦФ в задаче о брахистохроне.

Найдена для кривой одна точка, однако организовав дополнительный цикл разбиения всей высоты (y1-y2). можно получить множество точек искомой кривой. На решение данной задачи Исаак Ньютон (по собственному его признанию) потратил 12 часов непрерывного обдумывания.


2. Выбор энергосберегающего (или безопасного) движения судна на основе спутниковой информации.

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

Со спутника принимается фотоизображение театра действий на компьютер, который, обрабатывая его, "снимает" облака и довольно точно представляет информацию о движении ветра, воды, дислокации судов и т.п. На основе этой информации можно корректировать движение судна в целях безопасности или оптимизации.

Рассмотрим конкретный пример.

Пример 4. Судно движется из пункта р1 в пункт р2. Со спутника получены данные о направлении потока воды (или ветра), не совпадающего с курсом судна. Капитан судна принимает решение часть пути двигаться по течению воды (р1-р11), а затем (в точке р ) повернуть в нужном направлении. Необходимо определить точку р поворота.

Итак, требуется определить маршрут движения судна из точки р1 в точку р2 из условия того, что часть пути судно может двигаться по течению воды (р1-p11). Известны скорость судна v1=12 миль/час, скорость течения v2=7 миль/час.

Формализация (алгоритмизация) задачи. Время движения судна по течению воды (р1-p)  и далее по прямой (р-p2) определяется:
t=s12/(v1+v2)+s11/v1
и должно стремиться к минимуму.
Время в зависимости от положения точки на прямой р1=р11 является ЦФ. Минимум ЦФ даст искомое минимальное значение времени движения судна.
Причем абсцисса минимального значения соответствует точке, где необходимо свернуть с потока. Длина части маршрута по течению s11 и части движения по прямой s12 вычисляется из соотношений:
s12 =| p-p1|,
s11 = |p2-p| ,
где точка р определяется по формуле:
p=(1-s)*p1 + s*p10 при изменении s от нуля до единицы.
Таким образом, задача сводится к простому перебору точек на прямой р1-р10, вычислению времени в каждом случае на прохождение маршрута,  сравнению их и выбору из них наименьшего.
 
 
На рис. показан графический результат моделирования данной задачи.
Время движения судна по течению воды и вне его равно 15.0866 часа, что значительно меньше, чем по прямой (t1=17.8924 час).

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


3. Движение в заданном направлении в зависимости от расстояния, направления и времени

В ряде задач движение перебираемых точек зависит не  от безразмерного параметра s (как это делалось в предыдущей задаче перебора точек на прямой р1-р11), а от конкретного расстояния или направления движения, определяемого чаще единичным вектором.

Движение от точки р1 по направлению единичного вектора p99 задается:
p=p1+s*p99,
где точка р определяется в зависимости от s - расстояния от р1.
В свою очередь, если отрезок задан двумя точками р1, р2, единичный вектор р99 вычисляется:
р99=(р2-р1)/|p2-p1|
А если известна скорость движения, можно получить движения точки в заданном направлении в зависимости от времени:
p =p1+v*t*p99,
где p99 - единичный вектор.

Пример 5. Из точки p1 в заданном направлении р2 движется мишень pi со скоростью v1. В направлении мишени в момент ее начала движения запущена самонаводящая ракета pj, вектор движения которой p10-pj направлен все время на мишень pi. Скорость движения ракеты v2 > скорости мишени.  Задача сбить мишень.

Формально задачу можно поставить так. Найти минимальное расстояние, между ракетой и мишенью и в какое время это произойдет. Скорость мишени и ракеты известны. Для начала определим единичный вектора для мишени и ракеты по их направлениям:
p99i=(p2-p1)/|p2-p1|
p99j=(p1-p10)/|p1-p10|
Значит за время ti они от стартовой точки согласно каждой своей скорости пройдут путь равный вектору (время на скорость и единичный вектор)
pi=p1+t*v1*p99i
pj=p10+t*v2*p99j
За следующий промежуток времени направление движения мишени не изменится и поэтому его единичный вектор будет тот же, а единичные вектор направления ракеты будет вычисляться по формуле
pj=pj+t*v2*pi
Расстояние между ракетой и мишенью определяется:
s=|pj-pi| -> min
Минимум график зависимости расстояния между ракетой и мишенью от времени (или от положения токи pi, как дано на рисунке)  даст время,  в какой момент ракета настигнет мишень, а узнав время определим по формуле  pi=p1+t*v1*p99i и критическую точку.
 

 


Пример 6. Определить на каком наикратчайшем расстоянии пройдут два судна (pi, и pj), при их движении в пересекающихся маршрутах. Известны скорость первого судна (v1) и второго (v2). Направление движения судов определены векторами p1-p2   и p11-p12
Анализ и формализация задачи.
1. Необходимо смоделировать движение того и другого судна в зависимости от времени (переменный независимый параметр)
pi=p1+t*v1*p99i
pj=p10+t*v2*p99j
где:
p99i=(p2-p1)/|p2-p1|
 p99j=(p12-p11)/|p11-p12|
Ставим цель
F=sij=|pi-pj| -> min
Здесь, конечно ЦФ не стремится к минимуму, а просто мы ищем  минимум.
График ЦФ буде зависимостью расстояния от переменной времени.
 
Пример 7. Определить на каком наикратчайшем расстоянии пройдут два судна (pi, и pj), при их движении в пересекающихся маршрутах, если судно, пытаясь уйти от столкновения, все время сворачивает на заданный угол. Известны скорость первого судна (v1) и второго (v2).

Задача подобна задаче с мишенью, за исключением того, что судно pj движется не в направлении мишени (второго судна) а в направлении, определяемого углом сворота.
Формализация.
s= |pi-pj| -> min
pi=p1+t*v1*(p1-p2)/|p1-p2|
pj=p10+t*v2*(p10+dx)-p3)/|p10+dx)-p3|
где t - переменный параметр, dx - шаг приращения, а р3 - предыдущее ( в цикле) р10.
 
Так выглядит  ситуация движения судов и ЦФ примера 6.


 4. Моделирование эстетической среды с использованием фактора движения

Попытки формирования фактора движения в станковых работах препринимали футуристы. Действительно движение (зафиксированные фазы движения) - это ритм, который является мощной составляющей  любой композиции, поэтому применение этого приема всегда будет выглядеть эстетичным.
Представьте сидит человек и машет ногой. С эдной стороны - этим можно определить эргономические требования, например, к проектируемой мебели, а с другой, появляется что-то новое и с эстетической стороны.
Упражнение 1. Требуется схематично смоделировать человека.
  
Решение задачи.
Для движения составляющмих частей структуры, нужно знать координаты начало, конца каждого отрезка. Вначале можно схему нарисовать на экране, потом сохранить диалог и уже в полученной МК, задать , точки, отрезки, как вам требуется. Кроме того, для удобства (задания толщины, цвета сразу всех линий) всё поместим в группу.

' Мк формирования схемы человека
krug.s 0,6.83,0, 0.7
n1 = LastNmb ' n1 - c какого элемента помещать в группу
Otrezok.s 0,6,0,0,5,0
Otrezok.s 0,5,0,0,1,0
Otrezok.s 0,1,0,-3,-2,0
Otrezok.s -3,-2,0,-2,-5,0
Otrezok.s -2,-5,0,-3.5,-6,0
Otrezok.s 0,0,0,0.4,-3,0
Otrezok.s 0.4,-3,0,3.5,-4,0
Otrezok.s 3.5,-4,0,4,-5.3,0
Otrezok.s -4,4.6,0,-7,5,0
Otrezok.s 0,4.6,0,-4,4.6,0
Otrezok.s -7,5,0,-8,5,0
Otrezok.s 0,4.6,0,2.7,2.7,0
Otrezok.s 2.7,2.3,0,2.7,-0.7,0
Otrezok.s 2.7,-0.7,0,1.64,-1.36,0
n2 = LastNmb+1 ' по какой
MoveToGroup n1, n2, "tst group" ' tst group - имя группы - любое



Перед тем как решить задачу на вращение звеньев (состоящих из несколько отрезков или объектов), решим задачу попроще.
Упражнение 2. Пусть задан отрезок, у которого начало и конец не лежат в начале системы координат.  Требуется организовать цикл вращения отрезка вокруг его начальной точки.

Решение.
Используем матрицу преобразования поворота и сдвига (см методы системы "Вектор")
<test.vbs>
' Вращение отрезка вокруг начала отрезка
' оси
Otrezok.s 0,0,0, 5,0,0
Text.ss p(5,0,0), "х"
Otrezok.s 0,0,0, 0,5,0
Text.ss p(0,5,0), "y"
' дано
Otrezok.s 2,2,0, 4,2,0
SetWidthColor 199, 0, 0, 250
' Вращение через матрицу сдвига и поворота
' сначала сдвигаем в ноль, поврачиваем, а потом опять сдвигаем
For fi=0 To 360 Step 15
Otrezok.s 2,2,0, 4,2,0
obj.origin(0)=-2
obj.origin(1)=-2
obj.SetH
obj.zAngle=-fi
obj.SetH
obj.origin(0)=2
obj.origin(1)=2
obj.SetH
Next


Для решения задачи звеньев состоящих из несколько отрезков, можно воспользоваться  заданием их полилинией
 Упражнение 3. Задать движение звена, состоящего из нескольких отрезков.

Алгоритм решения: побен задачи упражнения 2, за исключения того, что вместо отрезка задается полилиния.
' Задаем звено: голень-ступня
Polyline.Reset
For fi=-15 To 75 Step 10
Polyline.Reset
Polyline.AddP t1
Polyline.AddP t2
Polyline.AddP t3
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
SetWidthColor 199, 0, 0, 250
obj.origin(0)=-t3.x
obj.origin(1)=-t3.y
obj.SetH
obj.zAngle=-fi
obj.SetH
obj.origin(0)=t3.x
obj.origin(1)=t3.y
obj.SetH
Next
Полный текст МК см. здесь


Упражнение 4. Аналогично можно организовать вращение руки
 

Полный текст МК см. здесь


Упражнение 4. Заданы отрезок и круг. Требуется организовать вращение звена "отрезок-круг" вокруг начала отрезка

Решение.
Звено: отрезок-круг каждый раз формируем  в группу, а затем вращаем подобно тому, как поступали выше.
 <test2.vbs>
 ' Вращение звена "отрезок-круг" вокруг начала отрезка
' Вращение через матрицу сдвига и поворота
' сначала сдвигаем в ноль, повoрачиваем, а потом опять сдвигаем
For fi=0 To 360 Step 15
         Otrezok.s 2,3,0, 5,4,0
         n1 = LastNmb ' n1 - c какого элемента помещать в группу
         Krug.ss p(5,4,0), 1, p(0,0,1)
         randomize
         n11=int(rnd(1)*250+1)
         n12=int(rnd(1)*250+1)
         n13=int(rnd(1)*250+1)
         SetFillColor n11, n12, n13
         n2 = LastNmb+1 ' по какой
         MoveToGroup n1, n2, "tst group" ' tst group - имя группы - любое
         obj.origin(0)=-2
         obj.origin(1)=-3
         obj.SetH
         obj.zAngle=-fi
         obj.SetH
         obj.origin(0)=2
         obj.origin(1)=3
         obj.SetH
Next



А дальше несколько упражнений на динамику движений по утверждению д.т.н. Кузлякиной

Упражнение 5. Смоделировать движение цилиндра
Решение.
Ошиблись (МК):  Движение сделали не поступательноу, а вращательное. В результате получили картинку в стиле футуризма.



Упражнение 6. Смоделировать все же движение цилиндра правильно
Здесь (МК) все сделали правильно, однако картинка получилась скучная



Упражнение 7. Смоделировать движение 3-х цилиндров (MK)

 


Приложение. МК (полный текст) решаемых по уроку задач

<Men2.vbs> ' Рисуем человечка и вращаем его ногу
Set t1 =p(4.5,0.25,hp/2)
Set t2 =p(3,0.65,hp/2)
Set t3 =p(3,3.7,hp/2)
Set t4 =p(0,4.3,hp/2)
Set t5 =p(0,8,hp/2)
Set t6 =p(0.1,9,hp/2)
Set t7 =p(0.9,9.7,hp/2)
Set t8 =p(1.76,6.41,hp/2)
Set t9 =p(3.74,7,hp/2)
Set t10 =p(3.84,7.77,hp/2)
Set t11 =p(4.66,8.1,hp/2)

Polyline.AddP t3
Polyline.AddP t4
Polyline.AddP t5
Polyline.AddP t6
Polyline.AddP t7
Polyline.AddP t6
Polyline.AddP t5
Polyline.AddP t8
Polyline.AddP t9
Polyline.AddP t10
Polyline.AddP t11
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
SetWidthColor 199, 0, 0, 250

' Задаем звено: голень-ступня
Polyline.Reset
For fi=-15 To 75 Step 10
    Polyline.Reset
    Polyline.AddP t1
    Polyline.AddP t2
    Polyline.AddP t3
    Polyline.SaveInDoc ( ngroup )
    Polyline.Draw
    SetWidthColor 199, 0, 0, 250
    obj.origin(0)=-t3.x
    obj.origin(1)=-t3.y
    obj.SetH
    obj.zAngle=-fi
    obj.SetH
    obj.origin(0)=t3.x
    obj.origin(1)=t3.y
    obj.SetH
Next

' SetWidthColor 199, 250, 0, 250

' Рисуем голову человечка
Krug.ss T7, 0.5, p(0,0,1)
SetWidthColor 199, 250, 0, 0
SetFillColor 250, 0, 0

Otrezok.ss p(-2,3,hp/2), p(2,3,hp/2)
SetWidthColor 520, 0, 250, 0
Otrezok.ss p(0,0,hp/2), p(0,3,hp/2)
SetWidthColor 320, 0, 250,0
Otrezok.ss p(-1,0,hp/2), p(1,0,hp/2)
SetWidthColor 320, 0, 0,250



<Men3.vbs>
' Рисуем человечка
Set t1 =p(4.5,0.25,hp/2)
Set t2 =p(3,0.65,hp/2)
Set t3 =p(3,3.7,hp/2)
Set t4 =p(0,4.3,hp/2)
Set t5 =p(0,8,hp/2)
Set t6 =p(0.1,9,hp/2)
Set t7 =p(0.9,9.7,hp/2)
Set t8 =p(1.76,6.41,hp/2)
Set t9 =p(3.74,7,hp/2)
Set t10 =p(3.84,7.77,hp/2)
Set t11 =p(4.66,8.1,hp/2)

Polyline.AddP t3
Polyline.AddP t4
Polyline.AddP t5
Polyline.AddP t6
Polyline.AddP t7
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
SetWidthColor 199, 0, 0, 250

' Задаем звено: голень-ступня
Polyline.Reset
For fi=-15 To 75 Step 15
Polyline.Reset
Polyline.AddP t1
Polyline.AddP t2
Polyline.AddP t3
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
SetWidthColor 109, 0, 0, 250
obj.origin(0)=-t3.x
obj.origin(1)=-t3.y
obj.SetH
obj.zAngle=-fi
obj.SetH
obj.origin(0)=t3.x
obj.origin(1)=t3.y
obj.SetH
Next
 

' звено: плечо-предплечье - кисть - пальцы
Polyline.Reset
For fi=-60 To 40 Step 25
Polyline.Reset
Polyline.AddP t5
Polyline.AddP t8
Polyline.AddP t9
Polyline.AddP t10
Polyline.AddP t11
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
SetWidthColor 100, 250, 0, 50
obj.origin(0)=-t5.x
obj.origin(1)=-t5.y
obj.SetH
obj.zAngle=-fi
obj.SetH
obj.origin(0)=t5.x
obj.origin(1)=t5.y
obj.SetH
Next

' SetWidthColor 199, 250, 0, 250

' Рисуем голову человечка
Krug.ss T7, 0.5, p(0,0,1)
SetWidthColor 199, 250, 0, 0
SetFillColor 250, 0, 0

Otrezok.ss p(-2,3,hp/2), p(2,3,hp/2)
SetWidthColor 520, 0, 250, 0
Otrezok.ss p(0,0,hp/2), p(0,3,hp/2)
SetWidthColor 320, 0, 250,0
Otrezok.ss p(-1,0,hp/2), p(1,0,hp/2)
SetWidthColor 320, 0, 0,250



' Движение цилиндра не поступательное, а вращательное

<Kuzl1.vbs>
S=6 ' длина шатуна
R=5
Set p1=p(0,0,0)
Set p2=p(0,10,0)
s1=0
a=2
b=4
' Parall.SS2 p(-1,2,0), a, b, p(0,0,1)
For fi=0 To 6.28 Step 0.05
 x=R*cos(fi)
 y=R*sin(fi)
 Otrezok.s 0,0,0,x,y,0
      SetColor 70,120,220
 Ngpoint.ss p(x,y,0)
      Set p3=p(x+s, y, 0)
 Set p4=p(x-s, y, 0)
 Otrezok.s x,y,0,0,s+4,0
      SetColor 170,10,150
 Parall.SS2 p(x,y,0), a, b, p(0,0,1)
 randomize
 n1=int(rnd(1)*250+1)
 n2=int(rnd(1)*250+1)
 n3=int(rnd(1)*250+1)
 Parall.SetNuNvFillColor 0, 0, n1, n2, n3
 Delay 0.05
Next



<Kuzl2.vbs>
' Движение цилиндра

S=7 ' длина шатуна
R=2
Set p1=p(0,0,0)
Set p2=p(0,10,0)
s1=0
a=2
b=4
' Parall.SS2 p(-1,2,0), a, b, p(0,0,1)
For fi=0 To 5*6.28 Step 0.2
 x=R*cos(fi)
 y=R*sin(fi)
' Otrezok.s 0,0,0,x,y,0
 Ngpoint.ss p(x,y,0)
      Set p3=p(x+s, y, 0)
 Set p4=p(x-s, y, 0)
 s2=180
 Set K = Compl.PerDugDug (p1,p2,s1,p3,p4,s2)
 Parall.SS2 p(K.x-1,K.y-2,0), a, b, p(0,0,1)
           Parall.SetNuNvFillColor 0, 0, 250, 0, 0
 Otrezok.s K.x,K.y,0,x,y,0
 Ngpoint.ss K
 Delay 0.05
' SetInvisibleAll
Next



<Kuzl3.vbs>
' Движение 3-х цилиндров
S=7 ' длина шатуна
R=2
Set p1=p(0,0,0)
Set p2=p(0,10,0)
Set p11=p(0,0,0)
Set p12=p(10,0,0)
Set p21=p(0,0,0)
Set p22=p(-10,0,0)
a=2
b=4
' Parall.SS2 p(-1,2,0), a, b, p(0,0,1)
For fi=0 To 5*6.28 Step 0.2
 x=R*cos(fi)
 y=R*sin(fi)
' Otrezok.s 0,0,0,x,y,0
 Ngpoint.ss p(x,y,0)
      Set p3=p(x+s, y, 0)
 Set p4=p(x-s, y, 0)
 Set K = Compl.PerDugDug (p1,p2,0,p3,p4,180)
 Parall.SS2 p(K.x-1,K.y-2,0), a, b, p(0,0,1)
 n1=int(rnd(1)*250+1)
 n2=int(rnd(1)*250+1)
 n3=int(rnd(1)*250+1)
 Parall.SetNuNvFillColor 0, 0, n1, n2, n3

'          Parall.SetNuNvFillColor 0, 0, 250, 0, 0
      Set p13=p(x, y+s, 0)
 Set p14=p(x, y-s, 0)
 Set K1 = Compl.PerDugDug (p11,p12,0,p13,p14,180)
 Parall.SS2 p(K1.x-2,K1.y-1,0), b, a, p(0,0,1)
      ' Parall.SetNuNvFillColor 0, 0, 0, 250, 0
 n1=int(rnd(1)*250+1)
 n2=int(rnd(1)*250+1)
 n3=int(rnd(1)*250+1)
 Parall.SetNuNvFillColor 0, 0, n1, n2, n3
      Set p23=p(-x, y+s, 0)
 Set p24=p(-x, y-s, 0)
 Set K2 = Compl.PerDugDug (p21,p22,0,p23,p24,180)
 Parall.SS2 p(K2.x+2,K2.y-1,0), -b, a, p(0,0,1)
 n1=int(rnd(1)*250+1)
 n2=int(rnd(1)*250+1)
 n3=int(rnd(1)*250+1)
 Parall.SetNuNvFillColor 0, 0, n1, n2, n3
'      Parall.SetNuNvFillColor 0, 0, 0, 0, 250
      Otrezok.s K2.x,K2.y,0,x,y,0
     SetColor n1,n2,n3
      Otrezok.s K1.x,K1.y,0,x,y,0
     SetColor n1,n2,n3
 Otrezok.s K.x,K.y,0,x,y,0
     SetColor n1,n2,n3
 Delay 0.05
' SetInvisibleAll
Next