' Моделирование четырехмерных процессов ' Д. Ю. Усенков, Москва ' (QuickBASIC 4.5) DIM A(101, 4) CLS SCREEN 1 ' вывод стартовой заставки LOCATE 11, 6: PRINT "Моделирование четырехмерных" LOCATE 12, 6: PRINT " объектов" DO: Otv$ = INKEY$: LOOP WHILE Otv$ = "" ' ожидание нажатия любой клавиши CLS ' расчеты LOCATE 11, 6: PRINT "Подождите немного..." IN = 1 ' начало отсчета собств. времени объекта IK = 100 ' конец отсчета собств. времени объекта ISob = 1 ' шаг отсчета собств. времени объекта II = IN ' счетчик секунд объекта PRINT "1-й этап: расчет координат" FOR I = 0 TO (IK - IN) \ ISob GOSUB Koords ' расчет X,Y,Z,T A(I, 1) = X ' координата X A(I, 2) = Y ' координата Y A(I, 3) = Z ' координата Z A(I, 4) = T ' "наши" секунды II = II + ISob NEXT I PRINT "2-й этап: поиск максимумов" XM = 0 ' будущий максимум X YM = 0 ' будущий максимум Y ZM = 0 ' будущий максимум Z FOR I = 0 TO (IK - IN) \ ISob IF XM < A(I, 1) THEN XM = A(I, 1) IF YM < A(I, 2) THEN YM = A(I, 2) IF ZM < A(I, 3) THEN ZM = A(I, 3) NEXT I PRINT "3-й этап: сортировка массива" FOR I = 0 TO (IK - IN) \ ISob FOR J = I + 1 TO (IK - IN) \ ISob IF A(I, 4) > A(J, 4) THEN SWAP A(I, 1), A(J, 1) SWAP A(I, 2), A(J, 2) SWAP A(I, 3), A(J, 3) SWAP A(I, 4), A(J, 4) END IF NEXT J NEXT I ' вывод на экран (для простоты двумерный) CLS LOCATE 11, 16: PRINT "ГОТОВО." PRINT " Для пуска нажмите любую клавишу" DO: Otv$ = INKEY$: LOOP WHILE Otv$ = "" CLS MX = 100 / XM ' коэфф. масштаба по X MY = 100 / YM ' коэфф. масштаба по Y ' цикл вывода I = 0 DO: CLS LINE (25, 120)-(255, 120), 2 LINE (140, 20)-(140, 220), 2 LOCATE 5, 5: PRINT "T="; INT(A(I, 4)) DO: XX = INT(A(I, 1) * MX) + 140 YY = 120 - INT(A(I, 2) * MY) LINE (XX - 3, YY - 3)-(XX + 3, YY + 3), 1, B I = I + 1 LOOP WHILE INT(A(I - 1, 4)) = INT(A(I, 4)) ' вывод нескольких одновременных позиций в массиве LOCATE 23, 6: PRINT "Нажимайте любую клавишу" DO: Otv$ = INKEY$: LOOP WHILE Otv$ = "" LOOP WHILE I <= ((IK - IN) \ ISob) CLS LOCATE 22, 8: PRINT " Все выведено! " DO: Otv$ = INKEY$: LOOP WHILE Otv$ = "" END ' ---------------------------------------------------------- ' подпрограмма расчета "проекционных" характеристик объекта Koords: ' РАСЧЕТ X ' равномерное движение относительно оси X ' со "скоростью" 3 ед. в 1 собств. сек. X = X + 3 ' РАСЧЕТ Y SELECT CASE II CASE IS < 20: Y = 0 ' первый этап - движение по горизонтали CASE IS < 40: Y = Y + 2 ' второй этап - "взлет" на 2 ед. в 1 собств. сек. CASE IS < 60: Y = Y - 2 ' третий этап - "снижение" на 2 ед. в 1 собств. сек. CASE ELSE: Y = 0 ' четвертый этап и до конца - по горизонтали END SELECT ' РАСЧЕТ Z ' для упрощения - все время постоянное Z = 0 ' РАСЧЕТ T SELECT CASE II CASE IS < 50: T = T + 1 ' вначале собственное время объекта идет синхронно с нашим CASE IS < 80: T = T - 1 ' вторая часть пути - уход в прошлое CASE ELSE: T = T + 1 ' а дальше - снова синхронно с нами END SELECT RETURN ' РАСЧЕТЫ ОКОНЧЕНЫ ' ----------------------------------------------------------