Вот, как я и обещал, продолжение моей статьи.
Как видите, в предыдущей программе мы использовали только один квадрант из четырех возможных. Но мы можем работать и с 2 и 4 квадрантами. В этом нам помогут переменные dtx и dty, которые будут определяться не готовым значением в 30 пикселей, как раньше, а вычисляться в зависимости от того какой график мы хотим использовать:
Dim AS integer dtx=ScreenX/2 REM расположение оси X от левого края экрана (центр)
Dim AS integer dty=ScreenY/4 REM расположение оси Y от нижн. края экрана
В данном случае мы делим экран пополам по оси X и используем три четверти экрана по оси Y. Это позволит нам воспользоваться отрицательными координатами оси X и рисовать две ветви параболы, а не одну.
А какие значения от –X до X мы сможем использовать при построении функции Y=X*X, чтобы график не выходил за пределы экрана? В этом нам поможет переменная koldY=9, в которой хранится количество делений по оси Y. Переменную –X мы вычислим с помощью выражения -(SQR(koldY-0.1)) которому мы присваиваем отрицательное значение, после извлечения квадратного корня. Надеюсь, вы помните, что извлечь квадратный корень из отрицательного числа невозможно.
А цикл FOR NEXT примет такой вид:
FORx = -(SQR(koldY-0.1)) TOSQR(koldY) STEP1/(MY*MY)
Несмотря на то, что у нас значений Х (для окна размером 640х480 точек) стало не больше 3, парабола функции Y=X*X получилась довольно наглядной. Этого мы добились сменив масштаб и укрупнив его до 40 точек за единицу измерения.
Естественно, в цикле рисования прямой нет необходимости для вычисления корней
SQR(koldY), мы можем и без сложных вычислений, на глаз, определить крайние значения цикла рисующего прямую, чтобы ее размеры не выходили за пределы экрана. Например вот так:
FOR x = -4 TO 4 STEP 1/MY
Но я решил автоматизировать поиск крайних значений, сделав программу более универсальной.
И вот наша программа построения графиков почти готова.
С ее помощью мы можем:
- Использовать окна всех стандартных размеров (поменяв SCREEN 12 на любое другое разрешение и задав соответствующие ScreenY и ScreenX)
- С помощью переменных dtx и dty задавать размеры графика и использовать 1, 2 или 4 квадранта плоскости. Естественно, эти переменные должны быть целочисленными и соответственно результаты вычислений ScreenX/MX и ScreenY/MY также должны быть целыми числами.
- Задавать нужный маштаб (количество точек на деление) переменными MX и MY.
- В цикле FOR NEXT предназначенным для черчения графиков функций использовать автоматически рассчитываемый диапазон переменных с значениями не выходящих за пределы экрана.
- У нас установлена защита от выхода значений за пределы экрана. (If Y1<0 Then)
- С помощью задержки sleep 10 мы можем строить графики постепенно, для большей наглядности. Если мы укажем ключевое слово sleep без указания цифрового значения, то мы сожжем рисовать точки поштучно, многократно нажимая на любую клавишу.
Естественно, нет предела совершенству, но программа уже вполне работоспособна и наглядна, поэтому не думаю, что ее стоит усложнять дополнительными возможностями:
Программа Graf3
SCREEN12 REM графический режим 640x480
CLS
Dim As integer Colorl = 2 REM цвет линии
Dim As integer ScreenY = 480, ScreenX = 640
Dim As integer MX = 40 REM масштаб по оси X
Dim As integer MY = 40 REM масштаб по оси Y
Dim As integer dtx=ScreenX/2 REM расположение оси X от левого края экрана (центр)
Dim As integer dty=ScreenY/4 REM расположение оси Y от нижн. края экрана
LOCATE 2, 35: print "Y" REM указываем наименования осей
LOCATE25, 75: print "X"
LINE(dtx, 0)-(dtx, ScreenY), Colorl REMчертим линию по вертикали, ось Y
Dim As integer Y2 REM черточки масштаба на вертикальной оси Y
FOR Y2 = ScreenY TO0 STEP -MY
LINE(dtx-2, Y2)-(dtx+2, Y2)
'sleep1000
'LOCATE 10, 60: print "Y2=";Y2;" "
NEXT
LINE(0, ScreenY-dty)-(ScreenX, ScreenY-dty), Colorl REM горизонтальная линия, ось X
Dim AS integer X2 REM черточки масштаба на горизонтальной оси X
FORX2 = MX TOScreenX STEPMX
LINE(X2, ScreenY-dty-2)-(X2, ScreenY-dty+2)
'sleep1000
'LOCATE10, 70: print "X2=";X2;" "
NEXT
Dim As integer Colorp = 12 REM цвет точек линии
Dim As single X,Y REM значения точек функции
Dim As single X1,Y1 REM вычисленные значения координат на экране
Dim AS integer koldX,koldY REM кол-во делений по оси X и Y
koldX= (ScreenX-dtx)/MX
koldY= (ScreenY-dty)/MY
LOCATE7, 60: print "koldx=";koldX
LOCATE8, 60: print "koldY=";koldY
' Чертим параболу
FORx = -(SQR(koldY)) TOSQR(koldY) STEP1/(MY*MY)
y=x*x
x1=x*MX+dtx REM поправка на смещение
y1=(ScreenY-y*MY)-dty
'sleep 10 REM временная задержка 0,01 сек после каждой точки
PSET (x1, y1), Colorp REM функция «поставить точку»
If Y1<0 Then
Print" Y<0, Exit !!!"
Exit For ' Выход из цикла
Endif ' Конец проверки условия
LOCATE3, 60: print"X=";X
LOCATE4, 60: print"Y=";Y
LOCATE5, 60: print"X1=";X1
LOCATE6, 60: print"Y1=";Y1;" "
NEXT
Color(12,0):LOCATE 20, 10: print "Y=X * X";
Color (15,0) ' Чертим прямую линию
FORx = -(SQR(koldY)) TOSQR(koldY) STEP1/MY
y=x+2
x1=x*MX+dtx REM поправка на смещение
y1=(ScreenY-y*MY)-dty
'sleep 10 REM временная задержка 0,01 сек после каждой точки
PSET (x1, y1), Colorp+2 REM функция «поставить точку»
If Y1<=0 Then
'Print"Y<=0, Exit !!!"
Exit For ' Выход из цикла
Endif ' Конец проверки условия
LOCATE17, 60: print "X=";X
LOCATE18, 60: print "Y=";Y
LOCATE 19, 60: print "X1=";X1
LOCATE20, 60: print "Y1=";Y1;" "
NEXT
Color(14,0):LOCATE 25, 10: print "Y=X+2";
sleep
end
Как видите, у нас получилась система из двух уравнений:
Y-X-2=0
Y- X*X=0
Которую мы можем решить, найдя корни уравнений графическим способом. Для этого необходимо мысленно провести из точек пересечения прямой и параболы линии перпендикулярные осям координат.
Для первой точки пересечения значения будут равны:
X=-1 и Y=1,
для второй
X=2 Y=4.
Вы сами можете подставить найденные значения в оба уравнения и убедиться, что корни найдены правильно, значит и построение графиков у нас получилось правильным.
Полезная ссылка https://skysmart.ru/articles/mathematic/grafik-linejnoj-funkcii