FORTH DEFINITIONS PLOT : НАЧАТЬ ( -> ИНИЦИАЛИЗАЦИЯ) PLOT HERE NU0 MU0 * ALLOT TO WSTA ; PLOT DEFINITIONS : ВВЕРХ ( N-> СДВИНУТЬ ОКНО НА N ПОЗИЦИЙ ВВЕРХ) ?+ WY SWAP - 0 MAX TO WY ; : ВЛЕВО ( N-> СДВИНУТЬ ОКНО НА N ПОЗИЦИЙ ВЛЕВО) ?+ WX SWAP - 0 MAX TO WX ; : ВНИЗ ( N-> СДВИНУТЬ ОКНО НА N ПОЗИЦИЙ ВНИЗ) ?+ WY + MU + LAMBDA MIN MU - TO WY ; : ВПРАВО ( N-> СДВИНУТЬ ОКНО НА N ПОЗИЦИИ ВПРАВО) ?+ WX + NU + KAPPA MIN NU - TO WX ;
Определим также слова для вычисления параметров графика и распечатки окна по его текущим координатам. Вспомогательное слово MU по значению функции определяет, где находится соответствующая точка графика: ниже окна, внутри или выше него. Если точка попадает в окно, будем отмечать ее положение знаком * (звездочка), а если точка находится выше или ниже окна, то соответственно в самой верхней или самой нижней строке окна поставим знак + (плюс), чтобы видеть направление, в котором следует искать данную точку на графике. Ось абсцисс, если она попадает в окно, будем отмечать строкой из знаков «минус». Надпечатку координат по оси абсцисс будем выполнять дважды — в верхней и нижней строках терминала.
: -MU ( N:ЗНАЧЕНИЕ->-1:НИЖЕ ОКНА/ M:СМЕЩЕНИЕ ОТ ВЕРХА ОКНА ВНИЗ,0/ +1:ВЫШЕ ОКНА ) MIN0 - DUP 0< IF DROP -1 EXIT THEN MU 1- SWAP - DUP 0< IF DROP 1 EXIT THEN 0 ; : ФУНКЦИЯ ( -> СЛЕДУЮЩЕЕ СЛОВО: ИМЯ ВЕКТОРА ЗНАЧЕНИЙ) >IN @ >R [COMPILE] В-РАЗМ R> >IN ! DUP TO KAPPA NU0 MIN TO NU ' TO VAL ( ВЫЧИСЛЕНИЕ MA И LAMBDA ) 0 VAL DUP ( X[0],X[0] ) KAPPA 0 DO I VAL ( MIN[I-1],MAX[I-1],X[I] ) DUP >R MAX SWAP R> MIN ( MAX[I],MIN[I]) SWAP LOOP DUP TO MA SWAP - 1+ DUP TO LAMBDA MU0 MIN TO MU 0 TO WX 0 TO WY ; : ОСЬ-X ( НАДПЕЧАТКА ОСИ X) CR RH0 SPACES WX NU 1- RH0 - WX BEGIN DUP 10 MOD DUP IF 10 SWAP - THEN DUP >R + 2DUP >= WHILE R> SPACES C" ! EMIT DUP 0 <# #S #> DUP >R TYPE 1+ R> + REPEAT RDROP 2DROP ; : ГРАФИК ( -> РИСОВАТЬ ГРАФИК ПО СИГНАЛУ И КООРДИНАТАМ ОКНА) MA WY - MU 1- - TO MIN0 ( УСТАНОВИТЬ MIN0) WSTA MU NU * BLANK ( ЗАЧИСТИТЬ ОКНО) 0 -MU 0= IF NU * WSTA + NU C" - FILL THEN ( ПРОВЕСТИ ОСЬ X) ( ЦИКЛ ПО ОСИ X ДЛЯ ЗАПОЛНЕНИЯ ОКНА) WX NU + WX DO I VAL ( X[I]) -MU DUP IF ( ВНЕ ОКНА) 1+ IF ( ВЫШЕ ОКНА) C" + 0 ELSE ( НИЖЕ ОКНА) C" + MU 1- THEN ELSE DROP C" * SWAP THEN NU * I WX - + WSTA + C! LOOP ОСЬ-X MU 0 DO CR MA WY - I - RH0 .R I NU * WSTA + NU TYPE LOOP ОСЬ-X ;