Code archives/Graphics/Planet generating program
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This is a translation of planet.c by Torben AE. Mogensen. It generates planet maps in various projections. It is a result of this thread http://www.blitzbasic.com/Community/posts.php?topic=63686 You may need the original to understand the options. http://www.diku.dk/~torbenm/ edit: updated this and replaced the commandline interface to just setting variables. i also improved the search feature and made everything internal, so no color files, etc. needed. | |||||
;Translation of planet.c, planet generating program
;Copyright 1988-2003 Torben AE. Mogensen
;version of October 22 2003
;The program generates planet maps based on recursive spatial subdivision
;of a tetrahedron containing the globe. The output is BMP or PPM.
;The colours may optionally be modified according to latitude to move the
;icecaps lower closer to the poles, with a corresponding change in land
;colours.
;The Mercator map at magnification 1 is scaled to fit the width
;it uses the full height (it could extend infinitely)
;The orthographic projections are scaled so the full view would use the
;full Height. Areas outside the globe are coloured black.
;Stereographic and gnomic projections use the same scale as orthographic
;in the center of the picture, but distorts scale away from the center.
;It is assumed that pixels are square
;I have included procedures to print the maps as bmp or ppm
;bitmaps (portable pixel map) on standard output or specified files.
;I have tried to avoid using machine specific features, so it should
;be easy to port the program to any machine. Beware, though that due
;to different precision on different machines, the same seed numbers
;can yield very different planets.
;The primitive user interface is a result of portability concerns
Graphics 640,480,0,2
SetBuffer BackBuffer()
;these values can be changed to change world characteristics
Global debug = 1 ;show debug info
Global colorscheme = 1 ;specify colour scheme 0..5, default = 0
Global altColors = 0 ;Switch to alternative colour scheme
Global doshade = 0 ;Use 'bumpmap' shading
Global shade_angle# = 0 ;Angle of 'light' in bumpmap shading, eg. 150.0
Global Width = 512 ;Width in pixels, default = 256
Global Height = 256 ;Height in pixels, default = 128
Global view$ = "q" ;Projection: m=mercator, p=peter, q=squarep,
;M=Mollweide, S=Sinusoid, s=stereographic, o=orthographic
;g=gnomonic, a=azimuth, c=conical, h=heightfield, f=search
Global rseed# = 0.2 ;Seed as number between 0.0..1.0, eg. 0.3
Global M# = 0.19 ;Initial altitude, default = 0.3
Global dd1# = 0.15 ;Weight for altitude difference, default = 0.4
Global dd2# = 0.03 ;Weight for distance, default = 0.03
Global POW# = 0.2 ;Power for distance function, default = 0.47
Global scale# = 1.0 ;Magnification, default = 1.0
Global longi# = 0.0 ;Longitude of centre in degrees, default = 0.0
Global lat# = 0.0 ;Latitude of centre in degrees, default = 0.0
Global vgrid# = 0.0 ;Vertical gridsize in degrees, 0.0 = no grid
Global hgrid# = 0.0 ;Horisontal gridsize in degrees, 0.0 = no grid
Global latic = 0 ;Colour depends on latitude, default = only altitude
Global lighter = 0 ;Use lighter colours (original scheme only)
Global do_outline = 0 ;Trace the edges of land in black on colour map
Global do_bw = 0 ;Produce a black and white outline map
Global filename$ = "planet" ;map image file
Global file_type = 0 ;map file types, 0=BMP/1=PPM
Global searchfile$ = "search.txt" ;map search text file
Global increment# = 0.01 ;seed search increment, eg. 0.00000001
;globals used in calculations
Global BLACK=0
Global WHITE=1
Global BLUE0=2
Global BLUE1, LAND0, LAND1, LAND2, LAND4;
Global GREEN1, BROWN0, GREY0;
Global BACK = WHITE ;BLACK
Global shade;
Global Depth ;depth of subdivisions
Global r1#,r2#,r3#,r4# ;seeds
Global best = 500000
Global cla#,sla#,clo#,slo#;
Global DEG2RAD#=0.0174532918661 ;Pi/180
Global Rad2Deg#=(180/Float(Pi))
;arrays used in calculations
Dim col(256,128)
Dim shades(256,128)
Dim heights(256,128)
Dim rtable(256)
Dim gtable(256)
Dim btable(256)
Dim outx(256*128)
Dim outy(256*128)
Dim cl0(60,30);
Dim weight(30);
Dim colors(9,3)
Dim moll_table#(32)
;set colors array from data
Select colorscheme
Case 1: Restore atlas_colors
Case 2: Restore mars_colors
Case 3: Restore grey_colors
Case 4: Restore moon_colors
Case 5: Restore cyan_colors
Default: Restore colors
End Select
For i=0 To 8 ;copy the 9 base colors
For j=0 To 2: Read colors(i,j): Next
Next
Restore moll_data
For i=0 To 18 ;copy the 19 moll values
Read moll_table#(i)
Next
If (view = "h")
Dim heights(Width,Height) ;heightmap
Else
Dim col(Width,Height) ;map colors
EndIf
If (doshade)
Dim shades(Width,Height) ;map shading
EndIf
If (debug)
Print "> -s "+rseed+" -i "+M+" -a "+dd1+" -d "+dd2+" -p "+POW
Print "> -w "+Width+" -h "+Height+" -B "+doshade
EndIf
;print error if unknown
Select (view)
Case "m" ;mercator
Case "p" ;peter
Case "q" ;squarep
Case "M" ;Mollweide
Case "S" ;Sinusoid
Case "s" ;stereographic
Case "o" ;orthographic
Case "g" ;gnomonic
Case "a" ;azimuth
Case "c" ;conical
Case "h" ;heightfield
Case "f" ;search
Default : Print "Unknown projection: "+view : print_error()
End Select
If (view = "c")
If (lat = 0) view = "m";
;Conical approaches mercator when lat -> 0
If (Abs(lat) >= Pi - 0.000001) view = "s";
;Conical approaches stereo when lat -> +/- 90
EndIf
;init calculations
If (longi>180) longi = longi - 360;
longi = longi*DEG2RAD;
lat = lat*DEG2RAD;
sla = Sin(lat): cla = Cos(lat);
slo = Sin(longi): clo = Cos(longi);
Depth = 3*(Int(log_2(scale*Height)))+6;
r1 = rseed;
r1 = rand2(r1,r1);
r2 = rand2(r1,r1);
r3 = rand2(r1,r2);
r4 = rand2(r2,r3);
setcolours() ;set rgb arrays
If (debug) Print "+----+----+----+----+----+"
Select (view)
Case "m" : mercator() ;Mercator projection
Case "p" : peter() ;Peters projection (area preserving cylindrical)
Case "q" : squarep() ;Square projection (equidistant latitudes)
Case "M" : mollweide() ;Mollweide projection (area preserving)
Case "S" : sinusoid() ;Sinusoid projection (area preserving)
Case "s" : stereo() ;Stereographic projection
Case "o" : orthographic() ;Orthographic projection
Case "g" : gnomonic() ;Gnomonic projection
Case "a" : azimuth() ;Area preserving azimuthal projection
Case "c" : conical() ;Conical projection (conformal)
Case "h" : heightfield() ;heightfield
Case "f" ;Search
file=WriteFile(searchfile)
While (rseed<1)
Restore map0 ;set map data
readmap()
search(file)
best = 500000 ;reset
rseed = rseed + increment ;next seed
r1 = rseed;
r1 = rand2(r1,r1);
r2 = rand2(r1,r1);
r3 = rand2(r1,r2);
r4 = rand2(r2,r3);
Wend
CloseFile file
End Select
If (do_outline) makeoutline(do_bw) ;outlines
If (doshade) smoothshades() ;bumpmap shading
;add filetype extension
Select (file_type)
Case 1 : filename=filename+".ppm" ;ppm
Default : filename=filename+".bmp" ;bmp
End Select
;save map
Select (file_type)
Case 1 ;ppm
If (do_bw)
printppmBW(filename);
ElseIf (view <> "h")
printppm(filename);
Else
printheights(filename);
EndIf
Default ;bmp
If (do_bw)
printbmpBW(filename);
ElseIf (view <> "h")
printbmp(filename);
Else
printheights(filename);
EndIf
End Select
;draw map
image=CreateImage(Width,Height)
LockBuffer ImageBuffer(image)
For y=0 To ImageHeight(image)-1
For x=0 To ImageWidth(image)-1
If view="h"
rgb=heights(x,y)
Else
r=rtable(col(x,y)) Shl 16
g=gtable(col(x,y)) Shl 8
b=btable(col(x,y))
rgb=r+g+b
If doshade
s = (shades(x,y)/3)+85 ;smooth bumpmap
r = s*rtable(col(x,y))/150;
If (r>255) r=255;
g = s*gtable(col(x,y))/150;
If (g>255) g=255;
b = s*btable(col(x,y))/150;
If (b>255) b=255;
rgb=(r Shl 16)+(g Shl 8)+b
EndIf
EndIf
WritePixelFast x,y,rgb,ImageBuffer(image)
Next
Next
UnlockBuffer ImageBuffer(image)
SetBuffer BackBuffer()
DrawImage image,50,200
WaitKey
End
;data labels
.colors ;colorscheme 0
Data 0,0,255 ;Dark blue depths
Data 0,128,255 ;Light blue shores
Data 0,255,0 ;Light green lowlands
Data 64,192,16 ;Dark green highlands
Data 64,192,16 ;Dark green Mountains
Data 128,128,32 ;Brown stoney peaks
Data 255,255,255 ;White - peaks
Data 0,0,0 ;Black - Space
Data 0,0,0 ;Black - Lines
.atlas_colors ;colorscheme 1
Data 0,0,192 ;Dark blue depths
Data 0,128,255 ;Light blue shores
Data 0,96,0 ;Dark green Lowlands
Data 0,224,0 ;Light green Highlands
Data 128,176,0 ;Brown mountainsides
Data 128,128,128 ;Grey stoney peaks
Data 255,255,255 ;White - peaks
Data 0,0,0 ;Black - Space
Data 0,0,0 ;Black - Lines
.mars_colors ;colorscheme 2
Data 55,28,75 ;0
Data 136,92,80 ;1
Data 148,100,82 ;2
Data 232,164,90 ;3
Data 248,180,92 ;4
Data 165,128,108 ;5
Data 255,255,255 ;6
Data 0,0,0 ;7
Data 0,0,0 ;8
.grey_colors ;colorscheme 3
Data 96,96,96 ;0
Data 152,152,152 ;2
Data 144,144,144 ;1
Data 168,168,168 ;3
Data 160,160,160 ;4
Data 144,144,144 ;5
Data 128,128,128 ;6
Data 0,0,0 ;7
Data 0,0,0 ;8
.moon_colors ;colorscheme 4
Data 112,112,98 ;0
Data 168,168,147 ;2
Data 160,160,140 ;1
Data 184,184,161 ;3
Data 176,176,154 ;4
Data 160,160,140 ;5
Data 144,144,126 ;6
Data 0,0,0 ;7
Data 0,0,0 ;8
.cyan_colors ;colorscheme 5
Data 74,112,150 ;0
Data 126,168,210 ;2
Data 120,160,200 ;1
Data 138,184,230 ;3
Data 132,176,220 ;4
Data 120,160,200 ;5
Data 108,144,180 ;6
Data 0,0,0 ;7
Data 0,0,0 ;8
.moll_data ;mollweide gridlines
Data 0.0, 0.0685055811, 0.1368109534
Data 0.2047150027, 0.2720147303, 0.3385041213
Data 0.4039727534, 0.4682040106, 0.5309726991
Data 0.5920417499, 0.6511575166, 0.7080428038
Data 0.7623860881, 0.8138239166, 0.8619100185
Data 0.9060553621, 0.9453925506, 0.9783738403, 1.0;
.map0 ;map data resembling earth
Data "::;--*;;@O;.;..-:**:;;::"
Data "-*o@O;*;-,;;o*O@@@@@O--;"
Data "..,O@Oo-,.;*--o*@@@O*;,."
Data "...;O-;...;O**oo@@@*;..."
Data "....;*;-.,*@@O*;*;o-...."
Data ".....:oO;,.;O@;.:,---;,."
Data ";;....*@O,..oO-...;;*;;;"
Data ",.....;O:...;*:...,Ooo,,"
Data "......-;...........,,;;,"
Data ".......;................"
Data "oooooooOoooooooooooooooo"
;functions
Function min(x,y)
If x<y Then Return x Else Return y
End Function
Function max(x,y)
If x<y Then Return y Else Return x
End Function
Function fmin#(x#,y#)
If x<y Then Return x Else Return y
End Function
Function fmax#(x#,y#)
If x<y Then Return y Else Return x
End Function
Function setcolours()
Local i;
Local crow;
Local nocols = 256;
If (debug)
For crow = 0 To 8 ;MAXCOL-1
Write "c"+crow+"="+colors(crow,0)+","+colors(crow,1)+","+colors(crow,2)+" ";
If Not (crow+1) Mod 3 Print " "
Next
EndIf
If (altColors)
If (nocols < 8) nocols = 8;
;This Color table tries To follow the coloring conventions of
;several atlases.
;
;The First two colors are reserved For black And white
;1/4 of the colors are blue For the sea, dark being deep
;3/4 of the colors are land, divided as follows:
;nearly 1/2 of the colors are greens, with the low being dark
;1/8 of the colors shade from green through brown To grey
;1/8 of the colors are shades of grey For the highest altitudes
;
;The minimum Color table is:
;0 Black
;1 White
;2 Blue
;3 Dark Green
;4 Green
;5 Light Green
;6 Brown
;7 Grey
;And doesn't look very good. Somewhere between 24 And 32 colors
;is where this scheme starts looking good. 256, of course, is best.
LAND0 = max(nocols / 4, BLUE0 + 1);
BLUE1 = LAND0 - 1;
GREY0 = nocols - (nocols / 8);
GREEN1 = min(LAND0 + (nocols / 2), GREY0 - 2);
BROWN0 = (GREEN1 + GREY0) / 2;
LAND1 = nocols - 1;
rtable(BLACK) = colors(7,0);
gtable(BLACK) = colors(7,0);
btable(BLACK) = colors(7,0);
rtable(WHITE) = colors(6,0);
gtable(WHITE) = colors(6,1);
btable(WHITE) = colors(6,2);
rtable(BLUE0) = colors(0,0);
gtable(BLUE0) = colors(0,1);
btable(BLUE0) = colors(0,2);
For i=BLUE0+1 To BLUE1;
rtable(i) = (colors(0,0)*(BLUE1-i)+colors(1,0)*(i-BLUE0))/(BLUE1-BLUE0);
gtable(i) = (colors(0,1)*(BLUE1-i)+colors(1,1)*(i-BLUE0))/(BLUE1-BLUE0);
btable(i) = (colors(0,2)*(BLUE1-i)+colors(1,2)*(i-BLUE0))/(BLUE1-BLUE0);
Next
For i=LAND0 To GREEN1-1
rtable(i) = (colors(2,0)*(GREEN1-i)+colors(3,0)*(i-LAND0))/(GREEN1-LAND0);
gtable(i) = (colors(2,1)*(GREEN1-i)+colors(3,1)*(i-LAND0))/(GREEN1-LAND0);
btable(i) = (colors(2,2)*(GREEN1-i)+colors(3,2)*(i-LAND0))/(GREEN1-LAND0);
Next
For i=GREEN1 To BROWN0-1
rtable(i) = (colors(3,0)*(BROWN0-i)+colors(4,0)*(i-GREEN1))/(BROWN0-GREEN1);
gtable(i) = (colors(3,1)*(BROWN0-i)+colors(4,1)*(i-GREEN1))/(BROWN0-GREEN1);
btable(i) = (colors(3,2)*(BROWN0-i)+colors(4,2)*(i-GREEN1))/(BROWN0-GREEN1);
Next
For i=BROWN0 To GREY0-1
rtable(i) = (colors(4,0)*(GREY0-i)+colors(5,0)*(i-BROWN0))/(GREY0-BROWN0);
gtable(i) = (colors(4,1)*(GREY0-i)+colors(5,1)*(i-BROWN0))/(GREY0-BROWN0);
btable(i) = (colors(4,2)*(GREY0-i)+colors(5,2)*(i-BROWN0))/(GREY0-BROWN0);
Next
For i=GREY0 To nocols-1
rtable(i) = (colors(5,0)*(nocols-i)+(colors(6,0)+1)*(i-GREY0))/(nocols-GREY0);
gtable(i) = (colors(5,1)*(nocols-i)+(colors(6,1)+1)*(i-GREY0))/(nocols-GREY0);
btable(i) = (colors(5,2)*(nocols-i)+(colors(6,2)+1)*(i-GREY0))/(nocols-GREY0);
Next
Else
rtable(BLACK) = 0;
gtable(BLACK) = 0;
btable(BLACK) = 0;
rtable(WHITE) = 255;
gtable(WHITE) = 255;
btable(WHITE) = 255;
Local r, c;
Local x#;
While (lighter>0)
For r = 0 To 7-1
For c = 0 To 3-1
x = Sqr(Float(colors(r,c))/256.0);
colors(r,c) = Int(240.0*x+16);
Next
Next
lighter=lighter-1
Wend
BLUE1 = (nocols-4)/2+BLUE0;
If (BLUE1=BLUE0)
rtable(BLUE0) = colors(0,0);
gtable(BLUE0) = colors(0,1);
btable(BLUE0) = colors(0,2);
Else
For i=BLUE0 To BLUE1;
rtable(i) = (colors(0,0)*(BLUE1-i)+colors(1,0)*(i-BLUE0))/(BLUE1-BLUE0);
gtable(i) = (colors(0,1)*(BLUE1-i)+colors(1,1)*(i-BLUE0))/(BLUE1-BLUE0);
btable(i) = (colors(0,2)*(BLUE1-i)+colors(1,2)*(i-BLUE0))/(BLUE1-BLUE0);
Next
EndIf
LAND0 = BLUE1+1: LAND2 = nocols-2: LAND1 = (LAND0+LAND2+1)/2;
For i=LAND0 To LAND1-1
rtable(i) = (colors(2,0)*(LAND1-i)+colors(3,0)*(i-LAND0))/(LAND1-LAND0);
gtable(i) = (colors(2,1)*(LAND1-i)+colors(3,1)*(i-LAND0))/(LAND1-LAND0);
btable(i) = (colors(2,2)*(LAND1-i)+colors(3,2)*(i-LAND0))/(LAND1-LAND0);
Next
If (LAND1=LAND2)
rtable(LAND1) = colors(4,0);
gtable(LAND1) = colors(4,1);
btable(LAND1) = colors(4,2);
Else
For i=LAND1 To LAND2;
rtable(i) = (colors(4,0)*(LAND2-i)+colors(5,0)*(i-LAND1))/(LAND2-LAND1);
gtable(i) = (colors(4,1)*(LAND2-i)+colors(5,1)*(i-LAND1))/(LAND2-LAND1);
btable(i) = (colors(4,2)*(LAND2-i)+colors(5,2)*(i-LAND1))/(LAND2-LAND1);
Next
EndIf
LAND4 = nocols-1;
rtable(LAND4) = colors(6,0);
gtable(LAND4) = colors(6,1);
btable(LAND4) = colors(6,2);
EndIf
End Function
Function makeoutline(do_bw)
Local i,j,k;
Dim outx(Width*Height)
Dim outy(Width*Height)
k=0;
For i=1 To Width-2
For j=1 To Height-2
If ((col(i,j) >= BLUE0 And col(i,j) <= BLUE1) And (col(i-1,j) >= LAND0 Or col(i+1,j) >= LAND0 Or col(i,j-1) >= LAND0 Or col(i,j+1) >= LAND0 Or col(i-1,j-1) >= LAND0 Or col(i-1,j+1) >= LAND0 Or col(i+1,j-1) >= LAND0 Or col(i+1,j+1) >= LAND0))
outx(k) = i: outy(k) = j: k=k+1 ;outy(k++)
EndIf
Next
Next
If (do_bw)
For i=0 To Width-1
For j=0 To Height-1
If (col(i,j) <> BLACK) col(i,j) = WHITE;
While (k>0) ;(k-- >0)
col(outx(k),outy(k)) = BLACK
k=k-1
Wend
Next
Next
EndIf
End Function
Function smoothshades()
Local i,j;
For i=0 To Width-3 ;i<Width-2
For j=0 To Height-3;
shades(i,j) = (4*shades(i,j)+2*shades(i,j+1)+2*shades(i+1,j)+shades(i+1,j+2)+4)/9;
Next
Next
End Function
Function mercator() ;-pm
Local y#,scale1#,cos2#,theta1#,theta0#;
Local i,j,k;
y = Sin(lat*Rad2Deg) ;Sin(lat)
y = (1.0+y)/(1.0-y);
y = 0.5*Log(y);
k = Int(0.5*y*Width*scale/Pi);
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view ;%=mod
y = Pi*(2.0*(j-k)-Height)/Width/scale;
y = Exp(2.0*y);
y = (y-1.0)/(y+1.0);
scale1 = scale*Width/Height/Sqr(1.0-y*y)/Pi;
cos2 = Sqr(1.0-y*y);
Depth = 3*(Int(log_2(scale1*Height)))+3;
For i = 0 To Width-1
theta1 = longi-0.5*Pi+Pi*(2.0*i-Width)/Width/scale;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
y = (1.0+y)/(1.0-y);
y = 0.5*Log(y);
j = Height/2+Int(0.5*y*Width*scale/Pi)+k;
If (j>=0 And j<Height)
For i = 0 To Width-1: col(i,j) = BLACK: Next;
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta0 = 0.0
While theta0>-360.0
theta0=theta0-vgrid
theta1 = theta0
While theta1<360.0
theta1=theta1+vgrid
i = Int(0.5*Width*(1.0+scale*(DEG2RAD*theta1-longi)/Pi));
If (i>=0 And i<Width)
For j = 0 To Height-1: col(i,j) = BLACK: Next;
EndIf
Wend
Wend
EndIf
End Function
Function peter() ;-pp
Local y#,cos2#,theta1#,scale1#,theta0#
Local k,i,j,water,land
y = 2.0*Sin(lat*Rad2Deg) ;2.0*Sin(lat)
k = Int(0.5*y*Width*scale/Pi);
water = 0: land = 0;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
y = 0.5*Pi*(2.0*(j-k)-Height)/Width/scale;
If (Abs(y)>1.0)
For i = 0 To Width-1
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Next
Else
cos2 = Sqr(1.0-y*y);
If (cos2>0.0)
scale1 = scale*Width/Height/cos2/Pi;
Depth = 3*(Int(log_2(scale1*Height)))+3;
For i = 0 To Width-1
theta1 = longi-0.5*Pi+Pi*(2.0*i-Width)/Width/scale;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
If (col(i,j) < LAND0) Then water=water+1 Else land=land+1;
Next
EndIf
EndIf
Next
If (debug)
Print " ": Print "water percentage: "+(100*water/(water+land));
EndIf
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = 2.0*Sin(DEG2RAD*theta1*Rad2Deg) ;2.0*Sin(DEG2RAD*theta1)
j = Height/2+Int(0.5*y*Width*scale/Pi)+k;
If (j>=0 And j<Height)
For i = 0 To Width-1: col(i,j) = BLACK: Next;
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta0 = 0.0
While theta0>-360.0
theta0=theta0-vgrid
theta1 = theta0
While theta1<360.0
theta1=theta1+vgrid
i = Int(0.5*Width*(1.0+scale*(DEG2RAD*theta1-longi)/Pi));
If (i>=0 And i<Width)
For j = max(0,Height/2-Int(Width*scale/Pi)+k) To min(Height,Height/2+Int(Width*scale/Pi)+k)-1
col(i,j) = BLACK;
Next
EndIf
Wend
Wend
EndIf
End Function
Function squarep() ;-pq
Local y#,scale1#,theta1#,cos2#,theta0#;
Local k,i,j;
k = Int(lat*Width*scale/Pi);
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
y = (2.0*(j-k)-Height)/Width/scale*Pi;
If (Abs(y)>0.5*Pi) ;(Abs(y)>=0.5*Pi)
For i = 0 To Width-1
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Next
Else
cos2 = Cos(y*Rad2Deg) ;Cos(y)
If (cos2>0.0)
scale1 = scale*Width/Height/cos2/Pi;
Depth = 3*(Int(log_2(scale1*Height)))+3;
For i = 0 To Width-1
theta1 = longi-0.5*Pi+Pi*(2.0*i-Width)/Width/scale;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,Sin(y*Rad2Deg),-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,Sin(y),-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
Next
EndIf
EndIf
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = DEG2RAD*theta1;
j = Height/2+Int(0.5*y*Width*scale/Pi)+k;
If (j>=0 And j<Height)
For i = 0 To Width-1: col(i,j) = BLACK: Next;
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta0 = 0.0
While theta0>-360.0
theta0=theta0-vgrid
theta1 = theta0
While theta1<360.0
theta1=theta1+vgrid
i = Int(0.5*Width*(1.0+scale*(DEG2RAD*theta1-longi)/Pi));
If (i>=0 And i<Width)
For j = max(0,Height/2-Int(0.25*Pi*Width*scale/Pi)+k) To min(Height,Height/2+Int(0.25*Pi*Width*scale/Pi)+k)-1
col(i,j) = BLACK;
Next
EndIf
Wend
Wend
EndIf
End Function
Function mollweide() ;-pM
Local x#,y#,y1#,zz#,scale1#,cos2#,theta1#,theta2#,theta0#;
Local i,j,i1=1,k;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
y1 = 2*(2.0*j-Height)/Width/scale;
If (Abs(y1)>=1.0)
For i = 0 To Width-1
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Next
Else
zz = Sqr(1.0-y1*y1);
y = 2.0/Pi*(y1*zz+ASin(y1))
cos2 = Sqr(1.0-y*y);
If (cos2>0.0)
scale1 = scale*Width/Height/cos2/Pi;
Depth = 3*(Int(log_2(scale1*Height)))+3;
For i = 0 To Width-1
theta1 = Pi/zz*(2.0*i-Width)/Width/scale;
If (Abs(theta1)>Pi)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
theta1 = theta1 + longi-0.5*Pi;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
EndIf
Next
EndIf
EndIf
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
theta2 = Abs(theta1);
x = Floor(theta2/5.0): y = theta2/5.0-x;
y = (1.0-y)*moll_table(Int(x))+y*moll_table(Int(x+1));
If (theta1<0.0) y = -y;
j = Height/2+Int(0.25*y*Width*scale);
If (j>=0 And j<Height)
For i = max(0,Width/2-Int(0.5*Width*scale*Sqr(1.0-y*y))) To min(Width,Width/2+Int(0.5*Width*scale*Sqr(1.0-y*y)))-1
col(i,j) = BLACK;
Next
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta0 = 0.0
While theta0>-360.0
theta0=theta0-vgrid
theta1 = theta0
While theta1<360.0
theta1=theta1+vgrid
If (DEG2RAD*theta1-longi+0.5*Pi>-Pi And DEG2RAD*theta1-longi+0.5*Pi<=Pi)
x = 0.5*(DEG2RAD*theta1-longi+0.5*Pi)*Width*scale/Pi;
j = max(0,Height/2-Int(0.25*Width*scale));
y = 2*(2.0*j-Height)/Width/scale;
i = Width/2+x*Sqr(1.0-y*y);
For j = max(0,Height/2-Int(0.25*Width*scale)) To min(Height,Height/2+Int(0.25*Width*scale))
y1 = 2*(2.0*j-Height)/Width/scale;
If (Abs(y1)<=1.0)
i1 = Width/2+x*Sqr(1.0-y1*y1);
If (i1>=0 And i1<Width) col(i1,j) = BLACK;
EndIf
If (Abs(y)<=1.0)
If (i<i1)
For k=i+1 To i1-1 ;for (k=i+1; k<i1; k++)
If (k>0 And k<Width) col(k,j) = BLACK;
Next
ElseIf (i>i1)
k=i-1
While k>i1 ;for (k=i-1; k>i1; k--)
If (k>=0 And k<Width) col(k,j) = BLACK;
k=k-1
Wend
EndIf
EndIf
y = y1;
i = i1;
Next
EndIf
Wend
Wend
EndIf
End Function
Function sinusoid() ;-pS
Local y#,theta1#,theta2#,cos2#,l1#,i1#,scale1#,theta0#;
Local k,i,j,l,c;
k = Int(lat*Width*scale/Pi);
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
y = (2.0*(j-k)-Height)/Width/scale*Pi;
If (Abs(y)>=0.5*Pi)
For i = 0 To Width-1
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Next
Else
cos2 = Cos(y*Rad2Deg) ;Cos(y)
If (cos2>0.0)
scale1 = scale*Width/Height/cos2/Pi;
Depth = 3*(Int(log_2(scale1*Height)))+3;
For i = 0 To Width-1
l = i*12/Width;
l1 = l*Width/12.0;
i1 = i-l1;
theta2 = longi-0.5*Pi+Pi*(2.0*l1-Width)/Width/scale;
theta1 = (Pi*(2.0*i1-Width/12)/Width/scale)/cos2;
If (Abs(theta1)>Pi/12.0)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
col(i,j) = planet0(Cos((theta1+theta2)*Rad2Deg)*cos2,Sin(y*Rad2Deg),-Sin((theta1+theta2)*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1+theta2)*cos2,Sin(y),-Sin(theta1+theta2)*cos2);
If (doshade) shades(i,j) = shade;
EndIf
Next
EndIf
EndIf
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = DEG2RAD*theta1;
cos2 = Cos(y*Rad2Deg) ;Cos(y)
j = Height/2+Int(0.5*y*Width*scale/Pi)+k;
If (j>=0 And j<Height)
For i = 0 To Width-1
l = i*12/Width;
l1 = l*Width/12.0;
i1 = i-l1;
theta2 = (Pi*(2.0*i1-Width/12)/Width/scale)/cos2;
If (Abs(theta2)<=Pi/12.0) col(i,j) = BLACK;
Next
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta0 = 0.0
While theta0>-360.0
theta0=theta0-vgrid
theta1 = theta0
While theta1<360.0
theta1=theta1+vgrid
i = Int(0.5*Width*(1.0+scale*(DEG2RAD*theta1-longi)/Pi));
If (i>=0 And i<Width)
For j = max(0,Height/2-Int(0.25*Pi*Width*scale/Pi)+k) To min(Height,Height/2+Int(0.25*Pi*Width*scale/Pi)+k)-1
y = (2.0*(j-k)-Height)/Width/scale*Pi;
cos2 = Cos(y*Rad2Deg) ;Cos(y)
l = i*12/Width;
l1 = l*Width/12.0+Width/24.0;
i1 = i-l1;
c = l1+i1*cos2;
If (c>=0 And c<Width) col(c,j) = BLACK;
Next
EndIf
Wend
Wend
EndIf
End Function
Function stereo() ;-ps
Local x#,y#,ymin#,ymax#,z#,zz#,x1#,y1#,z1#,theta1#,theta2#,theta0#;
Local i,j;
ymin = 2.0;
ymax = -2.0;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale;
z = x*x+y*y;
zz = 0.25*(4.0+z);
x = x/zz;
y = y/zz;
z = (1.0-0.25*z)/zz;
x1 = clo*x+slo*sla*y+slo*cla*z;
y1 = cla*y-sla*z;
z1 = -slo*x+clo*sla*y+clo*cla*z;
If (y1 < ymin) ymin = y1;
If (y1 > ymax) ymax = y1;
col(i,j) = planet0(x1,y1,z1);
If (doshade) shades(i,j) = shade;
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(1-y*y);
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
x = Sin(theta2*Rad2Deg)*zz ;Sin(theta2)*zz
z = Cos(theta2*Rad2Deg)*zz ;Cos(theta2)*zz
x1 = clo*x+slo*z;
y1 = slo*sla*x+cla*y-clo*sla*z;
z1 = -slo*cla*x+sla*y+clo*cla*z;
If (Abs(z1)<1.0)
i = 0.5*(Height*scale*2.0*x1*(1+z1)/(1.0-z1*z1)+Width);
j = 0.5*(Height*scale*2.0*y1*(1+z1)/(1.0-z1*z1)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (ymin <= y And y <= ymax)
theta1 = 0.0
While theta1<360.0
theta1=theta1+vgrid
x = Sin(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
z = Cos(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
;x = Sin(DEG2RAD*theta1)*Cos(theta2);
;z = Cos(DEG2RAD*theta1)*Cos(theta2);
x1 = clo*x+slo*z;
y1 = slo*sla*x+cla*y-clo*sla*z;
z1 = -slo*cla*x+sla*y+clo*cla*z;
If (Abs(z1)<1.0)
i = 0.5*(Height*scale*2.0*x1*(1+z1)/(1-z1*z1)+Width);
j = 0.5*(Height*scale*2.0*y1*(1+z1)/(1-z1*z1)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
EndIf
End Function
Function orthographic() ;-po
Local x#,y#,z#,x1#,y1#,z1#,ymin#,ymax#,theta1#,theta2#,zz#,theta0#;
Local i,j;
ymin = 2.0;
ymax = -2.0;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale;
If (x*x+y*y>1.0)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
z = Sqr(1.0-x*x-y*y);
x1 = clo*x+slo*sla*y+slo*cla*z;
y1 = cla*y-sla*z;
z1 = -slo*x+clo*sla*y+clo*cla*z;
If (y1 < ymin) ymin = y1;
If (y1 > ymax) ymax = y1;
col(i,j) = planet0(x1,y1,z1);
If (doshade) shades(i,j) = shade;
EndIf
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(1-y*y);
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
x = Sin(theta2*Rad2Deg)*zz ;Sin(theta2)*zz
z = Cos(theta2*Rad2Deg)*zz ;Cos(theta2)*zz
x1 = clo*x+slo*z;
y1 = slo*sla*x+cla*y-clo*sla*z;
z1 = -slo*cla*x+sla*y+clo*cla*z;
If (z1<=0.0)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*y1+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (ymin <= y And y <= ymax)
theta1 = 0.0
While theta1<360.0
theta1=theta1+vgrid
x = Sin(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
z = Cos(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
;x = Sin(DEG2RAD*theta1)*Cos(theta2);
;z = Cos(DEG2RAD*theta1)*Cos(theta2);
x1 = clo*x+slo*z;
y1 = slo*sla*x+cla*y-clo*sla*z;
z1 = -slo*cla*x+sla*y+clo*cla*z;
If (0.0>=z1)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*y1+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
EndIf
End Function
Function gnomonic() ;-pg
Local x#,y#,z#,x1#,y1#,z1#,zz#,theta1#,theta2#,ymin#,ymax#,theta0#;
Local i,j;
ymin = 2.0;
ymax = -2.0;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale;
zz = Sqr(1.0/(1.0+x*x+y*y));
x = x*zz;
y = y*zz;
z = Sqr(1.0-x*x-y*y);
x1 = clo*x+slo*sla*y+slo*cla*z;
y1 = cla*y-sla*z;
z1 = -slo*x+clo*sla*y+clo*cla*z;
If (y1 < ymin) ymin = y1;
If (y1 > ymax) ymax = y1;
col(i,j) = planet0(x1,y1,z1);
If (doshade) shades(i,j) = shade;
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(1-y*y);
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
x = Sin(theta2*Rad2Deg)*zz ;Sin(theta2)*zz
z = Cos(theta2*Rad2Deg)*zz ;Cos(theta2)*zz
x1 = clo*x-slo*z;
y1 = slo*sla*x+cla*y+clo*sla*z;
z1 = slo*cla*x-sla*y+clo*cla*z;
If (z1<>0.0)
i = 0.5*(Height*scale*x1/z1+Width);
j = 0.5*(Height*scale*y1/z1+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (ymin <= y And y <= ymax)
theta1 = 0.0
While theta1<360.0
theta1=theta1+vgrid
x = Sin(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
z = Cos(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
;x = Sin(DEG2RAD*theta1)*Cos(theta2);
;z = Cos(DEG2RAD*theta1)*Cos(theta2);
x1 = clo*x-slo*z;
y1 = slo*sla*x+cla*y+clo*sla*z;
z1 = slo*cla*x-sla*y+clo*cla*z;
If (z1<>0.0)
i = 0.5*(Height*scale*x1/z1+Width);
j = 0.5*(Height*scale*y1/z1+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
EndIf
End Function
Function azimuth() ;-pa
Local x#,y#,z#,x1#,y1#,z1#,zz#,theta1#,theta2#,ymin#,ymax#,theta0#;
Local i,j;
ymin = 2.0;
ymax = -2.0;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale;
zz = x*x+y*y;
z = 1.0-0.5*zz;
If (z<-1.0)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
zz = Sqr(1.0-0.25*zz);
x = x*zz;
y = y*zz;
x1 = clo*x+slo*sla*y+slo*cla*z;
y1 = cla*y-sla*z;
z1 = -slo*x+clo*sla*y+clo*cla*z;
If (y1 < ymin) ymin = y1;
If (y1 > ymax) ymax = y1;
col(i,j) = planet0(x1,y1,z1);
If (doshade) shades(i,j) = shade;
EndIf
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(1-y*y);
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
x = Sin(theta2*Rad2Deg)*zz ;Sin(theta2)*zz
z = Cos(theta2*Rad2Deg)*zz ;Cos(theta2)*zz
x1 = clo*x-slo*z;
y1 = slo*sla*x+cla*y+clo*sla*z;
z1 = slo*cla*x-sla*y+clo*cla*z;
If (z1<>-1.0)
i = 0.5*(Height*scale*x1/Sqr(0.5+0.5*z1)+Width);
j = 0.5*(Height*scale*y1/Sqr(0.5+0.5*z1)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta2=-Pi
While theta2<Pi
theta2=theta2+0.5/Width/scale
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (ymin <= y And y <= ymax)
theta1 = 0.0
While theta1<360.0
theta1=theta1+vgrid
x = Sin(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
z = Cos(DEG2RAD*theta1*Rad2Deg)*Cos(theta2*Rad2Deg);
;x = Sin(DEG2RAD*theta1)*Cos(theta2);
;z = Cos(DEG2RAD*theta1)*Cos(theta2);
x1 = clo*x-slo*z;
y1 = slo*sla*x+cla*y+clo*sla*z;
z1 = slo*cla*x-sla*y+clo*cla*z;
If (z1<>-1.0)
i = 0.5*(Height*scale*x1/Sqr(0.5+0.5*z1)+Width);
j = 0.5*(Height*scale*y1/Sqr(0.5+0.5*z1)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
EndIf
Wend
EndIf
Wend
EndIf
End Function
Function conical() ;-pc
Local k1#,c#,y2#,x#,y#,zz#,x1#,y1#,z1#
Local theta1#,theta2#,ymin#,ymax#,cos2#,theta0#;
Local i,j;
ymin = 2.0;
ymax = -2.0;
If (lat>0)
k1 = 1.0/Sin(lat*Rad2Deg) ;1.0/Sin(lat)
c = k1*k1;
y2 = Sqr(c*(1.0-Sin((lat/k1)*Rad2Deg))/(1.0+Sin((lat/k1)*Rad2Deg)));
;y2 = Sqr(c*(1.0-Sin(lat/k1))/(1.0+Sin(lat/k1)));
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale+y2;
zz = x*x+y*y;
If (zz=0.0) Then theta1 = 0.0 Else theta1 = k1*ATan2(x,y);
If (theta1<-Pi Or theta1>Pi)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
theta1 = theta1 + longi-0.5*Pi ;theta1 is longitude
theta2 = k1*ASin((zz-c)/(zz+c)) ;theta2 is latitude
If (theta2 > 0.5*Pi Or theta2 < -0.5*Pi)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
cos2 = Cos(theta2*Rad2Deg) ;Cos(theta2)
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (y < ymin) ymin = y;
If (y > ymax) ymax = y;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
EndIf
EndIf
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(c*(1.0+Sin(DEG2RAD*(theta1/k1)*Rad2Deg))/(1.0-Sin(DEG2RAD*(theta1/k1)*Rad2Deg)));
;zz = Sqr(c*(1.0+Sin(DEG2RAD*theta1/k1))/(1.0-Sin(DEG2RAD*theta1/k1)));
theta2=-Pi+longi
While theta2<Pi+longi
theta2=theta2+0.5/Width/scale
z1 = theta2-longi;
x1 = zz*Sin((z1/k1)*Rad2Deg) ;zz*Sin(z1/k1)
y1 = zz*Cos((z1/k1)*Rad2Deg) ;zz*Cos(z1/k1)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*(y1-y2)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta1=-0.5*Pi
While theta1<0.5*Pi
theta1=theta1+0.5/Width/scale
y = Sin(theta1*Rad2Deg) ;Sin(theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(c*(1.0+Sin(theta1/k1*Rad2Deg))/(1.0-Sin(theta1/k1*Rad2Deg)));
;zz = Sqr(c*(1.0+Sin(theta1/k1))/(1.0-Sin(theta1/k1)));
theta0 = 0.0
While theta0>-180.0+longi/DEG2RAD
theta0=theta0-vgrid
theta2 = theta0
While theta2<180.0+longi/DEG2RAD
theta2=theta2+vgrid
z1 = DEG2RAD*theta2-longi
x1 = zz*Sin(z1/k1*Rad2Deg) ;zz*Sin(z1/k1)
y1 = zz*Cos(z1/k1*Rad2Deg) ;zz*Cos(z1/k1)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*(y1-y2)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
Wend
Wend
EndIf
Wend
EndIf
Else
k1 = 1.0/Sin(lat*Rad2Deg) ;1.0/Sin(lat)
c = k1*k1;
y2 = Sqr(c*(1.0-Sin(lat/k1*Rad2Deg))/(1.0+Sin(lat/k1*Rad2Deg)));
;y2 = Sqr(c*(1.0-Sin(lat/k1))/(1.0+Sin(lat/k1)));
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale-y2;
zz = x*x+y*y;
If (zz=0.0) Then theta1 = 0.0 Else theta1 = -k1*ATan2(x,-y);
If (theta1<-Pi Or theta1>Pi)
col(i,j) = 2;BACK;
If (doshade) shades(i,j) = 255;
Else
theta1 = theta1 + longi-0.5*Pi ;theta1 is longitude
theta2 = k1*ASin((zz-c)/(zz+c)) ;theta2 is latitude
If (theta2 > 0.5*Pi Or theta2 < -0.5*Pi)
col(i,j) = BACK;
If (doshade) shades(i,j) = 255;
Else
cos2 = Cos(theta2*Rad2Deg) ;Cos(theta2)
y = Sin(theta2*Rad2Deg) ;Sin(theta2)
If (y < ymin) ymin = y;
If (y > ymax) ymax = y;
col(i,j) = planet0(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
;col(i,j) = planet0(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
If (doshade) shades(i,j) = shade;
EndIf
EndIf
Next
Next
If (hgrid <> 0.0) ;draw horisontal gridlines
theta0 = 0.0
While theta0>-90.0
theta0=theta0-hgrid
theta1 = theta0
While theta1<90.0
theta1=theta1+hgrid
y = Sin(DEG2RAD*theta1*Rad2Deg) ;Sin(DEG2RAD*theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(c*(1.0+Sin(DEG2RAD*theta1/k1*Rad2Deg))/(1.0-Sin(DEG2RAD*theta1/k1*Rad2Deg)));
;zz = Sqr(c*(1.0+Sin(DEG2RAD*theta1/k1))/(1.0-Sin(DEG2RAD*theta1/k1)));
theta2=-Pi+longi
While theta2<Pi+longi
theta2=theta2+0.5/Width/scale
z1 = theta2-longi;
x1 = -zz*Sin(z1/k1*Rad2Deg) ;-zz*Sin(z1/k1)
y1 = -zz*Cos(z1/k1*Rad2Deg) ;-zz*Cos(z1/k1)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*(y1+y2)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
Wend
EndIf
Wend
Wend
EndIf
If (vgrid <> 0.0) ;draw vertical gridlines
theta1=-0.5*Pi
While theta1<0.5*Pi
theta1=theta1+0.5/Width/scale
y = Sin(theta1*Rad2Deg) ;Sin(theta1)
If (ymin <= y And y <= ymax)
zz = Sqr(c*(1.0+Sin(theta1/k1*Rad2Deg))/(1.0-Sin(theta1/k1*Rad2Deg)));
;zz = Sqr(c*(1.0+Sin(theta1/k1))/(1.0-Sin(theta1/k1)));
theta0 = 0.0
While theta0>-180.0+longi/DEG2RAD
theta0=theta0-vgrid
theta2 = theta0
While theta2<180.0+longi/DEG2RAD
theta2=theta2+vgrid
z1 = DEG2RAD*theta2-longi;
x1 = -zz*Sin(z1/k1*Rad2Deg) ;-zz*Sin(z1/k1)
y1 = -zz*Cos(z1/k1*Rad2Deg) ;-zz*Cos(z1/k1)
i = 0.5*(Height*scale*x1+Width);
j = 0.5*(Height*scale*(y1+y2)+Height);
If (i>=0 And i<Width And j>=0 And j<Height) col(i,j) = BLACK;
Wend
Wend
EndIf
Wend
EndIf
EndIf
End Function
Function heightfield()
Local x#,y#,z#,x1#,y1#,z1#
Local i,j;
For j = 0 To Height-1
If (debug And ((j Mod (Height/25)) = 0)) Write view
For i = 0 To Width-1
x = (2.0*i-Width)/Height/scale;
y = (2.0*j-Height)/Height/scale;
If (x*x+y*y>1.0)
heights(i,j) = 0;
Else
z = Sqr(1.0-x*x-y*y);
x1 = clo*x+slo*sla*y+slo*cla*z;
y1 = cla*y-sla*z;
z1 = -slo*x+clo*sla*y+clo*cla*z;
heights(i,j) = 10000000*planet1(x1,y1,z1);
EndIf
Next
Next
End Function
Function readmap()
Local i,j;
Local y#;
Local c$,cline$ ;char
Width = 47: Height = 21;
For j = 0 To Height-1
y = 0.5*7.5*(2.0*j-Height+1);
y = Cos(DEG2RAD*y*Rad2Deg) ;Cos(DEG2RAD*y)
weight(j) = Int(100.0*y+0.5);
Next
For j = 0 To Height-1 Step 2 ;j+=2
Read cline ;read map data line
For i = 0 To Width-1 Step 2 ;i+=2
c = Mid(cline,1+(i/2),1) ;getchar()
Select (c)
Case ".": cl0(i,j) = -8;
Case ",": cl0(i,j) = -4;
Case ":": cl0(i,j) = -2;
Case ";": cl0(i,j) = -1;
Case "-": cl0(i,j) = 0;
Case "*": cl0(i,j) = 1;
Case "o": cl0(i,j) = 2;
Case "O": cl0(i,j) = 4;
Case "@": cl0(i,j) = 8;
Default: Print "Wrong map symbol: "+c
End Select
If (i>0) cl0(i-1,j) = (cl0(i,j)+cl0(i-2,j))/2;
Next
If (debug) Print "line "+cline
Next
For j = 1 To Height-1 Step 2 ;j+=2
For i = 0 To Width-1
cl0(i,j) = (cl0(i,j-1)+cl0(i,j+1))/2;
Next
Next
End Function
Function search(file)
Local y#,cos2#,theta1#,scale1#
Local y2#,cos22#,theta12#;
Local i,j,k,l,c,c1,c2,c3,errcount,errcount1,ascii$
For j = 0 To Height-1
y = 0.5*7.5*(2.0*j-Height+1);
y = Sin(DEG2RAD*y*Rad2Deg) ;Sin(DEG2RAD*y)
scale1 = Width/Height/Sqr(1.0-y*y)/Pi;
cos2 = Sqr(1.0-y*y);
y2 = 0.5*7.5*(2.0*j-Height+1.5);
y2 = Sin(DEG2RAD*y2*Rad2Deg) ;Sin(DEG2RAD*y2)
cos2 = Sqr(1.0-y2*y2);
Depth = 3*(Int(log_2(scale1*Height)))+6;
For i = 0 To Width-1
theta1 = -0.5*Pi+Pi*(2.0*i-Width)/Width;
theta12 = -0.5*Pi+Pi*(2.0*i+0.5-Width)/Width;
c = 128+1000*planet1(Cos(theta1*Rad2Deg)*cos2,y,-Sin(theta1*Rad2Deg)*cos2);
c1 = 128+1000*planet1(Cos(theta12*Rad2Deg)*cos2,y,-Sin(theta12*Rad2Deg)*cos2);
c2 = 128+1000*planet1(Cos(theta1*Rad2Deg)*cos22,y2,-Sin(theta1*Rad2Deg)*cos22);
c3 = 128+1000*planet1(Cos(theta12*Rad2Deg)*cos22,y2,-Sin(theta12*Rad2Deg)*cos22);
;c = 128+1000*planet1(Cos(theta1)*cos2,y,-Sin(theta1)*cos2);
;c1 = 128+1000*planet1(Cos(theta12)*cos2,y,-Sin(theta12)*cos2);
;c2 = 128+1000*planet1(Cos(theta1)*cos22,y2,-Sin(theta1)*cos22);
;c3 = 128+1000*planet1(Cos(theta12)*cos22,y2,-Sin(theta12)*cos22);
c = (c+c1+c2+c3)/4.0;
If (c<0) c = 0;
If (c>255) c = 255;
col(i,j) = c;
Next
Next
For k=0 To Width-1
For l=-20 To 20 Step 2 ;l+=2
errcount = 0;
For j = 0 To Height-1
errcount1 = 0;
For i = 0 To Width-1
If (cl0(i,j)<0 And col((i+k) Mod Width,j) > 128-l)
errcount1=errcount1-cl0(i,j);
EndIf
If (cl0(i,j)>0 And col((i+k) Mod Width,j) <= 128-l)
errcount1=errcount1+cl0(i,j);
EndIf
Next
errcount = errcount + weight(j)*errcount1;
Next
If (errcount < best)
ascii="Errors: "+errcount+", parameters: -s "+rseed+" -l "+((360.0*k)/(Width+1))+" -i "+(M+l/1000.0)
Print ascii
best = errcount;
For j = 0 To Height-1
If j=0 ;first line of ascii map
WriteByte file,13: WriteByte file,10 ;newline
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
WriteByte file,13: WriteByte file,10 ;newline
EndIf
For i = 0 To Width-1
If (col((i+k) Mod Width,j) <= 128-l)
WriteByte file,Asc(".") ;putchar('.');
Else
WriteByte file,Asc("O")
EndIf
Next
WriteByte file,13: WriteByte file,10 ;newline
Next
EndIf
Next
Next
End Function
Function planet0(x#,y#,z#)
;x#,y#,z#
Local alt#;
Local colour;
alt = planet1(x,y,z);
If (altColors)
Local snow# = 0.125;
Local tree# = snow * 0.5;
Local bare# = (tree + snow) / 2.0;
If (latic)
snow = snow - (0.13 * (y*y*y*y*y*y));
bare = bare - (0.12 * (y*y*y*y*y*y));
tree = tree - (0.11 * (y*y*y*y*y*y));
EndIf
If (alt > 0) ;Land
If (alt > snow) ;Snow: White
colour = WHITE;
ElseIf (alt > bare) ;Snow: Grey - White
colour = GREY0+Int((1+LAND1-GREY0) * (alt-bare)/(snow-bare));
If (colour > LAND1) colour = LAND1;
ElseIf (alt > tree) ;Bare: Brown - Grey
colour = GREEN1+Int((1+GREY0-GREEN1) * (alt-tree)/(bare-tree));
If (colour > GREY0) colour = GREY0;
Else ;Green: Green - Brown
colour = LAND0+Int((1+GREEN1-LAND0) * (alt)/(tree));
If (colour > GREEN1) colour = GREEN1;
EndIf
Else ;Sea
alt = alt/2;
If (alt > snow) ;Snow: White
colour = WHITE;
ElseIf (alt > bare)
colour = GREY0+Int((1+LAND1-GREY0) * (alt-bare)/(snow-bare));
If (colour > LAND1) colour = LAND1;
Else
colour = BLUE1+Int((BLUE1-BLUE0+1)*(25*alt));
If (colour<BLUE0) colour = BLUE0;
EndIf
EndIf
Else ;calculate colour
If (alt <=0.0) ;if below sea level then
If (latic And y*y+alt >= 0.98)
colour = LAND4 ;white if close to poles
Else
colour = BLUE1+Int((BLUE1-BLUE0+1)*(10*alt)) ;blue scale otherwise
If (colour<BLUE0) colour = BLUE0;
EndIf
Else
If (latic) alt = alt + 0.10204*y*y ;altitude adjusted with latitude
If (alt >= 0.1) ;if high then
colour = LAND4;
Else ;else green to brown scale
colour = LAND0+Int((LAND2-LAND0+1)*(10*alt));
If (colour>LAND2) colour = LAND2;
EndIf
EndIf
EndIf
Return (colour);
End Function
Function planet#(a#,b#,c#,d#,as#,bs#,cs#,ds#,ax#,ay#,az#,bx#,by#,bz#,cx#,cy#,cz#,dx#,dy#,dz#,x#,y#,z#,level)
;a#,b#,c#,d# = altitudes of the 4 vertices
;as#,bs#,cs#,ds# = seeds of the 4 vertices
;ax#,ay#,az#,bx#,by#,bz#,cx#,cy#,cz#,dx#,dy#,dz# = vertex coordinates
;x#,y#,z# = goal point
;level = levels to go
Local ssa#,ssb#,ssc#,ssd#,ssas#,ssbs#,sscs#,ssds#,ssax#,ssay#,ssaz#
Local ssbx#,ssby#,ssbz#,sscx#,sscy#,sscz#,ssdx#,ssdy#,ssdz#;
Local abx#,aby#,abz#,acx#,acy#,acz#,adx#,ady#,adz#;
Local bcx#,bcy#,bcz#,bdx#,bdy#,bdz#,cdx#,cdy#,cdz#;
Local lab#,lac#,lad#,lbc#,lbd#,lcd#;
Local ex#,ey#,ez#,e#,es#,es1#,es2#,es3#;
Local eax#,eay#,eaz#,epx#,epy#,epz#;
Local ecx#,ecy#,ecz#,edx#,edy#,edz#;
Local x1#,y1#,z1#,x2#,y2#,z2#,l1#,tmp#;
If (level>0)
If (level=11)
ssa=a: ssb=b: ssc=c: ssd=d: ssas=as: ssbs=bs: sscs=cs: ssds=ds;
ssax=ax: ssay=ay: ssaz=az: ssbx=bx: ssby=by: ssbz=bz;
sscx=cx: sscy=cy: sscz=cz: ssdx=dx: ssdy=dy: ssdz=dz;
EndIf
abx = ax-bx: aby = ay-by: abz = az-bz;
acx = ax-cx: acy = ay-cy: acz = az-cz;
lab = abx*abx+aby*aby+abz*abz;
lac = acx*acx+acy*acy+acz*acz;
If (lab<lac)
Return (planet(a,c,b,d,as,cs,bs,ds,ax,ay,az,cx,cy,cz,bx,by,bz,dx,dy,dz,x,y,z,level));
Else
adx = ax-dx: ady = ay-dy: adz = az-dz;
lad = adx*adx+ady*ady+adz*adz;
If (lab<lad)
Return (planet(a,d,b,c,as,ds,bs,cs,ax,ay,az,dx,dy,dz,bx,by,bz,cx,cy,cz,x,y,z,level));
Else
bcx = bx-cx: bcy = by-cy: bcz = bz-cz;
lbc = bcx*bcx+bcy*bcy+bcz*bcz;
If (lab<lbc)
Return (planet(b,c,a,d,bs,cs,as,ds,bx,by,bz,cx,cy,cz,ax,ay,az,dx,dy,dz,x,y,z,level));
Else
bdx = bx-dx: bdy = by-dy: bdz = bz-dz;
lbd = bdx*bdx+bdy*bdy+bdz*bdz;
If (lab<lbd)
Return (planet(b,d,a,c,bs,ds,as,cs,bx,by,bz,dx,dy,dz,ax,ay,az,cx,cy,cz,x,y,z,level));
Else
cdx = cx-dx: cdy = cy-dy: cdz = cz-dz;
lcd = cdx*cdx+cdy*cdy+cdz*cdz;
If (lab<lcd)
Return (planet(c,d,a,b,cs,ds,as,bs,cx,cy,cz,dx,dy,dz,ax,ay,az,bx,by,bz,x,y,z,level));
Else
es = rand2(as,bs);
es1 = rand2(es,es);
es2 = 0.5+0.1*rand2(es1,es1);
es3 = 1.0-es2;
If (ax=bx) ;very unlikely to ever happen
ex = 0.5*ax+0.5*bx: ey = 0.5*ay+0.5*by: ez = 0.5*az+0.5*bz;
ElseIf (ax<bx)
ex = es2*ax+es3*bx: ey = es2*ay+es3*by: ez = es2*az+es3*bz;
Else
ex = es3*ax+es2*bx: ey = es3*ay+es2*by: ez = es3*az+es2*bz;
EndIf
If (lab>1.0) lab = lab^0.75 ;pow(lab,0.75);
e = 0.5*(a+b)+es*dd1*Abs(a-b)+es1*dd2*(lab^POW) ;pow(lab,POW);
eax = ax-ex: eay = ay-ey: eaz = az-ez;
epx = x-ex: epy = y-ey: epz = z-ez;
ecx = cx-ex: ecy = cy-ey: ecz = cz-ez;
edx = dx-ex: edy = dy-ey: edz = dz-ez;
If ((eax*ecy*edz+eay*ecz*edx+eaz*ecx*edy-eaz*ecy*edx-eay*ecx*edz-eax*ecz*edy)*(epx*ecy*edz+epy*ecz*edx+epz*ecx*edy-epz*ecy*edx-epy*ecx*edz-epx*ecz*edy)>0.0)
Return (planet(c,d,a,e,cs,ds,as,es,cx,cy,cz,dx,dy,dz,ax,ay,az,ex,ey,ez,x,y,z,level-1));
Else
Return (planet(c,d,b,e,cs,ds,bs,es,cx,cy,cz,dx,dy,dz,bx,by,bz,ex,ey,ez,x,y,z,level-1));
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
Else
If (doshade)
x1 = 0.25*(ax+bx+cx+dx);
x1 = a*(x1-ax)+b*(x1-bx)+c*(x1-cx)+d*(x1-dx);
y1 = 0.25*(ay+by+cy+dy);
y1 = a*(y1-ay)+b*(y1-by)+c*(y1-cy)+d*(y1-dy);
z1 = 0.25*(az+bz+cz+dz);
z1 = a*(z1-az)+b*(z1-bz)+c*(z1-cz)+d*(z1-dz);
l1 = Sqr(x1*x1+y1*y1+z1*z1);
If (l1=0.0) l1 = 1.0;
tmp = Sqr(1.0-y*y);
If (tmp<0.0001) tmp = 0.0001;
x2 = x*x1+y*y1+z*z1;
y2 = -x*y/tmp*x1+tmp*y1-z*y/tmp*z1;
z2 = -z/tmp*x1+x/tmp*z1;
shade = Int((-Sin(Pi*shade_angle/180.0)*y2-Cos(Pi*shade_angle/180.0)*z2)/l1*48.0+128.0);
If (shade<10) shade = 10;
If (shade>255) shade = 255;
EndIf
Return ((a+b+c+d)/4);
EndIf
End Function
Function planet1#(x#,y#,z#)
;x#,y#,z#
Local abx#,aby#,abz#,acx#,acy#,acz#,adx#,ady#,adz#,apx#,apy#,apz#;
Local bax#,bay#,baz#,bcx#,bcy#,bcz#,bdx#,bdy#,bdz#,bpx#,bpy#,bpz#;
abx = ssbx-ssax: aby = ssby-ssay: abz = ssbz-ssaz;
acx = sscx-ssax: acy = sscy-ssay: acz = sscz-ssaz;
adx = ssdx-ssax: ady = ssdy-ssay: adz = ssdz-ssaz;
apx = x-ssax: apy = y-ssay: apz = z-ssaz;
If ((adx*aby*acz+ady*abz*acx+adz*abx*acy-adz*aby*acx-ady*abx*acz-adx*abz*acy)*(apx*aby*acz+apy*abz*acx+apz*abx*acy-apz*aby*acx-apy*abx*acz-apx*abz*acy)>0.0);
;p is on same side of abc as d
If ((acx*aby*adz+acy*abz*adx+acz*abx*ady-acz*aby*adx-acy*abx*adz-acx*abz*ady)*(apx*aby*adz+apy*abz*adx+apz*abx*ady-apz*aby*adx-apy*abx*adz-apx*abz*ady)>0.0);
;p is on same side of abd as c
If ((abx*ady*acz+aby*adz*acx+abz*adx*acy-abz*ady*acx-aby*adx*acz-abx*adz*acy)*(apx*ady*acz+apy*adz*acx+apz*adx*acy-apz*ady*acx-apy*adx*acz-apx*adz*acy)>0.0);
;p is on same side of acd as b
bax = -abx: bay = -aby: baz = -abz;
bcx = sscx-ssbx: bcy = sscy-ssby: bcz = sscz-ssbz;
bdx = ssdx-ssbx: bdy = ssdy-ssby: bdz = ssdz-ssbz;
bpx = x-ssbx: bpy = y-ssby: bpz = z-ssbz;
If ((bax*bcy*bdz+bay*bcz*bdx+baz*bcx*bdy-baz*bcy*bdx-bay*bcx*bdz-bax*bcz*bdy)*(bpx*bcy*bdz+bpy*bcz*bdx+bpz*bcx*bdy-bpz*bcy*bdx-bpy*bcx*bdz-bpx*bcz*bdy)>0.0);
;p is on same side of bcd as a
;Hence, p is inside tetrahedron
Return (planet(ssa,ssb,ssc,ssd,ssas,ssbs,sscs,ssds,ssax,ssay,ssaz,ssbx,ssby,ssbz,sscx,sscy,sscz,ssdx,ssdy,ssdz,x,y,z,11));
EndIf
EndIf
EndIf
EndIf
;otherwise
Return (planet(M,M,M,M,r1,r2,r3,r4,0.0,0.0,3.01,0.0,Sqr(8.0)+0.01*r1*r1,-1.02+0.01*r2*r3,-Sqr(6.0)-0.01*r3*r3,-Sqr(2.0)-0.01*r4*r4,-1.02+0.01*r1*r2,Sqr(6.0)-0.01*r2*r2,-Sqr(2.0)-0.01*r3*r3,-1.02+0.01*r1*r3,x,y,z,Depth));
;M,M,M,M = initial altitude is M on all corners of tetrahedron
;r1,r2,r3,r4 = same seed set is used in every call
;coordinates of vertices
;x,y,z = coordinates of point we want colour of
;Depth = subdivision depth
End Function
Function rand2#(p#,q#)
;p#,q#
;random number generator taking two seeds
;rand2(p,q) = rand2(q,p) is important
Local r#;
r = (p+3.14159265)*(q+3.14159265);
Return (2.0*(r-Int(r))-1.0);
End Function
Function printppm(filename$)
;prints picture in PPM (portable pixel map) format
Local i,j,c,s,file,ascii$;
file=WriteFile(filename)
If Not file Return False ;write fail
ascii="P6"+Chr(10) ;"P6\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
ascii="#fractal planet image"+Chr(10) ;"#title\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
ascii=Str(Width)+" "+Str(Height)+" "+Str(255)+Chr(10) ;"info ncols\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
If (doshade)
For j=0 To Height-1
For i=0 To Width-1
s = shades(i,j);
c = s*rtable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c;
c = s*gtable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c;
c = s*btable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c;
Next
Next
Else
For j=0 To Height-1
For i=0 To Width-1
WriteByte file,rtable(col(i,j));
WriteByte file,gtable(col(i,j));
WriteByte file,btable(col(i,j));
Next
Next
EndIf
CloseFile file;
End Function
Function printppmBW(filename$)
;prints picture in b/w PPM format
Local i,j,c,file,ascii$;
file=WriteFile(filename)
If Not file Return False ;write fail
ascii="P6"+Chr(10) ;"P6\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
ascii="#fractal planet image"+Chr(10) ;"#title\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
ascii=Str(Width)+" "+Str(Height)+" "+Str(2)+Chr(10) ;"info ncols\n"
For i=1 To Len(ascii): WriteByte file,Asc(Mid(ascii,i,1)): Next
For j=0 To Height-1
For i=0 To Width-1
If (col(i,j) = BLACK) Then c=0 Else c=1;
WriteByte file,c;
WriteByte file,c;
WriteByte file,c;
Next
Next
CloseFile file;
End Function
Function printbmp(filename$)
;prints picture in BMP format
Local i,j,k,c,s,W1,file;
file=WriteFile(filename)
If Not file Return False ;write fail
W1 = (3*Width+3);
W1 = W1 - W1 Mod 4;
s = 54+W1*Height ;file size
WriteShort file,(Asc("M") Shl 8)+Asc("B") ;file type "BM"
WriteInt file,s ;bfSize
WriteShort file,0 ;bfReserved1
WriteShort file,0 ;bfReserved2
WriteInt file,54 ;bfOffBits, offset to data
WriteInt file,40 ;size of infoheader
WriteInt file,Width ;biWidth
WriteInt file,Height ;biHeight
WriteShort file,1 ;no. of planes = 1
WriteShort file,24 ;bpp
WriteInt file,0 ;no compression
WriteInt file,0 ;image size (unspecified)
WriteInt file,32 Shl 8 ;h. pixels/m
WriteInt file,32 Shl 8 ;v. pixels/m
WriteInt file,0 ;colours used (unspecified)
WriteInt file,0 ;important colours (all)
If (doshade)
For k=0 To Height-1 ;j--
j=Height-1-k
For i=0 To Width-1
s = shades(i,j);
c = s*btable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c;
c = s*gtable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c
c = s*rtable(col(i,j))/150;
If (c>255) c=255;
WriteByte file,c
Next
For i=3*Width To W1-1: WriteByte file,0: Next
Next
Else
For k=0 To Height-1
j=Height-1-k
For i=0 To Width-1
WriteByte file,btable(col(i,j));
WriteByte file,gtable(col(i,j));
WriteByte file,rtable(col(i,j));
Next
For i=3*Width To W1-1: WriteByte file,0: Next
Next
EndIf
CloseFile file;
End Function
Function printbmpBW(filename$)
;prints picture in b/w BMP format
Local i,j,k,c,s,W1;
file=WriteFile(filename)
If Not file Return False ;write fail
W1 = (Width+31);
W1 = W1 - W1 Mod 32;
s = 62+(W1*Height)/8 ;file size
WriteShort file,(Asc("M") Shl 8)+Asc("B") ;file type "BM"
WriteInt file,s ;bfSize
WriteShort file,0 ;bfReserved1
WriteShort file,0 ;bfReserved2
WriteInt file,62 ;bfOffBits, offset to data
WriteInt file,40 ;size of infoheader
WriteInt file,Width ;biWidth
WriteInt file,Height ;biHeight
WriteShort file,1 ;no. of planes = 1
WriteShort file,1 ;bpp
WriteInt file,0 ;no compression
WriteInt file,0 ;image size (unspecified)
WriteInt file,32 Shl 8 ;h. pixels/m
WriteInt file,32 Shl 8 ;v. pixels/m
WriteInt file,2 ;colours used (unspecified)
WriteInt file,2 ;important colours (all)
WriteInt file,0 ;colour 0 = black
WriteInt file,$FFFFFFFF ;colour 1 = white
For k=0 To Height-1 ;j--
j=Height-1-k
For i=0 To W1-1 Step 8 ;i+=8
If (i<Width And col(i,j) <> BLACK) c=128 Else c=0;
If (i+1<Width And col(i+1,j) <> BLACK) c=c+64;
If (i+2<Width And col(i+2,j) <> BLACK) c=c+32;
If (i+3<Width And col(i+3,j) <> BLACK) c=c+16;
If (i+4<Width And col(i+4,j) <> BLACK) c=c+8;
If (i+5<Width And col(i+5,j) <> BLACK) c=c+4;
If (i+6<Width And col(i+6,j) <> BLACK) c=c+2;
If (i+7<Width And col(i+7,j) <> BLACK) c=c+1;
WriteByte file,c;
Next
Next
CloseFile file;
End Function
Function printheights(filename$)
Local i,j,k,c,s,W1,file;
file=WriteFile(filename)
If Not file Return False ;write fail
W1 = (3*Width+3);
W1 = W1 - W1 Mod 4;
s = 54+W1*Height ;file size
WriteShort file,(Asc("M") Shl 8)+Asc("B") ;file type "BM"
WriteInt file,s ;bfSize
WriteShort file,0 ;bfReserved1
WriteShort file,0 ;bfReserved2
WriteInt file,54 ;bfOffBits, offset to data
WriteInt file,40 ;size of infoheader
WriteInt file,Width ;biWidth
WriteInt file,Height ;biHeight
WriteShort file,1 ;no. of planes = 1
WriteShort file,24 ;bpp
WriteInt file,0 ;no compression
WriteInt file,0 ;image size (unspecified)
WriteInt file,32 Shl 8 ;h. pixels/m
WriteInt file,32 Shl 8 ;v. pixels/m
WriteInt file,0 ;colours used (unspecified)
WriteInt file,0 ;important colours (all)
For j=0 To Height-1
For i=0 To Width-1
k=Height-1-j ;fprintf(filename,"%d ",heights[i][j])
WriteByte file,(heights(i,k) And $0000FF);
WriteByte file,((heights(i,k) And $00FF00) Shr 8);
WriteByte file,(heights(i,k) Shr 16);
Next
For i=3*Width To W1-1: WriteByte file,0: Next
Next
CloseFile file;
End Function
Function log_2#(x#)
Return (Log(x)/Log(2.0))
End Function
Function print_error()
Print "Usage: [options]";
Print " -? (or any illegal option) Output this text";
Print " -s seed Seed as number between 0.0 and 1.0";
Print " -w width Width in pixels, default = 640";
Print " -h height Height in pixels, default = 480";
Print " -m magnification Magnification, default = 1.0";
Print " -o output_file Output file, default = planet.bmp";
Print " -l longitude Longitude of centre in degrees, default = 0.0";
Print " -L latitude Latitude of centre in degrees, default = 0.0";
Print " -g gridsize Vertical gridsize in degrees, default = 0.0 (no grid)";
Print " -G gridsize Horisontal gridsize in degrees, default = 0.0 (no grid)";
Print " -i init_alt Initial altitude, default = 0.3";
Print " -c Colour depends on latitude, default = only altitude";
Print " -C Use lighter colours (original scheme only)";
Print " -N nocols Use nocols number of colours, default = 256, minimum = 5";
Print " -a Switch to alternative colour scheme";
Print " -M file Read colour definitions from file";
Print " -O Produce a black and white outline map";
Print " -E Trace the edges of land in black on colour map";
Print " -B Use 'bumpmap' shading";
Print " -A angle Angle of 'light' in bumpmap shading";
Print " -P Use PPM file format, default = BMP";
Print " -b Reverse background colour, default = black";
Print " -V number Distance contribution to variation, default = 0.03";
Print " -v number Altitude contribution to variation, default = 0.4";
Print " -pprojection Projection:";
Print " m = Mercator (default), p = Peters, q = Square, s = Stereographic";
Print " o = Orthographic, g = Gnomonic, a = Area preserving azimuthal";
Print " c = Conical (conformal), M = Mollweide, S = Sinusoidal";
Print " h = Heightfield, f = Find match, see manual";
;With the -pf option a map must be given on standard input.
;This map is 11 lines of 24 characters. The characters are:
; . : very strong preference for water (value=8)
; , : strong preference for water (value=4)
; : : preference for water (value=2)
; ; : weak preference for water (value=1)
; - : don't care (value=0)
; * : weak preference for land (value=1)
; o : preference for land (value=2)
; O : strong preference for land (value=4)
; @ : very strong preference for land (value=8)
;
;Each point on the map corresponds to a point on a 15° grid.
;
;The program tries seeds starting from the specified and
;successively outputs the seed (and rotation) of the best
;current match, together with a small map of this.
;This is all ascii, no bitmap is produced.
End Function |
Comments
| ||
| It would not open your mars part and work. |
| ||
| Hi NA, it is designed to work without the mars.rgb color file. You have to wait a while before you see anything. :) I have updated the code now to show the -B option (bumpmapping). Also i have produced a cut-down version specifically to map onto a 3d sphere in blitz3d using the squarep projection. It keeps all the main functional code so you can still play around with the important stuff. edit: updated this, now it's simpler and bumpmap is smoother. edit2: last update. added new color schemes and changed the bumpmap level a bit (it was too smooth). edit3: ok, i updated this again because i noticed the top row of pixels was always black if graphics3d (windowed) was called before the map was saved. very strange. |
| ||
| Top row of pixels is still black. Otherwise VERY nice. :) |
| ||
| Wow - I totally love this. I'm claiming the code. Mine, mine, mine. |
| ||
Great work! ![]() Dabz |
Code Archives Forum
