1. New, New mtn thing
- Posted by Michael Packard <lgp at EXO.COM> Feb 11, 1998
- 1003 views
- Last edited Feb 12, 1998
Here's the last version I'm doing for awhile. This one has the palette included, so you don't need the color.gif thing anymore. Enjoy, Michael Packard Lord Generic Productions ---------------------------------------------------------- ---------------------------------- -- Fractal Landscape Generator - -- Version .75 2/11/98 - -- Copyright 1998 - -- Lord Generic Productions - ---------------------------------- without type_check include get.e include machine.e include image.e include graphics.e include pic_load.e integer G,D1,MX,MY,MZ atom SR1,SR2,CR1,CR2,SR3,CR3,roll atom seed,Arand,Nrand,GaussAdd,GaussFac sequence X,pal integer maxlevel,addition,i,N,wire integer D,d atom sigma,H,delta,max,min ---------------------------- -- vga palette for mountain pal= {63,63,63}} ------------------------------------------- --initization of Gaussian random thingy Nrand=4 Arand=1000 seed=1234 GaussAdd=sqrt(3*Nrand) GaussFac=2*GaussAdd/(Nrand * Arand) --set_rand(seed) ------------------------------------------ function Gauss() atom sum sum=0 for i = 1 to Nrand do sum=sum+rand(Arand) end for return(GaussFac * sum - GaussAdd) end function ------------------------------------------- function f3(atom delta, atom x0, atom x1, atom x2) atom y,z z=Gauss() y=(x0+x1+x2)/3+delta*Gauss() return(y) end function -------------------------------------------- function f4(atom delta, atom x0, atom x1, atom x2, atom x3) atom y,z z=Gauss() y=(x0+x1+x2+x3)/4+delta*Gauss() return(y) end function --------------------------------------------- --initial parameters sigma=1.5 -- Initial Standard Deviation Determines max height H=.75 -- Fractal Dimention = 3-H Determines smoothness addition=0 -- Add extra randomness to points? --------------------------------------------- procedure mtn() atom k min=time() N=power(2,maxlevel)+1 delta=sigma X=repeat(0,N) for o=1 to N do X[o]=repeat(0,N) end for X[1][1]=delta*Gauss() X[1][N]=delta*Gauss() X[N][1]=delta*Gauss() X[N][N]=delta*Gauss() D=N-1 d=D/2 for stage= 1 to maxlevel do position(1,50) puts(1,"Working on Stage #")?(stage) -- going from grid type I to type II delta = delta * power(.5,.5*H) -- interpolate and offset points for x=d+1 to N-d+1 by D do for y=d+1 to N-d+1 by D do X[x][y]=f4(delta,X[x+d][y+d],X[x+d][y-d],X[x-d][y+d],X[x-d][y-d]) end for end for --displace other points also if necessary if addition then for x=1 to N+1 by D do for y=1 to N+1 by D do X[x][y]=X[x][y] + delta * Gauss() end for end for end if -- going from grid type II to type I delta= delta*power(.5,.5*H) -- interpolate and offset boundary grid points for x = d+1 to N-d+1 by D do X[x][1]=f3(delta,X[x+d][1],X[x-d][1],X[x][d]) X[x][N]=f3(delta,X[x+d][N],X[x-d][N],X[x][N-d]) X[1][x]=f3(delta,X[1][x+d],X[1][x-d],X[d][x]) X[N][x]=f3(delta,X[N][x+d],X[N][x-d],X[N-d][x]) end for --interpolate and offset interior grid points for x = d+1 to N-d by D do for y = D+1 to N-d by D do X[x][y] = f4(delta, X[x][y+d], X[x][y-d], X[x+d][y], X[x-d][y]) end for end for for x = D+1 to N-d by D do for y = d+1 to N-d+1 by D do X[x][y] = f4(delta, X[x][y+d], X[x][y-d], X[x+d][y], X[x-d][y]) end for end for if addition then for x=1 to N by D do for y=1 to N by D do X[x][y]=X[x][y] + delta * Gauss() end for end for for x=d+1 to N-d+1 by D do for y=d+1 to N-d+1 by D do X[x][y]=X[x][y] + delta * Gauss() end for end for end if D=D/2 d=floor(d/2) end for max=time()-min position(3,50) puts(1,"Time: ") ?(max) position(4,50) puts(1,"Size: ") ?(length(X)*length(X)) min=255 max=0 for x= 1 to N do for y= 1 to N do k = X[x][y] if k!=0 then k=((k/2)*175)+25 end if if k<1 then k=1 end if X[x][y]=floor(k) if floor(k)<min then min=floor(k) end if if floor(k)>max then max=floor(k) end if end for end for end procedure ----------------------------------------- procedure drawit() if maxlevel<9 then display_image({0,0},X) end if end procedure ------------------------------------------------- --3d draw stuff procedure viewangle(atom pitch,atom yaw)--pitch and yaw angles in degrees pitch=pitch*(.0174533) --convert to radians yaw=yaw*(.0174533) roll=0 roll=roll*(.0174533) G=0 D1=-2000 MX=0 MY=-700 MZ=0 SR1=sin(yaw) CR1=cos(yaw) SR2=sin(roll) CR2=cos(roll) SR3=sin(pitch) CR3=cos(pitch) end procedure --------------------------------------------------- function perspective(atom x1,atom y1, atom z1) --gives screen coordinates atom xa,ya,za,sx,sy xa=CR1*x1-SR1*y1 ya=SR1*x1+CR1*y1 x1=CR2*xa+SR2*z1 za=CR2*z1-SR2*xa y1=CR3*ya-SR3*za z1=SR3*ya+CR3*za x1=x1+MX y1=y1+MY z1=z1+MZ sx=floor(D1*x1/y1)+500 sy=floor(D1*z1/y1)+380 return({sx,sy}) end function ------------------------------------------------ procedure test3d() --atom x1,y1,z1 atom scale,color,vscale,check sequence points,points2 sequence point1,point2,point3,point4 points=repeat(0,N) points2=repeat(0,N) scale=257/N check=time() for x=1 to N-1 do for y=1 to N-1 do vscale=1 if color>240 then color=240 end if if color<0 then color=-color end if if wire=0 then polygon(0,1,{point1,point2,point3,point4,point1}) end if if color>5 and color<150then pixel(color+rand(50),point1) elsif color>150 then pixel(color-rand(50),point1) end if end for end for points=repeat(0,N+2) points2=points points2[N+2]=points[N+2] for x=2 to N+1 do points2[x]=perspective(N*scale-129,(x-1)*scale-129,-X[x-1][N]/10) /vscale end for polygon(0,1,points) polygon(0,1,points2) polygon(150,0,points) polygon(150,0,points2) check=time()-check position(6,50) puts(1,"3D Draw Time: ") print(1,check) end procedure ------------------------------------------------- --main program i=graphics_mode(261) all_palette(pal) for x= 1 to 50 do puts(1,"*******************************\n\r") puts(1,"* Fractal Landscape Generator *\n\r") puts(1,"* Version .75 2/11/98 *\n\r") puts(1,"* Copyright 1998 *\n\r") puts(1,"* Lord Generic Productions *\n\r") puts(1,"*******************************\n\r") wire=1 --0 for wireframe, 1 for filled polygons maxlevel=8 --High detail level but slow. Set lower for lower detail mtn() --Generates the fractal drawit() --Draw the 2D map viewangle(30,rand(90)) --Rotates the landscape for a good view. (pitch,yaw) test3d() --Makes 3D coordinates and draws polygons position(45,1) puts(1,"Press any Key\n\rPress Q or ESC to quit") i=wait_key() if i=27 or i='q' then i= graphics_mode(-1) abort(0) end if if i='m' then i=save_screen(0,"3dland.bmp") end if clear_screen() end for i=graphics_mode(-1) ----------------------------------------------
2. Re: New, New mtn thing
- Posted by JesusC - Jesus Consuegra <jconsuegra at REDESTB.ES> Feb 12, 1998
- 1029 views
> -----Mensaje original----- > De: Michael Packard [SMTP:lgp at EXO.COM] > include pic_load.e Missing this file... Where can I find it?. Thanks. Jesus. (Still trying win32 programming with Euphoria, long away of success...)
3. Re: New, New mtn thing
- Posted by Michael Packard <lgp at EXO.COM> Feb 12, 1998
- 881 views
On Thu, 12 Feb 1998, JesusC - Jesus Consuegra wrote: > > -----Mensaje original----- > > De: Michael Packard [SMTP:lgp at EXO.COM] > > > include pic_load.e > > Missing this file... Where can I find it?. > Thanks. > Jesus. (Still trying win32 programming with Euphoria, long away of success...) > It's Michael Bolin's(?) pcx/gif loader. You can get it from the Official Euphoria site. You don't actually need it anymore for the .75 version, so you can just comment out the line and it should work ok. Previous versions loaded a gif with the palette, but I have since included the palette in the ex file. Michael Packard Lord Generic Productions