1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | SCREEN 12 DIM MinX, MinY, MaxX, MaxY DIM XRazn, YRazn, MnogX, MnogY DIM StpScX AS INTEGER , StpScY AS INTEGER ' Функции графиков DEF FnY1 (x) = 150 - 20 * x DEF FnY2 (x) = EXP(. 8 * x) DEF FnY3 (x) = 2 * x ^ 2 - 4 ' Ф-ция поиска границ DEF FnMinMax (x, y) IF x < MinX THEN MinX = x IF x > MaxX THEN MaxX = x IF y < MinY THEN MinY = y IF y > MaxY THEN MaxY = y END DEF ' Экранное преобразование DEF FnGetX (x) = x * MnogX - MinX * MnogX DEF FnGetY (y) = y * MnogY - MaxY * MnogY ' Параметры трассировки функций Str1 = - 10 : Str2 = 0 : Str3 = - 5 End1 = 10 : End2 = 10 : End3 = 10 Stp1 = . 01 : Stp2 = . 03 : Stp3 = . 1 ' Переменные для трассировки x1 = Str1: x2 = Str2: x3 = Str3 y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3) ' Вычисляем параметры графиков DO Go = 0 : y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3) IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = - 1 IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = - 1 IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = - 1 i = FnMinMax(x1, y1) ' Ищем границы i = FnMinMax(x2, y2) i = FnMinMax(x3, y3) LOOP WHILE Go PRINT PRINT " "; INT(MinX); INT(MinY); INT(MaxX); INT(MaxY) ' Реинициализация трассировки x1 = Str1: x2 = Str2: x3 = Str3 y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3) ' Старые координаты(Прошлый шаг трассировки) xo1 = x1: xo2 = x2: xo3 = x3 yo1 = y1: yo2 = y2: yo3 = y3 ' Делаем фрейм пошире, чтобы больше было видно ' + сетку, если она где-то рядом XRazn = MaxX - MinX YRazn = MinY - MaxY MinX = MinX - XRazn / 4 MaxX = MaxX + XRazn / 4 MinY = MinY + YRazn / 4 MaxY = MaxY - YRazn / 4 ' Для преобразования координат в экранные XRazn = MaxX - MinX ' Разности координат графиков YRazn = MinY - MaxY IF XRazn = 0 THEN XRazn = . 00001 IF YRazn = 0 THEN YRazn = . 00001 MnogX = 640 / XRazn ' Отнош. к разностям коо. гр. MnogY = 480 / YRazn StpScX = 1 : StpScY = 1 ' Шаг сетки ' Если сетка не умещается увеличиваем шаг сетки DO : ScTst = 0 IF ABS (XRazn / StpScX) > 160 THEN StpScX = StpScX * 10 : ScTst = - 1 IF ABS (YRazn / StpScY) > 120 THEN StpScY = StpScY * 10 : ScTst = - 1 LOOP WHILE ScTst ' Нарисуем сетку DlSc = SQR( 1 / ABS (XRazn / StpScX) + 1 / ABS (XRazn / StpScX)) * 10 IF DlSc > 10 THEN DlSc = 10 IF DlSc < 2 THEN DlSc = 2 LINE (FnGetX(MinX), FnGetY( 0 ))-(FnGetX(MaxX), FnGetY( 0 )), 8 LINE (FnGetX( 0 ), FnGetY(MinY))-(FnGetX( 0 ), FnGetY(MaxY)), 8 FOR i = INT(MinX) TO INT(MaxX) STEP StpScX LINE (FnGetX(i), FnGetY( 0 ) - DlSc)-(FnGetX(i), FnGetY( 0 ) + DlSc), 8 NEXT FOR i = INT(MinY) TO INT(MaxY) STEP StpScY LINE (FnGetX( 0 ) - DlSc, FnGetY(i))-(FnGetX( 0 ) + DlSc, FnGetY(i)), 8 NEXT ' Рисуем графики DO Go = 0 : y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3) IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = - 1 IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = - 1 IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = - 1 LINE (FnGetX(xo1), FnGetY(yo1))-(FnGetX(x1), FnGetY(y1)), 9 LINE (FnGetX(xo2), FnGetY(yo2))-(FnGetX(x2), FnGetY(y2)), 10 LINE (FnGetX(xo3), FnGetY(yo3))-(FnGetX(x3), FnGetY(y3)), 14 xo1 = x1: xo2 = x2: xo3 = x3 ' Старые координаты yo1 = y1: yo2 = y2: yo3 = y3 LOOP WHILE Go WHILE INKEY$ = "": WEND ' Ждать кнопку |
Тестирование выполнено в программе QB64 ( Скачать )