' ПЕРЕМЕННЫЕ: '********************************* ' W(1) - предназначена для пересчета градусов в радианы ' W(2) - предназначена для пересчета радиан в градусы ' W(3) - принимает участие в выборе оптимальной тройки углов из набора 'представляет из себя сумму абсолютных разностей между 'соответствующими углами ' W(4) - подсчет числа литералов в S$ при ручном наборе углов F & Q ' W(5) - переменная задающая приращение угла X в цикле. ' W(6) - переменна, предназначенная для того, чтобы следить за тем, ' каконе максимальное значение может иметь X при заданных Q & F ' W(7) - отслеживает знак "поправки S" в зависимости от того, какаой ' знак у угла X. ' W(8) - задает Х координату при графическом отображении точки F,Q ' на сером экране ' W(9) - задает У координату при графическом отображении точки F,Q ' на сером экране ' W(10) - переменная, в которой отслеживаются первый ипоследующие ' проходы церез циклы программы. (Её применение очень вожно ' при ручном режиме: если W(10) = 1 , то имеем самый первый ' ввод от руки углов F & Q, если же W(10) = 2, то имеем ' последующие вводы от руки значения F & Q. Для первого ввода ' алгоритм отличается ' W(11) - в этой ячейке запоминается значение угла X, вычисленного для ' данной F,Q точки ПК и ВЫБРАННОГО из набора (необходимо ' для сравнения с последующим значением угла X, чтобы осу- ' ществить выбор из набора троек углов) ' W(12) - в этой ячейке запоминается значение угла L, вычисленного для ' данной F,Q точки ПК и ВЫБРАННОГО из набора (необходимо ' для сравнения с последующим значением угла X, чтобы осу- ' ществить выбор из набора троек углов) ' W(13) - в этой ячейке запоминается значение угла M, вычисленного для ' данной F,Q точки ПК и ВЫБРАННОГО из набора (необходимо ' для сравнения с последующим значением угла X, чтобы осу- ' ществить выбор из набора троек углов) ' W(14) - значение "X" компоненты вектора отвесной линии - необходимо ' для организации верификации ' W(15) - значение "Y" компоненты вектора отвесной линии - необходимо ' для организации верификации ' W(16) - значение "Z" компоненты вектора отвесной линии - необходимо ' для организации верификации ' N - удерживает в себе значение МАКСИМАЛЬНОЙ длинны набора троек 'для точки Полярного Круга, имеющей угол Q ' I - служит для упорядочивания элементов массивов A(I), где храняться 'значения углов X, элементов массива B(I), где храняться 'значения углов L, элементов массива C(I), где храняться 'значения углов M. ' U - используется в качестве номера для просмотра предыдущего набора ' W(17) -..W(20) - обслуживают процесс выбора ОПТИМАЛЬНОЙ тройки углов 'из набора ' W(21) - индекс (№) тройки из набора, в которой содержатся углы X,L,M, 'ОПТИМАЛЬНЫЕ для перехода из ПРЕДЫДУЩЕЙ точки полярного 'круга в НОВУЮ точку ' W(22) - обслуживает сброс очереди клавиатуры ' W(23) - принимает значение 1, если угол Q > 0, и 0, если угол Q = 0 'Это необходимо для организации правильной работы программы 'в ситуации когда угол Q равен нулю, а угол F изменяет свое 'значение ' W(24) - хранит в себе ПРЕДЫДУЩЕЕ значение угла "F", это необходимо 'в ситуации когда Q = 0 для определения угла M путем прибавле- 'ния к предыдущему M разници между ПРЕДЫДУЩИМ F и ТЕПЕРЕШНИМ F ' W(25) - длина набора предыдущего состояния ' W(26) - содержит в себе номер оптимальной тройки предыдущего состояния ' W(29) - значения разности угла m '************************************************************************** DIM W(50), A(100), B(100), C(100), D(100), E(100), H(100) W(1) = 3.1415926536# / 180: W(2) = 180 / 3.1415926536# COLOR 7, 0 10 CLS : COLOR 12, 0 LOCATE 2, 50: PRINT " 121858, Москва, " LOCATE 3, 40: PRINT " Бережковская набережная 30, корпус № 1. " LOCATE 4, 47: PRINT " ФЕДЕРАЛЬНЫЙ ИНСТИТУТ " LOCATE 5, 44: PRINT " ПРОМЫШЛЕННОЙ СОБСТВЕННОСТИ " COLOR 7, 0: LOCATE 7, 52: PRINT " В отдел № 2." LOCATE 8, 41: PRINT "Патентному эксперту " COLOR 10, 0: LOCATE 8, 61: PRINT " Абросимову А.Е." COLOR 7, 0 LOCATE 15, 10: PRINT "Дополнительные (демонстрационные) материалы к заявке" COLOR 12, 0: LOCATE 15, 66: PRINT "№ 97105586:" LOCATE 17, 13: PRINT CHR$(34); "Способ дистанционного управления в копирующем режиме" LOCATE 18, 25: PRINT "антропоморфным шагающим роботом."; CHR$(34); "." COLOR 7, 0 LOCATE 25, 5: PRINT "Для продолжения: "; CHR$(17); " Page Down "; CHR$(16); ". Выход в интерпритатор: "; CHR$(17); " Alt + F4 "; CHR$(16) PLAY "O3L10CDEFGAB" 11 Z$ = INKEY$: LOCATE 1, 1: PRINT DATE$: LOCATE 3, 1: PRINT TIME$: IF Z$ = "" GOTO 11 IF RIGHT$(Z$, 1) = "Q" GOTO 20 IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "k" THEN STOP GOTO 11 20 CLS : LOCATE 3, 10: PRINT "Представленная программа наглядно демонстрирует принципы, предложен-" LOCATE 4, 5: PRINT "ные для организации структуры данных Полярного Круга Q < 30 МЕХАНИЗМА" LOCATE 5, 5: PRINT "ПОДВЕСА." LOCATE 7, 10: PRINT "Пользователь может произвольно задавать на территории Полярного Круга" LOCATE 8, 5: PRINT CHR$(34); "траекторию"; CHR$(34); " (последовательность близких F,Q точек). При этом программа" LOCATE 9, 5: PRINT "будет расчитывать и выдавать ОПТИМАЛЬНЫЕ значения углов X,L,M и разности," LOCATE 10, 5: PRINT "полученные от сравнения с предыдущей F,Q точкой полярного круга. Таким" LOCATE 11, 5: PRINT "образом пользователь получает возможность убедиться в правильности предло-" LOCATE 12, 5: PRINT "женных алгоритмов: разности Полярного Круга обычно " COLOR 12, 0: LOCATE 12, 33: PRINT "для близких точек": COLOR 7, 0 LOCATE 13, 5: PRINT "непревышают 7 градусов. Подобная организация структуры данных позволяет" LOCATE 14, 5: PRINT "избежать сильной сингулярности вблизи полярной точки." LOCATE 16, 10: PRINT "В процессе выполнения программы всякий раз при вычислениях произво-" LOCATE 17, 5: PRINT "дится ВЕРИФИКАЦИЯ полученных значений углов X, L, M (Вначале на основе" LOCATE 18, 5: PRINT "углов: F и Q вычисляются значения "; CHR$(34); "ИКС"; CHR$(34); ", "; CHR$(34); "ИГРИК"; CHR$(34); ", "; CHR$(34); "ЗЭТ"; CHR$(34); " компонент вектора" LOCATE 19, 5: PRINT "отвесной линии. Затем этиже компоненты вычисляются на основе тройки углов:" LOCATE 20, 5: PRINT "X, L, M и полученные различными методами значения компонент сравниваются.)" LOCATE 25, 5: PRINT "Для продолжения: "; CHR$(17); " Page Down "; CHR$(16); ". Предыдущая страница: "; CHR$(17); " Page Up "; CHR$(16) 30 Z$ = INKEY$: LOCATE 23, 70: PRINT TIME$: IF Z$ = "" GOTO 30 IF RIGHT$(Z$, 1) = "Q" GOTO 35 IF RIGHT$(Z$, 1) = "I" GOTO 10 IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "K" THEN STOP GOTO 30 35 CLS : LOCATE 3, 10: PRINT "Расчеты производятся в полуавтоматическом режиме, т.е. можно вводить" LOCATE 4, 5: PRINT "F, Q координаты точек "; CHR$(34); "Глобуса наклонов"; CHR$(34); " набирая их на клавиатуре, или" LOCATE 5, 5: PRINT "нажимая на "; CHR$(34); "клавиши управления курсором"; CHR$(34); ". В последнем случае, нажатие " LOCATE 6, 5: PRINT "определенных клавиш вызывает следующие действия программы: " LOCATE 8, 5: PRINT " - увеличение угла Q, - уменьшение угла Q" LOCATE 10, 5: PRINT " - увеличение угла F, - уменьшение угла F." LOCATE 12, 5: PRINT "Нажатие клавиши: - выводит на экран набор допустимых для" LOCATE 13, 5: PRINT "данной F,Q точки троек углов X,L,M (помечены '), одновременно на экране" LOCATE 14, 5: PRINT "появляется и набор, соответствующий предыдущей F,Q точке. (Вначале, при" LOCATE 15, 5: PRINT "нажатии клавиши "; CHR$(34); "Page Down"; CHR$(34); " на экран выводятся т.н. оптимальные значения" LOCATE 16, 5: PRINT "троек углов из обоих наборов). С помощью клавиш: , ," LOCATE 17, 5: PRINT " и эти наборы можно просмотреть " COLOR 12, 3: LOCATE 10, 8: PRINT " -"; CHR$(26); " " COLOR 12, 3: LOCATE 10, 40: PRINT " "; CHR$(27); "- " COLOR 12, 3: LOCATE 8, 8: PRINT " "; CHR$(24); " " COLOR 12, 3: LOCATE 8, 40: PRINT " "; CHR$(25); " " COLOR 12, 3: LOCATE 12, 22: PRINT " Page Down " COLOR 12, 3: LOCATE 16, 54: PRINT " Page Down " COLOR 12, 3: LOCATE 16, 67: PRINT " Page Up " COLOR 12, 3: LOCATE 17, 6: PRINT " Home " COLOR 12, 3: LOCATE 17, 18: PRINT " End " COLOR 7, 0 LOCATE 25, 5: PRINT "Для продолжения: "; CHR$(17); " Page Down "; CHR$(16); ". Предыдущая страница: "; CHR$(17); " Page Up "; CHR$(16) 36 Z$ = INKEY$: LOCATE 23, 70: PRINT TIME$: IF Z$ = "" GOTO 36 IF RIGHT$(Z$, 1) = "Q" GOTO 40 IF RIGHT$(Z$, 1) = "I" GOTO 20 IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "k" THEN STOP GOTO 36 40 CLS '*********************************************************************** ' Г Р А Ф И Ч Е С К О Е О Ф О Р М Л Е Н И Е Э К Р А Н А : ' задан режим 639 * 479 пикселов SCREEN 12 ' LOCATE 30, 5: PRINT " For "; CHR$(34); "STOP"; CHR$(34); " press: "; CHR$(17); " Alt "; CHR$(16); " + "; CHR$(17); " F4 "; CHR$(16) 'Темносерый "экран" LINE (320, 0)-(639, 310), 2, BF 'Вертикальная ось LINE (480, 10)-(480, 300), 0 'стрелка на вертикальной оси LINE (480, 10)-(478, 20), 0: LINE (480, 10)-(482, 20), 0 'Горизонтальная ось LINE (330, 160)-(630, 160), 0 'Стрелка на горизонтальной оси LINE (330, 160)-(340, 162), 0: LINE (330, 160)-(340, 158), 0 LINE (10, 38)-(250, 40), 12, BF ' Окружности CIRCLE (480, 160), 120, 12: CIRCLE (480, 160), 40, 0: CIRCLE (480, 160), 80, 0 LOCATE 2, 59: PRINT "Z": LOCATE 9, 44: PRINT "X" LOCATE 5, 5: PRINT CHR$(145); " = ": LOCATE 7, 5: PRINT "L = ": LOCATE 9, 5: PRINT CHR$(230); " = " '******************************************************************** ' Р А С Ч Е Т Н А Я Ч А С Т Ь . ' Присвоение начальных значений различным переменным: W(7) = 1 'Знак у поправки "S" вначале "+" W(10) = 1 'Первый ввод значений F & Q при ручном режиме 45 I = 1: T = 0 LOCATE 2, 9: PRINT " ": LOCATE 2, 5: PRINT "F = "; F LOCATE 2, 23: PRINT " ": LOCATE 2, 19: PRINT "Q = "; Q ' Остановка программы и выход в интерпритатор Z$ = INKEY$: LOCATE 1, 73: PRINT TIME$: IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "k" THEN STOP 'LOCATE 2, 50: PRINT DATE$ '########################################################################### 'Ручной ввод значений F & Q. Очистка мест куда будут 'записываться значения F & Q 'Ввод угла "F": S$ = "" 49 Z$ = INKEY$: LOCATE 1, 73: PRINT TIME$: IF Z$ = "" GOTO 49 50 W(25) = N: W(26) = W(21) 'Очистка мест, в которые выписываются оптимальные значения 'углов X, L, M LOCATE 5, 9: PRINT " " LOCATE 7, 9: PRINT " " LOCATE 9, 9: PRINT " " 'Если сразу нажаты клавиши управления курсором IF W(10) = 1 AND (RIGHT$(Z$, 1) = "H" OR RIGHT$(Z$, 1) = "P" OR RIGHT$(Z$, 1) = "M" OR RIGHT$(Z$, 1) = "K") THEN W(10) = 2: W(24) = F: GOTO 301 'Нажат "Enter" IF ASC(Z$) = 13 THEN LOCATE 2, 9: PRINT S$; " ;": GOTO 51 IF ASC(Z$) = 8 AND LEN(S$) > 0 THEN W(4) = LEN(S$) - 1: LOCATE 2, 9: PRINT " ": S$ = LEFT$(S$, W(4)): LOCATE 2, 9: PRINT S$: GOTO 49 IF ASC(Z$) = 8 AND LEN(S$) = 0 GOTO 49 IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "k" THEN STOP IF LEN(S$) > 5 GOTO 49 IF LEN(Z$) = 2 OR ASC(Z$) < 48 OR ASC(Z$) > 57 GOTO 49 S$ = S$ + Z$: LOCATE 2, 9: PRINT " ": LOCATE 2, 23: PRINT " ": LOCATE 2, 9: PRINT S$: GOTO 49 51 F = VAL(S$) 52 IF F >= 360 THEN F = F - 360: GOTO 52 53 IF F < 0 THEN F = F + 360: GOTO 53 'Стираем значение F и записываем снова LOCATE 2, 9: PRINT " ": LOCATE 2, 9: PRINT F; " ;" 'Ввод угла "Q": S$ = "" 54 Z$ = INKEY$: LOCATE 1, 73: PRINT TIME$: IF Z$ = "" GOTO 54 IF ASC(Z$) = 13 THEN LOCATE 2, 23: PRINT S$; " ;": GOTO 55 IF ASC(Z$) = 8 AND LEN(S$) > 0 THEN W(4) = LEN(S$) - 1: LOCATE 2, 23: PRINT " ": S$ = LEFT$(S$, W(4)): LOCATE 2, 23: PRINT S$: GOTO 54 IF ASC(Z$) = 8 AND LEN(S$) = 0 GOTO 54 IF RIGHT$(Z$, 1) = "k" THEN STOP IF LEN(S$) > 1 GOTO 54 IF LEN(Z$) = 2 OR ASC(Z$) < 48 OR ASC(Z$) > 57 GOTO 54 S$ = S$ + Z$ IF VAL(S$) > 90 THEN S$ = "": LOCATE 2, 23: PRINT " ": GOTO 54 LOCATE 2, 23: PRINT S$: GOTO 54 55 Q = VAL(S$): IF Q > 0 THEN W(23) = 1 S$ = "" '############################################################################ 56 W(25) = N: W(26) = W(21) W(22) = 1 57 D(W(22)) = A(W(22)): E(W(22)) = B(W(22)): H(W(22)) = C(W(22)): W(22) = W(22) + 1: IF W(22) <= N GOTO 57 FOR U = 1 TO 97: A(U) = 0: B(U) = 0: C(U) = 0: NEXT U 'Стираем ранее вычисленные оптимальные значения углов X,L,M LOCATE 5, 9: PRINT " " LOCATE 7, 9: PRINT " " LOCATE 9, 9: PRINT " " 'Рисуем точку на "экране", соответствующую углам F & Q W(8) = 480 - 4 * Q * COS(F * W(1)) W(9) = 160 - 4 * Q * SIN(F * W(1)) PSET (W(8), W(9)), 10 ' Вдальнейшем для верификации понадобятся значения X,Y & Z компо- ' нент вектора отвесной линии: LOCATE 23, 30: PRINT " ": LOCATE 25, 30: PRINT " ": LOCATE 27, 30: PRINT " " W(14) = SIN(Q * W(1)) * COS(F * W(1)): LOCATE 23, 46: PRINT "X": LOCATE 23, 50: PRINT " ": LOCATE 23, 50: PRINT W(14) W(15) = COS(Q * W(1)): LOCATE 25, 46: PRINT "Y": LOCATE 25, 50: PRINT " ": LOCATE 25, 50: PRINT W(15) W(16) = SIN(Q * W(1)) * SIN(F * W(1)): LOCATE 27, 46: PRINT "Z": LOCATE 27, 50: PRINT " ": LOCATE 27, 50: PRINT W(16) LOCATE 23, 65: PRINT " ": LOCATE 25, 65: PRINT " ": LOCATE 27, 65: PRINT " " LOCATE 21, 48: PRINT "V E R I F I C A T I O N :": LINE (345, 340)-(620, 340), 15 LINE (380, 340)-(380, 450), 15: LINE (510, 340)-(510, 450), 15 'Данные условия выполняются при вводе первой F,Q точки в ручном 'режиме. При этом обеспечивается выполнение договора об однозначности 'угла L > 0 "в момент включения электропитания МП ". IF W(10) = 1 THEN X = 0: L = Q: M = F: W(11) = 0: W(12) = Q: W(13) = F: W(10) = 2: LOCATE 5, 9: PRINT W(11): LOCATE 7, 9: PRINT W(12): LOCATE 9, 9: PRINT W(13): W(22) = F: GOTO 202 IF Q = 0 AND W(23) = 1 THEN W(23) = 0: L = 0: X = 0: M = W(13): N = 1: LOCATE 5, 30: PRINT "N = 1 ": GOTO 65 IF Q = 0 THEN L = 0: X = 0: M = W(13) + F - W(24): N = 1: LOCATE 5, 30: PRINT "N = 1 ": GOTO 65 ' Обеспечиваем проведение вычислений за пределами полярного круга IF Q >= 30 THEN X = 0: L = Q: M = F: GOTO 65 '***************************************************************** 'Вычисляем абсолютное (максимальное) значение угла X при заданных ' F & Q точки ПК. 'Парабола: IF ABS(15 - Q) <= 6 THEN W(6) = ABS((12 - ((15 - Q) ^ 2) / 12)): GOTO 59 'Выход за пределы полярного круга: IF ABS(15 - Q) >= 15 THEN W(6) = 0: GOTO 59 'Прямые: W(6) = ABS(15 - ABS(15 - Q)) 59 'перед прохожением цикла присваеваем углу X максимальное значение 'из всех возможных для данной F,Q точки полярного круга. Вдальнейшем, 'в процессе выполнения расчетов мы будем последовательно уменьшать 'значение угла X на величину приращения X = W(6) '*********************************************************************** 60 'Вычисление угла L L = COS(Q * W(1)) / COS(X * W(1)) L = ABS(W(2) * ATN((SQR(1 - L ^ 2)) / L)) ' Выводим надпись времени LOCATE 1, 73: PRINT TIME$ '************************************************************************* 61 'Проверка "на всякий случай", чтобы не было деления на 0 IF L = 0 AND X > 0 THEN M = F - 90: GOTO 65 IF L = 0 AND X < 0 THEN M = F - 270: GOTO 65 ' Вычисление значения угла M: M = F - W(7) * W(2) * ABS(ATN((TAN(X * W(1))) / SIN(L * W(1)))) 'Представление значения угла M в стандартном виде в интервале 0 - 359 65 IF M >= 360 THEN M = M - 360: GOTO 65 70 IF M < 0 THEN M = M + 360: GOTO 70 ' Принудительная остановка и выход в интерпритатор Z$ = INKEY$: IF RIGHT$(Z$, 1) = "k" THEN STOP '************************************************************************** ' В Е Р И Ф И К А Ц И Я: 80 LOCATE 23, 66: PRINT " " LOCATE 23, 66: PRINT COS(M * W(1)) * COS(X * W(1)) * SIN(L * W(1)) - SIN(M * W(1)) * SIN(X * W(1)) LOCATE 25, 66: PRINT " ": LOCATE 25, 66: PRINT COS(L * W(1)) * COS(X * W(1)) LOCATE 27, 66: PRINT " " LOCATE 27, 66: PRINT SIN(M * W(1)) * SIN(L * W(1)) * COS(X * W(1)) + COS(M * W(1)) * SIN(X * W(1)) IF ABS(W(14) - COS(M * W(1)) * COS(X * W(1)) * SIN(L * W(1)) + SIN(M * W(1)) * SIN(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "1": STOP IF ABS(W(15) - COS(L * W(1)) * COS(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "2": STOP IF ABS(W(16) - SIN(M * W(1)) * SIN(L * W(1)) * COS(X * W(1)) - COS(M * W(1)) * SIN(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "3": STOP '************************************************************************** IF Q = 0 THEN LOCATE 5, 9: PRINT " ": LOCATE 5, 9: PRINT X: LOCATE 7, 9: PRINT " ": LOCATE 7, 9: PRINT L: LOCATE 9, 9: PRINT " ": LOCATE 9, 9: PRINT M: A(1) = X: B(1) = L: C(1) = M: GOTO 116 'Запись значений углов X,L,M в соответствующие массивы, предназна- 'ченные для хранения "набора троек углов" A(I) = X: B(I) = L: C(I) = M ' счетчик максимальной длины набора троек углов: LOCATE 5, 35: PRINT " ": LOCATE 5, 30: PRINT "N = "; I: N = I '************************************************************************** IF Q >= 30 THEN X = 0: L = -Q: M = F + 180: I = 2: LOCATE 5, 35: PRINT " ": LOCATE 5, 30: PRINT "N = "; I: N = I: GOTO 95 IF W(6) = 0 THEN I = I + 1: L = -Q: GOTO 91 ' Изменяем значение угла X на величину приращения T = T + 1 IF Q <= 9 THEN X = W(6) * COS((360 / 88) * T * W(1)): GOTO 85 IF Q > 9 AND Q <= 30 THEN X = W(6) * COS((90 / (31 - Q)) * T * W(1)) ' увеличиваем ' значение параметра "I", с помощью которого мы следим за поряд- 'ковыми номерами элементов в массивах A,B,C 85 I = I + 1 'Четверть системы координат где L & X >=0 IF L >= 0 AND X >= 0 GOTO 60 ' Для четверти где L >= 0, а X < 0 имеем изменение знака поправки W(7) = -1 'Проверка на исчерпание диапазона изменения угла X при L >= 0 IF Q <= 9 AND T <= 44 GOTO 60 IF (Q > 9 AND Q <= 30) AND T <= (2 * (31 - Q)) GOTO 60 '**************************************************************************** 'Просмотрели все возможные значения для угла L >= 0, теперь 'переходим к рассмотрению L < 0 X = -W(6): T = T - 1 90 ' Выводим надпись времени LOCATE 1, 73: PRINT TIME$ 'Вычисление угла L L = COS(Q * W(1)) / COS(X * W(1)) L = -ABS(W(2) * ATN((SQR(1 - L ^ 2)) / L)) 'Проверка "на всякий случай", чтобы не было деления на 0 91 IF L = 0 AND X > 0 THEN M = F - 90: GOTO 95 IF L = 0 AND X < 0 THEN M = F - 270: GOTO 95 '*************************************************************************** ' Вычисление значения угла M: M = F - 180 + W(7) * W(2) * ABS(ATN(TAN(X * W(1)) / SIN(L * W(1)))) 'Представление значения угла M в стандартном виде в интервале 0 - 359 95 IF M >= 360 THEN M = M - 360: GOTO 95 100 IF M < 0 THEN M = M + 360: GOTO 100 '*************************************************************************** ' В Е Р И Ф И К А Ц И Я: 110 ' Принудительная остановка и выход в интерпритатор Z$ = INKEY$: IF RIGHT$(Z$, 1) = "k" THEN STOP LOCATE 23, 66: PRINT " " LOCATE 23, 66: PRINT COS(M * W(1)) * COS(X * W(1)) * SIN(L * W(1)) - SIN(M * W(1)) * SIN(X * W(1)) LOCATE 25, 66: PRINT " " LOCATE 25, 66: PRINT COS(L * W(1)) * COS(X * W(1)) LOCATE 27, 66: PRINT " " LOCATE 27, 66: PRINT SIN(M * W(1)) * SIN(L * W(1)) * COS(X * W(1)) + COS(M * W(1)) * SIN(X * W(1)) IF ABS(W(14) - COS(M * W(1)) * COS(X * W(1)) * SIN(L * W(1)) + SIN(M * W(1)) * SIN(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "1": STOP IF ABS(W(15) - COS(L * W(1)) * COS(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "2": STOP IF ABS(W(16) - SIN(M * W(1)) * SIN(L * W(1)) * COS(X * W(1)) - COS(M * W(1)) * SIN(X * W(1))) >= .00001 THEN LOCATE 26, 10: PRINT "3": STOP '*************************************************************************** 'Запись значений углов X,L,M в соответствующие массивы, предназна- 'ченные для хранения "набора троек углов" A(I) = X: B(I) = L: C(I) = M IF Q >= 30 GOTO 116 ' счетчик максимальной длины набора троек углов: LOCATE 5, 35: PRINT " ": LOCATE 5, 30: PRINT "N = "; I: N = I T = T + 1 IF Q <= 9 THEN X = W(6) * COS((360 / 88) * T * W(1)): GOTO 115 IF Q > 9 AND Q <= 30 THEN X = W(6) * COS((90 / (31 - Q)) * T * W(1)) 'увеличиваем значение параметра "I", с помощью которого мы следим 'за порядковыми номерами элементов в массивах A,B,C 115 I = I + 1: IF I > 97 THEN STOP '*************************************************************************** IF Q >= 30 THEN N = 2 'Четверть системы координат где L<0 & X >=0 IF L <= 0 AND X <= 0 GOTO 90 ' Для четверти где L < 0, а X < 0 имеем изменение знака поправки W(7) = 1 'Проверка на исчерпание диапазона изменения угла X IF Q <= 9 AND T <= 88 GOTO 90 IF (Q > 9 AND Q <= 30) AND T <= (4 * (31 - Q)) GOTO 90 W(7) = 1 116 W(24) = F: W(31) = 0 ' Выбираем из всего набора, характерного для заданной нами ' точки F,Q, тройку углов X,L,M которые позволяют перейти ' в МП от предыдущего наклона в заданное F,Q состояние путем ' МИНИМАЛЬНОГО изменения углов X,L,M. Для этого последователь- ' но просматриваем все тройки вычисленного набора и вычитаем ' из них предыдущее состояние W(11), W(12), W(13) . I = 1 ' - НАЧАЛЬНОЕ значение параметра для просмотра элементов 'массивов W(20) = 4000 'начальное значение параметра "разность" - берется 'существенно большее значение, чем любая возможная разность 'цикл просмотра троек углов: 120 ' разности углов W(17) = A(I) - W(11) W(18) = B(I) - W(12) 'Особые случаи, возникающие при переходе через 0 - 360 & ' через 360 - 0: ' №1: для полярной точки Q = 0 IF Q = 0 AND (C(I) > 320 AND C(I) <= 360) AND (W(13) >= 0 AND W(13) < 40) THEN W(29) = (C(I) - 360) - W(13): W(19) = ABS(W(29)): W(31) = 1 IF Q = 0 AND (C(I) >= 0 AND C(I) <= 40) AND (W(13) >= 320 AND W(13) <= 40) THEN W(29) = C(I) + (360 - W(13)): W(19) = W(29): W(31) = 1 ' №2: IF ((W(13) > 320 AND W(13) <= 360) AND (C(I) >= 0 AND C(I) < 40)) THEN W(19) = (360 - W(13) + C(I)): GOTO 125 IF C(I) = 360 AND (W(13) > 320 AND W(13) <= 360) THEN W(19) = 360 - W(13): GOTO 125 IF ((W(13) >= 0 AND W(13) < 40) AND (C(I) > 320 AND C(I) <= 360)) THEN W(19) = C(I) - 360 - W(13): GOTO 125 IF W(13) = 360 AND (C(I) > 320 AND C(I) <= 360) THEN W(19) = C(I) - 360: GOTO 125 W(19) = C(I) - W(13) 125 W(3) = ABS(W(17)) + ABS(W(18)) + ABS(W(19)) IF W(3) < W(20) THEN W(20) = W(3): W(21) = I: W(29) = W(19) I = I + 1 IF I <= N GOTO 120 126 IF C(W(21)) >= 360 THEN C(W(21)) = C(W(21)) - 360: GOTO 126 127 IF C(W(21)) < 0 THEN C(W(21)) = C(W(21)) + 360: GOTO 127 ' ПЕчать оптимальной тройки углов X,L,M LOCATE 5, 9: PRINT " ": LOCATE 5, 9: PRINT A(W(21)) LOCATE 7, 9: PRINT " ": LOCATE 7, 9: PRINT B(W(21)) LOCATE 9, 9: PRINT " ": LOCATE 9, 9: PRINT C(W(21)) 'Печать разностей LOCATE 15, 12: PRINT " ": LOCATE 15, 5: PRINT CHR$(127); " "; CHR$(145); " = "; A(W(21)) - W(11) LOCATE 17, 12: PRINT " ": LOCATE 17, 5: PRINT CHR$(127); " "; "L = "; B(W(21)) - W(12) LOCATE 19, 12: PRINT " ": LOCATE 19, 5: PRINT CHR$(127); " "; CHR$(230); " = "; W(29) IF W(31) = 1 THEN LOCATE 19, 11: PRINT " ": LOCATE 19, 11: PRINT W(29) IF ((W(13) > 310 AND W(13) <= 360) AND (C(W(21)) > 0 AND C(W(21)) < 40)) THEN LOCATE 19, 11: PRINT " ": LOCATE 19, 11: PRINT (360 - W(13) + C(W(21))); " *" IF ((W(13) > 0 AND W(13) < 40) AND (C(W(21)) > 320 AND C(W(21)) <= 360)) THEN LOCATE 19, 11: PRINT " ": LOCATE 19, 11: PRINT -(360 + W(13) - C(W(21))) 'Присвоение - нынешнее состояние для последующего станет предыдущим W(11) = A(W(21)): W(12) = B(W(21)): W(13) = C(W(21)) 'Сброс очереди клавиатуры 202 W(22) = 0 203 Z$ = INKEY$: W(22) = W(22) + 1: IF W(22) < 15 GOTO 203 U = W(26): I = W(21) - 1: Z$ = "" 300 Z$ = INKEY$: LOCATE 1, 73: PRINT TIME$: IF Z$ = "" GOTO 300 IF I = N AND RIGHT$(Z$, 1) = "P" THEN I = 1: T = 0: LOCATE 2, 9: PRINT " ": LOCATE 2, 5: PRINT "F = "; F: LOCATE 2, 23: PRINT " ": LOCATE 2, 19: PRINT "Q = "; Q: GOTO 50 301 IF RIGHT$(Z$, 1) = "H" THEN Q = Q + 1: I = 1: T = 0: LOCATE 2, 9: PRINT " ": LOCATE 2, 5: PRINT "F = "; F: LOCATE 2, 23: PRINT " ": LOCATE 2, 19: PRINT "Q = "; Q: GOTO 56 IF RIGHT$(Z$, 1) = "P" THEN Q = Q - 1: I = 1: T = 0: GOTO 310 IF RIGHT$(Z$, 1) = "M" THEN F = F + 1: I = 1: T = 0: GOTO 311 IF RIGHT$(Z$, 1) = "K" THEN F = F - 1: I = 1: T = 0: GOTO 311 IF (ASC(Z$) >= 48 AND ASC(Z$) <= 57) THEN I = 1: T = 0: LOCATE 2, 9: PRINT " ": LOCATE 2, 5: PRINT "F = "; F: LOCATE 2, 23: PRINT " ": LOCATE 2, 19: PRINT "Q = "; Q: GOTO 50 IF LEN(Z$) = 2 AND RIGHT$(Z$, 1) = "k" THEN STOP IF RIGHT$(Z$, 1) = "Q" AND I < N THEN I = I + 1: GOTO 320 IF RIGHT$(Z$, 1) = "O" AND U < W(25) THEN U = U + 1: GOTO 320 IF RIGHT$(Z$, 1) = "I" AND I > 1 THEN I = I - 1: GOTO 320 IF RIGHT$(Z$, 1) = "G" AND U > 1 THEN U = U - 1: GOTO 320 GOTO 300 GOTO 45 310 IF Q = -1 THEN Q = 1: F = F + 180 311 IF F >= 360 THEN F = F - 360: GOTO 311 312 IF F < 0 THEN F = F + 360: GOTO 312 LOCATE 2, 9: PRINT " ": LOCATE 2, 5: PRINT "F = "; F: LOCATE 2, 23: PRINT " ": LOCATE 2, 19: PRINT "Q = "; Q: GOTO 56 320 LOCATE 21, 48: PRINT " ": LINE (345, 340)-(620, 340), 0 LINE (380, 340)-(380, 450), 0 LINE (510, 340)-(510, 450), 0 LOCATE 23, 46: PRINT " " LOCATE 25, 46: PRINT " " LOCATE 27, 46: PRINT " " LOCATE 23, 30: PRINT "A("; U; ") = " LOCATE 25, 30: PRINT "B("; U; ") = " LOCATE 27, 30: PRINT "C("; U; ") = " LOCATE 23, 39: PRINT D(U) LOCATE 25, 39: PRINT E(U) LOCATE 27, 39: PRINT H(U) LOCATE 23, 56: PRINT "A'("; I; ") = " LOCATE 25, 56: PRINT "B'("; I; ") = " LOCATE 27, 56: PRINT "C'("; I; ") = " LOCATE 23, 66: PRINT A(I) LOCATE 25, 66: PRINT B(I) LOCATE 27, 66: PRINT C(I) IF I <= 95 GOTO 300