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 | ' Объявим константы: 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 ) |