Автор: Mike
Файлы cube_object.inc и Short3D.inc находяться в директории основной программы
//Code by Mike <hutchber@kingston.net> resize_pixi(0,320,320) INCLUDE "cube_object.inc" obj=cube Pnt1=new_array(3) Pnt2=new_array(3) Angl=0 Tilt=0 x=0 y=0 z=690 m=900 num_lines=cube[1] num_points=cube[0] os=10+3*num_points Color=GREEN LoopTilt: InitPlotting InitPerspective Angl+1 //Tilt+1 clear( BLACK ) Draw3DObject frame(20) go LoopTilt stop INCLUDE "Short3D.inc" Draw3DObject: num_lines=obj[1] num_points=obj[0] os=10+3*num_points InitPlotting InitPerspective k=0 LoopLine: j=os+2*k p1=obj[j] p2=obj[j+1] a=10+3*p1 Pnt1[0]=obj[a] Pnt1[1]=obj[a+1] Pnt1[2]=obj[a+2] a=10+3*p2 Pnt2[0]=obj[a] Pnt2[1]=obj[a+1] Pnt2[2]=obj[a+2] DrawLine3D k+1 if k<num_lines {go LoopLine} ret
Подгружаемый файл cube_object.inc
num_points=8 num_lines=12 /* will reserve 8 spaces to make it easier if I want to add info later */ obj_size=10+num_points*3+num_lines*2 cube=new_array(obj_size) cube[0]=num_points cube[1]=num_lines //cube[2 to 9] reserved a=50 b=-50 cube[10]=a cube[11]=a cube[12]=a cube[13]=b cube[14]=a cube[15]=a cube[16]=b cube[17]=b cube[18]=a cube[19]=a cube[20]=b cube[21]=a cube[22]=a cube[23]=a cube[24]=b cube[25]=b cube[26]=a cube[27]=b cube[28]=b cube[29]=b cube[30]=b cube[31]=a cube[32]=b cube[33]=b cube[34]=0 cube[35]=1 cube[36]=1 cube[37]=2 cube[38]=2 cube[39]=3 cube[40]=3 cube[41]=0 cube[42]=4 cube[43]=5 cube[44]=5 cube[45]=6 cube[46]=6 cube[47]=7 cube[48]=7 cube[49]=4 cube[50]=0 cube[51]=4 cube[52]=1 cube[53]=5 cube[54]=2 cube[55]=6 cube[56]=3 cube[57]=7
Подгружаемый файл Short3D.inc
/************************ Three Dimensional Plotting Routines ************************* InitPlotting - rotation and tilt angles InitPerspective - observer location and distances MapCoordinates - maps 3D space onto the 2D screen CartesianPlot - plot a cartesian system point DrawLine3D - plots a line from 3D coordinates */ PixiAngle: /*Angle in degrees. 512 segments in circle of 360 degrees */ Angle=(1800+ (Angle*5120))/3600 ret CosD: PixiAngle /**/c=cos(Angle) ret SinD: PixiAngle/**/s=sin(Angle) ret InitPlotting://in: Angl, Tilt /*Where Angl & Tilt are user inputs. Angl is angle around z-axis. Tilt is angle around off z-axis. */ CentreX=0 CentreY=0 Angle=Angl SinD SinA=s Angle=Angl CosD CosA=c Angle=Tilt SinD SinB=s Angle=Tilt CosD CosB=c CosACosB=CosA*CosB//is 256^2 larger than supposed to be SinASinB=SinA*SinB//ibid CosASinB=CosA*SinB//ibid SinACosB=SinA*CosB//ibid ret InitPerspective: // x, y, z, m //camera position in space Mx=x My=y Mz=z ds=m //distance of camera from screen ret MapCoordinates://in: X, Y, Z, //out:Xp, Yp Xt=256*Mx+X*CosA-Y*SinA Yt=256*My+(X*SinASinB +Y*CosASinB)/256 +Z*CosB Zt=256*Mz+(X*SinACosB +Y*CosACosB)/256 -Z*SinB Xt/256 Yt/256 Zt/256 Xp=CentreX+(ds*Xt/Zt) Yp=CentreY-(ds*Yt/Zt) ret CartesianPlot3D:// X, Y, Z, Color MapCoordinates//X,Y,Z, Xp,Yp dot(Xp, Yp, Color); ret DrawLine3D://in: Pnt1, Pnt2, Color X=Pnt1[0] Y=Pnt1[1] Z=Pnt1[2] MapCoordinates Xp1=Xp Yp1=Yp X=Pnt2[0] Y=Pnt2[1] Z=Pnt2[2] MapCoordinates line(Xp1, Yp1, Xp , Yp ,Color) ret