' Объявим константы:
CONST pi = 3.141592653589793#
CONST Gradus = pi / 180, RAD = 180 / pi
' Углы обзора
CONST OBZORh = 40 * Gradus, OBZORv = 33 * Gradus
' Разрешение экрана
CONST RezX = 639, RezY = 479
CONST Dist = 200
' Переменные препроцессора точек
DIM Ln1Ugol!, Ln2Ugol!, Ln3Ugol!, Ln4Ugol!
DIM a1!, a2!, a3!, a4!, b1!, b2!, b3!, b4!
DIM CamX!, CamY!, CamZ!, CamHcrn!, CamVcrn!
DIM Func%(Dist)
SCREEN 12
FOR i% = 0 TO Dist
x = i% / 40
F = -4 / (x + 1) ' Наша функция
Func%(i%) = F * 100
NEXT
' Рассчитаем угловые коеф-ты
Ln1Ugol! = OBZORh: Ln2Ugol! = -OBZORh
Ln3Ugol! = OBZORv: Ln4Ugol! = -OBZORv
a1! = SIN(Ln1Ugol!): b1! = -COS(Ln1Ugol!)
a2! = SIN(Ln2Ugol!): b2! = -COS(Ln2Ugol!)
a3! = SIN(Ln3Ugol!): b3! = -COS(Ln3Ugol!)
a4! = SIN(Ln4Ugol!): b4! = -COS(Ln4Ugol!)
' Параметры камеры
CamHcrn! = 0 * Gradus ' Крен камеры
CamVcrn! = 0 * Gradus ' Поворот камеры
CamX! = -800
CamY! = 0
CamZ! = 0
ReDraw = 1
' Основной цикл
DO
Kb$ = INKEY$
IF Kb$ = " " THEN ReDraw = 1
IF ReDraw THEN
ReDraw = 0
CLS 1
SinCamH! = SIN(CamHcrn!): CosCamH! = COS(CamHcrn!)
SinCamV! = SIN(CamVcrn!): CosCamV! = COS(CamVcrn!)
' Цикл по точкам
FOR Vr% = 0 TO 359 STEP 2
SinusU! = SIN(Vr% * Gradus) * 2.5: CosinusU! = COS(Vr% * Gradus) * 2.5
FOR i% = 0 TO Dist STEP 2
Xc% = SinusU! * i%' RND * 500 - 250
Yc% = CosinusU! * i%' RND * 500 - 250
Zc% = Func%(i%) - 100
TXx! = Xc% - CamX!: TYy! = Yc% - CamY!: TZz! = Zc% - CamZ!
' Обратный поворот относительно 2х осей
TX! = TXx! * CosCamH! + TYy! * SinCamH! ' Первая плоскость XY
TY! = -TXx! * SinCamH! + TYy! * CosCamH!
' Вторая плоскость XZ
TZ! = -TX! * SinCamV! + TZz! * CosCamV! 'Сперва Tz ВАЖНО !!!
TX! = TX! * CosCamV! + TZz! * SinCamV!
' Расчёт горизонтального расстояния
Rasst1! = (a1! * TX! + b1! * TY!)
Rasst2! = (a2! * TX! + b2! * TY!)
IF Rasst1! < 0 OR Rasst2! > 0 GOTO Ex3D 'Точка вне видимости
OBRas1! = ABS(Rasst1!) + ABS(Rasst2!)
IF OBRas1! <> 0 THEN XeKf# = Rasst1! / OBRas1! ELSE XeKf# = 1
ex! = XeKf# * RezX
' Расчёт вертикального расстояния
Rasst3! = (a3! * TX! + b3! * TZ!)
Rasst4! = (a4! * TX! + b4! * TZ!)
IF Rasst3! < 0 OR Rasst4! > 0 GOTO Ex3D 'Точка вне видимости
OBRas2! = ABS(Rasst3!) + ABS(Rasst4!)
IF OBRas2! <> 0 THEN YeKf# = Rasst3! / OBRas2! ELSE YeKf# = 1
ey! = YeKf# * RezY
PSET (ex!, ey!), 15
Ex3D:
NEXT i%
NEXT Vr%
END IF
LOOP UNTIL Kb$ = CHR$(27)