interferentie-tekenen
Code (php)
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
set_time_limit(120); // geloof me, hij vreet tijd!
define('IMAGES', 3); // x bij x plaatjes; bijv. 3 levert 3 x 3 = 9
// plaatjes op
define('WIDTH', 300); // breedte van een individueel plaatje
define('HEIGHT', 300); // hoogte van een individueel plaatje
define('FREQUENTIE', 0.1); // frequentie, hoe lager hoe mooier de golven
// zichtbaar zijn. ong: 1 / aantal pixels per golf
define('BRON_VERSCHIL_STAP', 2); // stapgrote waarmee de bronnen uit elkaar
// bewegen
/**
* Golffuncties
*/
function standaardGolf($t)
{
return sin(2 * pi() * FREQUENTIE * $t);
}
function omgekeerdeGolf($t)
{
return standaardGolf($t) * -1;
}
/**
* Definitie van een positie. Een positie kan zijn afstand ten opzichte van
* een andere positie uitrekenen. Handig voor $t voor de golffuncties.
*/
class Positie {
public
$x,
$y;
public function __construct($x, $y)
{
$this->x = $x;
$this->y = $y;
}
public function afstand(Positie $ander)
{
return sqrt(
pow(max($this->x, $ander->x) - min($this->x, $ander->x), 2)
+ pow(max($this->y, $ander->y) - min($this->y, $ander->y), 2)
);
}
}
/**
* Een bron is een golffunctie op een beplaald punt. Met behulp van de functie
* en de afstand tussen de positie van de bron en de positie van de pixel die
* wordt uitgerekend wordt de fase bepaald, welke verantwoordelijk is voor
* de grijze tint.
*/
class Bron {
public
$positie,
$functie;
public function __construct(Positie $positie, $functie = 'standaardGolf')
{
$this->positie = $positie;
$this->functie = $functie;
}
public function fase($t)
{
$f = $this->functie;
return $f($t);
}
}
$x = IMAGES * WIDTH;
$y = IMAGES * HEIGHT;
$spectrum = array();
$img = imagecreatetruecolor($x, $y);
$positie = new Positie(0, 0);
$offset = new Positie(0, 0);
// Spectrum met kleuren maken. Naja, kleuren, eigenlijk 256 grijswaarden
for($i = 0; $i < 256; $i++) {
$spectrum[$i] = imagecolorallocate($img, $i, $i, $i);
}
$i = 0;
// lussen voor de plaatjes
for($offset->y = 0; $offset->y < $y; $offset->y += HEIGHT) {
for($offset->x = 0; $offset->x < $x; $offset->x += WIDTH) {
// positie bronnen bepalen, staat hier omdat $i variabel is.
$bronnen = array(
new Bron(
new Positie((WIDTH / 2) - $i, 50),
'standaardGolf'),
new Bron(
new Positie((WIDTH / 2) + $i, 50),
'omgekeerdeGolf')
);
$i += BRON_VERSCHIL_STAP;
// lussen voor de pixels van het plaatje
for($positie->x = 0; $positie->x < WIDTH; $positie->x++) {
for($positie->y = 0; $positie->y < HEIGHT; $positie->y++) {
$intensiteit = 0;
// bereken voor iedere bron de intensiteit op dit punt
foreach($bronnen as $bron) {
$intensiteit += $bron->fase($positie->afstand($bron->positie));
}
$intensiteit = $intensiteit / count($bronnen);
// kleur de pixel op dit punt op basis van de intensiteit met
// één van de kleuren uit het spectrum.
imagesetpixel(
$img,
$positie->x + $offset->x,
$positie->y + $offset->y,
$spectrum[round((($intensiteit + 1) / 2) * 255, 0)]);
}
}
}
}
// Plaatje omzetten naar iets gangbaars en opsturen naar de browser
header('Content-Type: image/png');
imagepng($img);
?>
set_time_limit(120); // geloof me, hij vreet tijd!
define('IMAGES', 3); // x bij x plaatjes; bijv. 3 levert 3 x 3 = 9
// plaatjes op
define('WIDTH', 300); // breedte van een individueel plaatje
define('HEIGHT', 300); // hoogte van een individueel plaatje
define('FREQUENTIE', 0.1); // frequentie, hoe lager hoe mooier de golven
// zichtbaar zijn. ong: 1 / aantal pixels per golf
define('BRON_VERSCHIL_STAP', 2); // stapgrote waarmee de bronnen uit elkaar
// bewegen
/**
* Golffuncties
*/
function standaardGolf($t)
{
return sin(2 * pi() * FREQUENTIE * $t);
}
function omgekeerdeGolf($t)
{
return standaardGolf($t) * -1;
}
/**
* Definitie van een positie. Een positie kan zijn afstand ten opzichte van
* een andere positie uitrekenen. Handig voor $t voor de golffuncties.
*/
class Positie {
public
$x,
$y;
public function __construct($x, $y)
{
$this->x = $x;
$this->y = $y;
}
public function afstand(Positie $ander)
{
return sqrt(
pow(max($this->x, $ander->x) - min($this->x, $ander->x), 2)
+ pow(max($this->y, $ander->y) - min($this->y, $ander->y), 2)
);
}
}
/**
* Een bron is een golffunctie op een beplaald punt. Met behulp van de functie
* en de afstand tussen de positie van de bron en de positie van de pixel die
* wordt uitgerekend wordt de fase bepaald, welke verantwoordelijk is voor
* de grijze tint.
*/
class Bron {
public
$positie,
$functie;
public function __construct(Positie $positie, $functie = 'standaardGolf')
{
$this->positie = $positie;
$this->functie = $functie;
}
public function fase($t)
{
$f = $this->functie;
return $f($t);
}
}
$x = IMAGES * WIDTH;
$y = IMAGES * HEIGHT;
$spectrum = array();
$img = imagecreatetruecolor($x, $y);
$positie = new Positie(0, 0);
$offset = new Positie(0, 0);
// Spectrum met kleuren maken. Naja, kleuren, eigenlijk 256 grijswaarden
for($i = 0; $i < 256; $i++) {
$spectrum[$i] = imagecolorallocate($img, $i, $i, $i);
}
$i = 0;
// lussen voor de plaatjes
for($offset->y = 0; $offset->y < $y; $offset->y += HEIGHT) {
for($offset->x = 0; $offset->x < $x; $offset->x += WIDTH) {
// positie bronnen bepalen, staat hier omdat $i variabel is.
$bronnen = array(
new Bron(
new Positie((WIDTH / 2) - $i, 50),
'standaardGolf'),
new Bron(
new Positie((WIDTH / 2) + $i, 50),
'omgekeerdeGolf')
);
$i += BRON_VERSCHIL_STAP;
// lussen voor de pixels van het plaatje
for($positie->x = 0; $positie->x < WIDTH; $positie->x++) {
for($positie->y = 0; $positie->y < HEIGHT; $positie->y++) {
$intensiteit = 0;
// bereken voor iedere bron de intensiteit op dit punt
foreach($bronnen as $bron) {
$intensiteit += $bron->fase($positie->afstand($bron->positie));
}
$intensiteit = $intensiteit / count($bronnen);
// kleur de pixel op dit punt op basis van de intensiteit met
// één van de kleuren uit het spectrum.
imagesetpixel(
$img,
$positie->x + $offset->x,
$positie->y + $offset->y,
$spectrum[round((($intensiteit + 1) / 2) * 255, 0)]);
}
}
}
}
// Plaatje omzetten naar iets gangbaars en opsturen naar de browser
header('Content-Type: image/png');
imagepng($img);
?>