' Эта программа рисует 3-х мерную функцию SCREEN 12:CLS WINDOW(0,0)-(639,479):'Определяем габариты экрана DIM L(1000):'Размерность всех точек, выводимых на экран FOR I=1 TO 1000:L(I)=0:NEXT I:'Вначале все точки кладем раными нулю FONE=0:'Цвет фона-черный CVET=10:'Цвет функции-зеленый PAINT(0,0),FONE:'Закрашываем фон - черным BEGIN: 'NOW WE DEFINE Z(X,Y) FUNCTION DEF FNZ(X)=1.5*EXP(-10*((X^2)+(Y^2)))+.3*EXP(-10*((X^2)+(Y^2)-1)^2):' Определяем 3-х мерную фу-цию ' def fnz(x)=1.5*exp(-10*((x^2)+(y^2)))+.3*exp(-10*((x^2)+(y^2)-1)^2)*sin(6.28*x/1.5):'Другая функция-разремить, верхную заремить 'def fnz(x)=0.2*sin(6.28*x/1.5)+.3*sin(6.28*y/2) 'WE SEARCH FUNCTION AT X1 TO X2,Y1 TO Y2 FIELD:'Будем исследовать функцию на площадке (х1,y1), (x2,y2) X1=-1.5:X2=1.5:Y1=-1.5:Y2=1.5 'SEQUENTION LINES - NX,NY NY=200:'Сделаем 200 секущих линий по оси Y 'SEQUENTION INTERVAL - DY DY=(Y2-Y1)/(NY-1):'Интервал сечений по Y 'DOTS FULL NUMBER - QX QX=500:'Всего точек в одном сечении по X - положим равным 500 'QUANTES - XX XX=(X2-X1)/QX START: KZ=20:'Коэффициент масштаба по оси Z FOR Y=Y2 TO Y1-DY STEP -DY FOR X=X1 TO X2 STEP XX Z=FNZ(X) AX=X:AY=Z-6:AZ=KZ*Y:GOSUB CONV3D:'Идем на подпрограмму преобразования текущей точки функции на плоскость экрана I=INT(BX) IF BY>L(I) THEN PSET(I,INT(BY)),CVET:L(I)=BY:'Если текущая точка лежит на экране выше точек, лежащих в предыдущем выведенном на экран сечении, то рисуем её. IF INKEY$=CHR$(27) THEN STOP NEXT X NEXT Y WATA: IF INKEY$=CHR$(27) THEN STOP ELSE WATA CONV3D: rem 3d to 2d convertion.Input-ax,ay,az.Output-bx,by 'В этом преобразовании точек функции на экран, мы предполагаем, что рассматриваем функцию из точки смотрения с координатами ZS,XS,YS. Из этой точки мы проводим прямую в текущую точку функции и точку пересечения этой прямой с плоскостью экрана, будем брать за точку вывода на экран. Вы можете изменить координаты точки смотрения и получить вид функции под другим ракурсом. Отметим, что программа не следит за правильностью полученной точки, поэтому, если вы выбирите неудачную точку смотрения, то программа может выдать ошибку. ZS=15000:XS=40:YS=400 KX=160:KY=160 cc=zs/(zs-az):bx=KX*(cc*(ax-xs)+xs)+320:by=KY*(cc*(ay-ys)+ys)+1100:return