Update
This commit is contained in:
parent
d5b4366475
commit
dfc4a5d61b
5 changed files with 207 additions and 8 deletions
194
procgen.md
194
procgen.md
|
@ -23,6 +23,196 @@ We use procedural generation mainly in two ways:
|
|||
|
||||
Indeed we may also do something "in between", e.g. generate procedural assets into temporary files or RAM [caches](cache.md) at run time and depending on the situation, for example when purely realtime generation of such assets would be too slow.
|
||||
|
||||
## Example
|
||||
## Examples
|
||||
|
||||
TODO
|
||||
Here are some cool [ASCII renderings](ascii_art.md) of procedurally generated pictures:
|
||||
|
||||
```
|
||||
....,':..:.,.c;:,,.,'M0....',:c.,c,'o:xcx.',.'l:,;'.:.,
|
||||
...''.'..:.,.;,''x0Xoc;:::::;lo.':o,c;;c..:l.,''..,...,
|
||||
.',......',;':',oKxl:'.........',;cX:o0k.'l':''......,.
|
||||
.;........''';l.:x;,Kkocl;::::;lcxX':cX;'o',,.........,
|
||||
.:.'........'l;.Kc:Xol:,'.......'':;ck0c'.l',.'.......'
|
||||
l.'.''.....'.:..XlXo;,'..xooccooxkXKMW.'.:,:..,'..',.,,
|
||||
...,;,....,.:,.olcxl:'.cl;::,,,::;;coklxolcl..',';'::,'
|
||||
'':c:.;'.:'l,..oxo:;,.l:,''......'',:.,...'',;;c..c:o;c
|
||||
x.''.l':k'.l,..oc;;;,;:''.....xxkXK0xKxxxxxk.''''',:.,'
|
||||
xlc00lkl,.xc;.Xxl::,,:,'...;;;llccol;l;;lllxxxxxkkK;ck'
|
||||
c:kX:x:klWKxl.KXc;,,'.'..,,,,,,::;,,,,:,:,cooxkK,:;cxKW
|
||||
oo':o,kl,Kxl:'MKk;;,'....''..''''''''','''',,:;coX0,;oX
|
||||
c.,o,Xc,.kc;,.Kkoc;:'...............''',,:;c..',;ck.';o
|
||||
.:.:.o:'.xl:'..xc;:,''..................'',:lo..,:ck.:c
|
||||
;.l'.l,..o;,'..ol;,''..............'',;...',:lx..,lx.,c
|
||||
'x:.xl,..o;:'...l:,''...... ......'',:l...':;o..,lx.:x
|
||||
.c,.xl,..xl:,'...;,''..............'',;lo..',;o..,l.'l.
|
||||
.c:.kc:,..ol:,''..................'',:;cx..':lx.':o.:.:
|
||||
0o;'.kc;,'..c;:,,'''...............':;cokK.,;ck.,cX,o,.
|
||||
'Xo;,0Xoc;:,,'''','''''''''..''....',;;kKM':lxK,lk,o:'o
|
||||
:WKxc;:,Kkxooc,:,:,,,,;::,,,,,,..'.',,;cXK.lxKWlk:x:Xk:
|
||||
:'kc;Kkkxxxxxlll;;l;loccll;;;...',:,,::lxX.;cx.,lkl00cl
|
||||
:',.:,'''''.kxxxxxKx0KXkxx.....'':;,;;;co..,l.'k:'l.''.
|
||||
oc;o:c..c;;,''...,.:,''......'',:l.,;:oxo..,l':.';.:c:'
|
||||
,',::';','..lcloxlkoc;;::,,,::;lc.':lxclo.,:.,....,;,..
|
||||
',,.,'..',..:,:.'.WMKXkxooccoox..',;oXlX..:.'.....''.'.
|
||||
;'.......'.,'l.'c0kc;:''.......',:loX:cK.;l'........'.:
|
||||
,,.........,,'o';Xc:'Xxcl;::::;lcokK,;x:.l;'''........;
|
||||
..,......'':'l'.k0o:Xc;,'.........':lxKo,':';,'......,'
|
||||
.,...,..'',.l:..c;;c,o:'.ol;:::::;coX0x'',;.,.:..'.''..
|
||||
|
||||
0KXXkkxxooooccccccoxo;:,'...',:;lcoxXWKXkkxxxooooccccco
|
||||
XMXxxooocccclllllllllcl:,'...',:;lcokK0Xxxoooccclllllll
|
||||
kK0Xxocccllll;;;;;;;;;;l;,'..'',:;lcxk0Kkooccclll;;;;;;
|
||||
xXMKkocllll;;;;:::::::::;;,'..',:;lcoxXMXxoclll;;;;;:::
|
||||
okKKkxclll;;;;:::::::,:::;:'..'',:;loxXMXkocll;;;;:::::
|
||||
okK0kxcll;;;;:::::::,,,::::,...',:;lcxX0Kkocll;;;;:::::
|
||||
xk0Kkoclll;;;;:::::::::::;:'..',,:;coxXWXxoclll;;;;::::
|
||||
xXWXxocclll;;;;;;:::::;;l:,...',:;lcokK0kxocclll;;;;;::
|
||||
k0Kkxooccclllll;;;;;;lll:,'..',:;lcoxXMXkooocccllll;;;;
|
||||
K0Xkxxxoooccccclllccoc;:,'..',,:;lcxk0Kkkxxooocccccllll
|
||||
W0KXXkkxxxoooooooxkol;,''..',,:;lcokKM0KXXkkxxxooooooox
|
||||
K0MM0KXXXkkkkkXK0kcl:,''..'',:;lcokXXK0W00KXXXkkkkkXKMx
|
||||
kXXK00WMM00MW0k0xcl:,''..'',:;lcoxxxkkXKK0MWM000MMKkXol
|
||||
xkkkXXXKKKXXxkKxcl;:,'...',,:;lccooxxxkkXXXKKKKXkxXXoc;
|
||||
xxxkkkkkkkxoxMkol;:,''..'',:;llcccoooxxxkkkkkkkxckKxcl;
|
||||
oxxxxkkkkxolk0xcl;:,'...'',:;llcccooooxxxxkkkxxooKXxcl;
|
||||
oxxxkkkkkxxck0kol;:,'...'',:;llcccoooxxxxkkkkkxocXKxcl;
|
||||
xxkkkXXXXXkxcKXoc;:,''...',::;lccoooxxxkkkXXXXXkxxWkol;
|
||||
kkXXKK000000XkKkol;:,'...'',:;lcooxxxkkXXKK00000KXoMxcl
|
||||
XKK0W00KKXXXXK0XXol;:,'. .',::;lcxkkXXK0MM0KKKXXXKKWXkc
|
||||
0W0KKXkkkxxxxxxxkKxc;:,'...',:;;coxXK0M0KXXkkkxxxxxxxkM
|
||||
0KXkkxxxooooccccccoxol:,'...',:;lcoxXMKXkkxxxoooccccccc
|
||||
XMXkxooocccllllllllllcc;,'...',:;lcokK0Xxxoooccclllllll
|
||||
kK0Xxocccllll;;;;;;;;;;l;,'..'',:;lcxk0Kkxoccllll;;;;;;
|
||||
xX0Kkocllll;;;;:::::::::;;,'..',:;lcoxXMXxoclll;;;;;:::
|
||||
okKKkxclll;;;;:::::::,:::;:'..'',:;loxXMXkocll;;;;:::::
|
||||
okK0kxclll;;;:::::::,,,::::,...',:;lcxX0Kkocll;;;;:::::
|
||||
xk0Kkoclll;;;;:::::::::::;:'..',,:;coxXWXxoclll;;;;::::
|
||||
xXWXxoccllll;;;;;:::::;;c:,...',:;lcokK0kxocclll;;;;;::
|
||||
k0Kkxooccclllll;;;;;;lcl:,'..',:;lcoxXWXxooocccllll;;;;
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
ll;;;;;;;;;;;;llllll;;;;;;;;;;;;llcxolllcXocl;;;;;;;;;;
|
||||
.',ol;;;;;;lol:,,,,,;Kl;;;;;;lo:'...........',ll;;;;;;l
|
||||
....:c;;;;lc,'.......':c;;;;ll'....':;ll:,'....,o;;;;lK
|
||||
;'...;l;;;l;'.........,o;;;;x'...,xl;;;;;;ll'...:l;;;ll
|
||||
c:...'c;;;;o,'.......'cl;;;l:...'xl;;;;;;;;l;'..'0;;;;c
|
||||
x,...';l;;;;lcc:,,:;xl;;;;;K'...';cl;;;;;;lx,'...:l;;;;
|
||||
'.....';l;;;;;;;;;;;;;;;;lW,.....',;xoookc:,'....':c;;;
|
||||
.......',:ocll;;;;;;llck;,'..........''''.........',:co
|
||||
...........''''''''''''...............................'
|
||||
.......................................................
|
||||
'''.............................'',,:::::,,,''.........
|
||||
;lcl,'......',:;;l;:,''......':xl;;;;;;;;;;;lcc,'......
|
||||
;;;;l;'...':Wll;;;;;lo;'....,x;;;;;;;;;;;;;;;;;ll'....,
|
||||
l;;;;l,...,kl;;;;;;;;;c:...'k;;;;lo:,'''',ll;;;;l:...'l
|
||||
:c;;;;c'..'ll;;;;;;;;;o,...:l;;;lc'.......',o;;;;o'..';
|
||||
:o;;;;l,...':ol;;;;lll,...'X;;;;l;'.......',Xl;;;l:...'
|
||||
xl;;;;;c:'.....'''''.....'ol;;;;;cl,''''',:Wl;;;;;l:'..
|
||||
;;;;;;;;lo;,'........'':xl;;;;;;;;;llccccll;;;;;;;;lcl,
|
||||
;;;;;;;;;;;;llllllllll;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
:coll;;;;;;;;;;;;;;;;;;;;;;;;;lck;,,'''''',:lxll;;;;;;;
|
||||
...';l;;;;;;lloxllckcl;;;;;;lW,'..............':c;;;;;;
|
||||
'....:l;;;;lo,'....',;c;;;;;X'...',ocllllo;,....,c;;;;l
|
||||
l;'..'0;;;;c:'......',k;;;;l,...,o;;;;;;;;;ll'..'l;;;;l
|
||||
;c,...:l;;;;o:''...',ol;;;;o'..'cl;;;;;;;;;;c:...,c;;;;
|
||||
lX,...'ll;;;;;llcccl;;;;;;o,...';l;;;;;;;;;lo,...';l;;;
|
||||
;,'....':cl;;;;;;;;;;;;;lc,.....':Kcllllllcl,'....':xl;
|
||||
'........'',;cKoccoxo;:,'........''',,,,,,''.... ...'',
|
||||
```
|
||||
|
||||
These were created in extremely simple way, without even using any [noise](noise.md) -- each picture here has each pixel computed by plugging the *x* and *y* coordinate to a quite simple equation using basic functions like [sine](sin.md), [square root](sqrt.md), absolute value, triangle wave etc. More complex methods will probably iteratively apply various filters, they may employ things like [cellular automata](cellular_automaton.md) and so on, however here you see even a very [simple](kiss.md) approach may often be [good enough](good_enough.md). The [C](c.md) code to generate the pictures above is following (for simplicity using [floats](float.md) and math.h, which in serious programs should be avoided):
|
||||
|
||||
{ NOTE: The equations for the functions were made by me when I was playing around with another project. I have uploaded them to Wikimedia Commons, you can find actual png pictures there. ~drummyfish }
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#define W 55
|
||||
#define H 30
|
||||
|
||||
// helper stuff:
|
||||
char palette[] = "WM0KXkxocl;:,'. ";
|
||||
|
||||
double min(double a, double b) { return a < b ? a : b; }
|
||||
double max(double a, double b) { return a > b ? a : b; }
|
||||
double absMy(double x) { return x < 0 ? -1 * x : x; }
|
||||
double gauss(double x) { return exp((-1 * x * x) / 2); }
|
||||
|
||||
double tri(double x)
|
||||
{
|
||||
x = absMy(x);
|
||||
|
||||
int whole = x;
|
||||
double frac = x - whole;
|
||||
|
||||
return whole % 2 ? 1 - frac : frac;
|
||||
}
|
||||
|
||||
void drawFunction(double (*f)(double, double), double xFrom, double yFrom,
|
||||
double xTo, double yTo)
|
||||
{
|
||||
double v1 = 0xffffffff, v2 = -1 * v1;
|
||||
double sX = (xTo - xFrom) / W, sY = (yTo - yFrom) / H;
|
||||
|
||||
for (int y = 0; y < H; ++y)
|
||||
for (int x = 0; x < W; ++x)
|
||||
{
|
||||
double v = f(xFrom + x * sX,yFrom + y * sY);
|
||||
|
||||
if (v > v2)
|
||||
v2 = v;
|
||||
|
||||
if (v < v1)
|
||||
v1 = v;
|
||||
}
|
||||
|
||||
v2 -= v1;
|
||||
|
||||
if (v2 == 0)
|
||||
v2 = 0.0001;
|
||||
|
||||
for (int y = 0; y < H; ++y)
|
||||
{
|
||||
for (int x = 0; x < W; ++x)
|
||||
|
||||
putchar(palette[(int) (15 *
|
||||
((min(v2,max(0,f(xFrom + x * sX,yFrom + y * sY) - v1))) / v2))]);
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
// ==== ACTUAL INTERESTING FUNCTIONS HERE ===
|
||||
|
||||
double fSnakes(double x, double y)
|
||||
{
|
||||
return sqrt(tri(x + sqrt(tri(x + 0.4 * sin(y*3)))));
|
||||
}
|
||||
|
||||
double fYinYang(double x, double y)
|
||||
{
|
||||
double r = sin(1.2 * y + 2.5 * sin(x) + 2 * cos(2.25 * y) * sin(x));
|
||||
return log(2 * sqrt(absMy(r)) - r);
|
||||
}
|
||||
|
||||
double fSwirl(double x, double y)
|
||||
{
|
||||
return gauss(
|
||||
fmod((x * x),(absMy(sin(x + y)) + 0.001)) +
|
||||
fmod((y * y),(absMy(sin(x - y)) + 0.001)));
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
drawFunction(fSwirl,-2,-2,2,2);
|
||||
putchar('\n');
|
||||
drawFunction(fSnakes,-1,-1,2,2);
|
||||
putchar('\n');
|
||||
drawFunction(fYinYang,-4,-4,4,4);
|
||||
}
|
||||
```
|
||||
|
||||
TODO: some example with noise
|
Loading…
Add table
Add a link
Reference in a new issue