Расчет начальных координат объектов Raketa и Sputuik
Министерство образования Российской Федерации
АНО
Международный институт «ИНФО-Рутения»
Московский государственный институт стали и сплавов
Курсовая работа
по курсу: Алгоритмизация и программирование
Тема:
Расчет начальных координат объектов Raketa и Sputuik
г. Боровичи
Задание
Перехват спутника ракетой. Спутник летит по круговой орбите слева направо. Ракета стартует из левого нижнего угла экрана. Управление моментом старта и вектором скорости ракеты (скорость постоянна)
Ракета стартует из левого нижнего угла экрана. Спутник летит слева направо, начиная с левого верхнего угла экрана по круговой орбите с центром в левом нижнем углу экрана и радиусом равным высоте экрана. Спутник изображен в виде вытянутого треугольника. Ракета имеет рисунок в форме стрелки и управляется под действием нажатия стрелок (LEFT или RIGHT - поворот влево или вправо). При контакте (определяется по расстоянию между объектами) спутник распадается на фрагменты в виде кружков.
DECLARATE SUB comm (vs, da, ar, com$)
вычисление команды на перемещение объекта Raketa
DECLARATE SUB coord (v, ar, dt, x, y)
вычисление новых координат объекта Raketa
DECLARATE SUB angle (ar, ang$)
вычисление угла разворота объекта Raketa
DECLARATE SUB Raketa (d$, x, y, ang$, ar, xc.yc, r, st)
перемещение объекта RaketaSUB coord (x1, y1, t, dt, vx, vy, ang1$)
вычисление новых координат объекта Sputnik
DECLARATE SUB Sputnik (x1, y1, st, do$, ang1$)
перемещение объекта SputnikSUB contact (xc, yc, st, x1, y1)
реализация контакта между объектами
SCREEN 9. WINDOWS (0, 0)-(800, 600). COLOR, 1
назначение синего цвета фона
t = 0: dt = 1
назначение отсчета текущего времени t интервалом dt
х = 0: у = 0
назначение начальной точки рисования объекта Raketa
v=10: vs=0
значение скорости ракеты постоянно и интервал изменения скорости равен нулю
ar=-1.5708: da=.15
начальное значение угла разворота ar объекта Raketa в радианах и интервал изменения угла da
d$ = bu20 e15 r5 f15 d20 y17 g17 u20 br5
макет рисунка объекта Raketa (строка оператора DRAW без символов закрашивания фигуры)
х1 = 0: y1=600
начальные координаты спутника
ar1 = -1.5708: da1 =.1
начальное значение угла ar1 расположения объекта Sputnik в радианах и величины изменения угла da1 при перемещении объекта Sputnik за 1 цикл
vx = 5: vy = 0
начальное значение компонент вектора скорости объекта Sputnik
do$ = u10 m+59,10 m-50,10 u10 br5
макет рисунка объекта Sputnik
r = 100
константа для вычисления контрольной точки контакта объектов
sr = 0
флаг, принимающий значение 1 при наличии контакта DO
начало цикла движения объектов
t = t + dt
счетчик времени
i = i + 1
счетчик цикла
angl = da1 * i
расчет угла поворота объекта Sputnik
x1 = -600 * sin (ang1)= 600 * cos (ang1)
расчет новых координат объекта Sputnik
vy = 5 * sin (ang1)
vx = -5 * cos (ang1)
расчет текущих значений вектора скорости объекта Sputnik
CALL comm(x1, y1, t, dt, i, vx, vy, ang1$)
расчет координат объекта Sputnik
CALL comm(vs, da, v, ar, com$)
определение команды на перемещение объекта Raketa (переменной com$ присваивается символ нажатой клавиши)
CALL coord(v, ar, dt, x, y)
расчет новых координат объекта Raketa
CALL angle(ar, ang$)
расчет угла разворота объекта Raketa
CALL ракета (d$, x, y, ang$, ar, xc, yc, r, st)
перемещение рисунка объекта Raketa
окончание работы программы (выход из цикла DO-LOOP) производится по одному из двух условий: либо нажата клавиша s, либо st = 1 (что означает наличие контакта)
CALL contact (xc, yc, st, x1, y1)
вычисление условий контакта путем сравнения координат контрольной точки (хс, ус) объекта Raketa и координат начальной точки рисования (xl, yl) объекта Sputnik
LOOP
конец цикла движения объектов
END
SUB angle (ar, ang$)
пересчет угла в радианах аr в угол в градусах ang$, требуемый оператором DRAW
pi = 3.1415
число π
ad = INT(ar * 180 / pi)
угол в градусах в числовой форме
ad$ = $(ad)
угол в градусах в символьной форме
IF ad >= 0 THEN adS = "+" + LTRIM$(RAK$(ad))
при положительном угле символ «+» будет отсутствовать, а он нужен в строке оператора DRAW, поэтому он добавляется
ang$ = "ta" + ad$
формирование фрагмента строки оператора DRAW END SUB
SUB comm (vs, da, v, ar, com$)= 6.2830 - число 2πi = l TO 1000
старт скорость ракета перехват спутник
замедляющий цикл, необходимый для того, чтобы нажатая клавиша была принята оператором INKFY$. Если не нажата ни одна клавиша, значение переменной соm$ равно пустой строке и движение объекта «Ракета» продолжается со старыми значениями параметров v и аг
com$ = INKEY;: IF com; <> "" THEN EXIT FORiRIGHTS(com$, I) = "M" THEN ar = ar - da
нажата клавиша RIGHT, угол уменьшился
IF RIGHTS(com$, 1) = "К" THEN ar = ar + da
нажата клавиша LEFT, угол увеличился
IF ar > pi2 THEN ar = ar - pi2
контролируется полный оборот, так как значение угла не может превышать 2π по модулю
IF ar < -pi2 THEN ar = ar + pi2 IF v > 0 THEN SOUND 37 + v * 500, .1
при увеличении скорости увеличивается частота сопровождающего звука. END SUB
SUB contact (хс, ус, st, xl, yl
расчет условия контакта
DIM xo(10), yo(10), dxo(10), dyo(10)
dist = SQR((x 1 - хс)^2 + (yl - ус)^2)
расчет расстояния между объектами
IF dist < 50 THEN
при расстоянии меньше 50 пикселов фиксируется контакт (флаг st равен. единице) st = 1
RANDOMIZE TIMER
FOR i = l TO 10
расчет начальных координат фрагментов объекта Sputuik
xo(i) = x1: yo(i) = yl(i) = 10 * RND: dyo(i) = 20 * RNDii=l TO 10
изображение фрагментов в виде разлетающихся белых кружков радиуса 5 пикселов (приращения координат их центров случайны, поэтому каждый кружок перемещается в своем направлении)
xo(i) = xo(i) + dxo(i): yo(i) = yo(i) + dyo(i)(xo(i), yo(i)), 5iWHILE xo(1) < 1000 OR yo(1) < 750
движение фрагментов прекращается, когда первый фрагмент достигнет границы экрана
END IFSUBcoord (v, ar, dt, x, y)
координаты х и у объекта Raketa рассчитываются по законам механики
dx = -v * SIN(ar) * dt: dy = v * COS(ar) * dt= x + dx: у = у + dy
END SUBcoord 1 (xl, yl, t, dt, i, vx, vy, angl$)
расчет координат движения объекта Sputnik х1 и у1 (рассчитываются
по законам механики)
x1 = 600 * sin (ang1)= 600 * cos (ang1)
рассчитываются координаты объекта Sputnik
vy = 5 * SIN(ang1)
vx = 5 * COS(ang1)
расчет текущих значений вектора скорости угол разворота фигуры спутника равен ang1 за i циклов объекта
Sputnik
angl$ = "ta" + ad$
формирование фрагмента строки для оператора DRAW. END SUB
RAKETA (d$, x, y, ang$, ar, xc, yc, r, st)
рисунок объекта RAKETA
PRESET (x, y)
фиксация точки начала рисования
figpnt$ = "сЗ" + ang$ + d$ + "p5,3 b15"
формирование строки рисунка (строка собрана из символа цвета 3, угла разворота, макета рисунка, символов внутренней окраски)
DRAW figpnt$
рисование фигуры объекта RAKETA
PRESET (x, y)
вторичная фиксация начальной точки (необходима, так как последняя точка рисунка может не совпасть с начальной точкой - а от нее рассчитываются координаты нового положения фигуры)
FOR i = l TO 30000: NEXT i
замедляющий цикл позволяет задержать изображение объекта на время, необходимое для глаза, перед тем, как стереть его
figdel$ = "с0" + d$ + "р0,0 b15"
DRAW figdel$
стирание объекта RAKETA
PRESET (x, у)
возвращение начальной точки dar = 1.27
угол в радианах, необходимый для расчета координат контактной точки (хс, ус) (эта точка находится прямо по курсу объекта перед ним на близком расстоянии - сделано это по той причине, что точка с координатами (х, у) находится в хвосте и неудобно по ней фиксировать контакт)
хс = х + r * COS(ar + dar): ус = у + r * SIN(ar + dar)
расчет координат хс и ус
PSET (х, у) ставится точка белым цветом, которая не стирается и изображает шлейф от движения объекта
IF st > 0 THEN DRAW figpnt$
восстановление рисунка объекта, который в момент контакта оказывается стертым. END SUB
Sputnik (xl, yl, st, do$, angl$)
рисунок объекта Sputnik
IF st = 0 THEN (xl,yl)
фиксация начальной точки рисования
figpnt$ = "с12" + angl$ + do$ + "p14,12 b15"
формирование строки оператора DRAW с окраской и заданным углом разворота
DRAW figpnt$
рисование фигуры объекта Sputnik PRESET (xl.yl), возврат начальной точки
OR i = 1 ТО 30000: NEXT i
замедляющий цикл для фиксации объекта на экране
figdel$ = "с0" + do$ + "р0,0 b15"
формирование строки стирания объекта Sputnik
DRAW figdel$
стирание объекта Sputnik
PRESET (xl, yl)
возврат начальной точки (если ее не возвращать, то может появиться эффект размазывания фигуры объекта)
END IFSUB