Откроем новую программу (FILE\NEW) и наберем следующий блок:
REM полет тела
REM построение координат
SCREEN 9:
x0 = 50
y0 = 300
x1 = 600
y1 = 100
REM координата Y
LINE (x0, y0)-(x0, y1), 12
LOCATE 18, 4: PRINT "10"
LOCATE 14, 4: PRINT "20"
LOCATE 10, 4: PRINT "30"
LINE (48, 245)-(52, 245), 11
LINE (48, 190)-(52, 190), 11
LINE (48, 135)-(52, 135), 11
REM координата X
LINE (x0, y0)-(x1, y0), 12
LOCATE 23, 19: PRINT "50"
LOCATE 23, 31: PRINT "100"
LOCATE 23, 44: PRINT "150"
LOCATE 23, 56: PRINT "200"
LOCATE 23, 69: PRINT "250"
LINE (150, 302)-(150, 298), 11
LINE (250, 302)-(250, 298), 11
LINE (350, 302)-(350, 298), 11
LINE (450, 302)-(450, 298), 11
LINE (550, 302)-(550, 298), 11
END
Ключевое слово (оператор) SCREEN 9 – обеспечивает перевод в графический режим работы программы. Для построения координат надо учитывать, что точка с координатами X=0, Y=0 лежит в верхнем левом углу экрана монитора. По-этому координаты X0, Y0 определяют начало координат, а X1, Y1- конец координат. Построение линии осуществляется оператором LINE- с указанием координат начала и конца линии и ее цвета (от 0 до 15). Строчка c ключевым словом LOCATE- означает расположить надпись в точке с указанными координатами. После запуска программы на экране появится сетка координат.
Объединим ( EDIT\COPY, EDIT\PASTE) имеющийся блок с сохраненной программой, не значительно ее видоизменив.
REM полет тела
REM построение координат
SCREEN 9:
x0 = 50
y0 = 300
x1 = 600
y1 = 100
x2 = 50
y2 = 300
REM координата Y
LINE (x0, y0)-(x0, y1), 12
LOCATE 18, 4: PRINT "10"
LOCATE 14, 4: PRINT "20"
LOCATE 10, 4: PRINT "30"
LINE (48, 245)-(52, 245), 11
LINE (48, 190)-(52, 190), 11
LINE (48, 135)-(52, 135), 11
REM координата X
LINE (x0, y0)-(x1, y0), 12
LOCATE 23, 19: PRINT "50"
LOCATE 23, 31: PRINT "100"
LOCATE 23, 44: PRINT "150"
LOCATE 23, 56: PRINT "200"
LOCATE 23, 69: PRINT "250"
LINE (150, 302)-(150, 298), 11
LINE (250, 302)-(250, 298), 11
LINE (350, 302)-(350, 298), 11
LINE (450, 302)-(450, 298), 11
LINE (550, 302)-(550, 298), 11
REM полет
v = 50
g = 9.8
a = 30
f = a * 3.14 / 180
100 q = 1
t = t + q
s = v * t * COS(f) (2.1)
h = v * t * SIN(f) - (g * t ^ 2) / 2 (2.2)
LINE (x2, y2)-(x0 + s, y0 - h), 14
x2 = x0 + s
y2 = y0 - h
IF h < 0 THEN 200
GOTO 100
200 END
Веденные дополнительные значения X2, Y2 обеспечивают привязку координат к началу системы отчета. Программа выдаст график полета тела, который в данном случае не привязан к масштабу сетки координат. Устранить это неудобство можно в ведя множитель для Y координаты 5.5 (1:5,5), а для координаты X множитель 2 (1:2).
Заменив строчки 2.1 и 2.2 на выражения 2.3 и 2.4
s = v * t * COS(f) * 2 (2.3)
h = (v * t * SIN(f) - (g * t ^ 2) / 2) * 5.5 (2.4)
получим окончательную программу полета тела (Приложение 1). График полета представлен на рисунке 2.
Рис. 2
В данном случаи он не отражает истинной траектории полета тела, так как значение координат получены с шагом (дискретой) в 1 сек. Если значению q присвоить 0,5; 0,25; 0,1; и т.д., то график приблизится к идеальной кривой полета тела.
На кривизну графика так же влияет изменение скорости и начального угла полета тела.
3.Этап третий. Работа пользователя.
Хорошую наглядность программа приобретает, когда она становится унифицированной, т.е. чтобы ее можно было успешно использовать для различных параметров. Для того, чтобы можно было менять начальные условия, несколько модернизируем уже имеющуюся программу полета тела. Но вместо тела используем пушечное ядро и попытаемся им попасть в цель находящуюся на каком-то заданном расстоянии.
Для составления программы необходимо учитывать, что начальная скорость ядра составляет примерно 200 м/с, следовательно, и дальность полета значительно возрастет, при этом сопротивлением воздуха опять пренебрегаем. Программу начнем с ввода данных в соответствии с условием задачи.
REM ЯДРО
5 INPUT « Ввести угол стрельбы от 5 до 80 град»; a
7 IF a < 5 THEN 10
IF a > 80 THEN 20
GOTO 40
10 INPUT « Угол должен быть >=5»; a
GOTO 7
20 INPUT « Угол должен быть <=80»; a
GOTO 7
40 INPUT « Ввести дальность до цели от 200 до 5000 м»; l
45 IF l < 200 THEN 50
IF l > 5000 THEN 60
GOTO 70
50 INPUT « Расстояние до цели должно быть >=200»; l
GOTO 45
60 INPUT « Расстояние до цели должно быть <=5000»; l
GOTO 45
70 INPUT « Для выстрела нажать F1»; enter
PRINT a, l
END
Данный отрезок программы, используя условные операторы (IF, THEN), позволяет присвоить переменным a(угол) и l(расстояние), необходимые значения, жестко ограниченные по условию задачи.
Допишем программу с 70-й строки используя за основу программу полета тела, изменив масштаб координат и определив место цели на координате Х:
70 INPUT « Для выстрела нажать F1»; enter
REM построение координат
SCREEN 9:
x0 = 50
y0 = 300
x1 = 600
y1 = 50
x2 = 50
y2 = 300
REM координата Y
LINE (x0, y0)-(x0, y1), 12
LOCATE 18, 4: PRINT “250”
LOCATE 14, 4: PRINT “500”
LOCATE 10, 4: PRINT “750”
LOCATE 6, 4: PRINT “1000”
LINE (48, 245)-(52, 245), 11
LINE (48, 190)-(52, 190), 11
LINE (48, 135)-(52, 135), 11
LINE (48, 80)-(52, 80), 11
REM координата X
LINE (x0, y0)-(x1, y0), 12
LOCATE 23, 19: PRINT “1000”
LOCATE 23, 31: PRINT “2000”
LOCATE 23, 44: PRINT “3000”
LOCATE 23, 56: PRINT “4000”
LOCATE 23, 69: PRINT “5000”
LINE (150, 302)-(150, 298), 11
LINE (250, 302)-(250, 298), 11
LINE (350, 302)-(350, 298), 11
LINE (450, 302)-(450, 298), 11
LINE (550, 302)-(550, 298), 11
REM цель
LINE (x0 + l / 10, 299)-(x0 + l / 10 + 5, 299), 10
LINE (x0 + l / 10, 298)-(x0 + l / 10 + 5, 298), 10
80 KEY(1) ON
ON KEY(1) GOSUB 90
GOTO 80
REM полет
90 v = 200
g = 9.8
f = a * 3.14 / 180
100 q = .0005
t = t + q
s = v * t * COS(f) * 2
h = (v * t * SIN(f) – (g * t ^ 2) / 2) * 5.5
LINE (x2, y2)-(x0 + s / 20, y0 – h / 25), 14
x2 = x0 + s / 20
y2 = y0 – h / 25
IF h < 0 THEN 200
GOTO 100
200 END
END
Функция KEY(1) устанавливает, что дальнейшее выполнение программы начнется с нажатия функциональной клавиши F1. Логично предположить, что KEY(2) устанавливает F2, KEY(3) – F3 и т.д.
Для большего эффекта нужно с 200 –й строки дописать программу вставив еще несколько строк:
200 REM взрыв
r = 30
n = 500
REM: a угол разлета
REM: r радиус разлета, n количество осколков
REM: коэффициенты 0.5 и 1 определяют ширину и высоту разлета
DIM x(n), y(n)
RANDOMIZE (TIMER)
FOR i = 1 TO n
a = -6.28 * RND / 2
rn = r * RND
xc = x2 + rn * .5 * COS(a)
yc = y2 + rn * 1 * SIN(a)
PSET (xc, yc), 9 + 9 * RND
PRESET (x(i), y(i))
NEXT
END
Данный блок программы используя массив (DIM) случайных чисел ограниченных пространством ( r ) и количеством (n) точек позволяет создать эффектный фейерверк разлета осколков.
Полностью программа представлена в Приложении 2.
Данная задача рассматривалась без учета сопротивления воздуха. Попробуем ввести поправку на сопротивление воздуха.
4. Этап четвертый. Воздействие внешних факторов.
К внешним факторам в решении задачи можно отнести случайные события, которые происходят в природе или при протекании каких либо физических процессов. В нашем случае это может быть сопротивление воздуха, порыв ветра, интенсивность горения пороха, влажность и т.д. Из всех случайных величин рассмотрим только сопротивление воздуха.
Учитывая то, что сопротивление воздуха направленно в противоположную сторону движения тела [4], то силу сопротивления можно представить в виде двух составляющих: вертикальной и горизонтальной, при этом, чем выше скорость, тем больше сопротивление и наоборот.
Выделим блок программы (Приложение 2) с 100-го кадра:
100 q = .0005
t = t + q
s = v * t * COS(f) * 2 (4.1)
h = (v * t * SIN(f) – (g * t ^ 2) / 2) * 5.5 (4.2)
Запишем составляющие горизонтальной и вертикальной скорости:
vs=v*cos(f)
vh=v*sin(f)
Но если пренебречь, тем что с высотой плотность воздуха падает и считать ее в нижних слоях атмосферы неизменной, то упрощенная формула горизонтальной и вертикальной составляющей, в соответствии с законом Аэродинамики [ 4 ], примет вид [ 5 ]:
Тогда выражение 4.1 и 4.2 можно изменить записав блок с 100-го кадра в следующем виде:
100 q = .0005
t = t + q
k = .0002
vs = v * COS(f) - (k - k / (k + v * COS(f)))
vh = v * SIN(f) - (k - k / (k + v * SIN(f)))
s = vs * t * 2
h = (vh * t - (g * t ^ 2) / 2) * 5.5
v = SQR(vs ^ 2 + vh ^ 2) (4.3)
LINE (x2, y2)-(x0 + s / 20, y0 - h / 25), 14
x2 = x0 + s / 20
y2 = y0 - h / 25
IF h < 0 THEN 200
GOTO 100
Где к - коэффициент сопротивления воздуха, который подбирается экспериментальным путем и может быть изменен в соответствии с условиями задачи, причем для вертикальной и горизонтальной составляющей может быть введен свой коэффициент, а выражение (4.3) обеспечивает пересчет скорости используя корень квадратного выражения.
Кроме этого, для большей информационности, выведем на экран значение скорости, высоты, дальности и времени:
LOCATE 1, 6: PRINT "V m/s"
LOCATE 2, 6: PRINT "H m"
LOCATE 2, 24: PRINT "S m"
LOCATE 1, 24: PRINT "T s"
LOCATE 1, 12: PRINT v
LOCATE 1, 28: PRINT t
LOCATE 2, 12: PRINT h
LOCATE 2, 28: PRINT s
Причем, первую половину необходимо разместить в программе до 80-й строки (кадра), а вторую в конце тела цикла.
Полностью программа представлена в приложении 3. Следует обратить внимание на то, что значения коэффициентов k и q в приложении 3 изменены для большей реалистичности полета ядра, так как часть ресурсов компьютера задействована для отображения текущих параметров, а выводимые значения высоты h и дальности s делятся на 5,5 и 2 соответственно для соблюдения масштаба.
К случайным событиям можно отнести и роль оператора на ход решения задачи. В данном случае изменим угол полета ядра уже в ходе решения задачи.
Что бы иметь возможность в процессе работы программы изменять угол стрельбы задействуем еще три функциональные клавиши F2, F3, F5, где F2 будет отвечать за подъем на один градус в верх, F3 – за один градус вниз, F5 – позволит прервать выполнение программы в любое время. Для этого в программе после выполнения подпрограммы выполнения фейерверка вставим блок:
ERASE x,y
210 KEY(2) ON
ON KEY(2) GOSUB 220
KEY(3) ON
ON KEY(3) GOSUB 230
KEY(1) ON
ON KEY(1) GOSUB 72
GOTO 210