Verzeichnisstruktur phpBB-3.3.15
- Veröffentlicht
- 28.08.2024
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
char_cube3d.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\captcha;
015
016 class char_cube3d
017 {
018 var $bitmap;
019 var $bitmap_width;
020 var $bitmap_height;
021
022 var $basis_matrix = array(array(1, 0, 0), array(0, 1, 0), array(0, 0, 1));
023 var $abs_x = array(1, 0);
024 var $abs_y = array(0, 1);
025 var $x = 0;
026 var $y = 1;
027 var $z = 2;
028 var $letter = '';
029
030 /**
031 */
032 function __construct(&$bitmaps, $letter)
033 {
034 $this->bitmap = $bitmaps['data'][$letter];
035 $this->bitmap_width = $bitmaps['width'];
036 $this->bitmap_height = $bitmaps['height'];
037
038 $this->basis_matrix[0][0] = mt_rand(-600, 600);
039 $this->basis_matrix[0][1] = mt_rand(-600, 600);
040 $this->basis_matrix[0][2] = (mt_rand(0, 1) * 2000) - 1000;
041 $this->basis_matrix[1][0] = mt_rand(-1000, 1000);
042 $this->basis_matrix[1][1] = mt_rand(-1000, 1000);
043 $this->basis_matrix[1][2] = mt_rand(-1000, 1000);
044
045 $this->normalize($this->basis_matrix[0]);
046 $this->normalize($this->basis_matrix[1]);
047 $this->basis_matrix[2] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[1]);
048 $this->normalize($this->basis_matrix[2]);
049
050 // $this->basis_matrix[1] might not be (probably isn't) orthogonal to $basis_matrix[0]
051 $this->basis_matrix[1] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[2]);
052 $this->normalize($this->basis_matrix[1]);
053
054 // Make sure our cube is facing into the canvas (assuming +z == in)
055 for ($i = 0; $i < 3; ++$i)
056 {
057 if ($this->basis_matrix[$i][2] < 0)
058 {
059 $this->basis_matrix[$i][0] *= -1;
060 $this->basis_matrix[$i][1] *= -1;
061 $this->basis_matrix[$i][2] *= -1;
062 }
063 }
064
065 // Force our "z" basis vector to be the one with greatest absolute z value
066 $this->x = 0;
067 $this->y = 1;
068 $this->z = 2;
069
070 // Swap "y" with "z"
071 if ($this->basis_matrix[1][2] > $this->basis_matrix[2][2])
072 {
073 $this->z = 1;
074 $this->y = 2;
075 }
076
077 // Swap "x" with "z"
078 if ($this->basis_matrix[0][2] > $this->basis_matrix[$this->z][2])
079 {
080 $this->x = $this->z;
081 $this->z = 0;
082 }
083
084 // Still need to determine which of $x,$y are which.
085 // wrong orientation if y's y-component is less than it's x-component
086 // likewise if x's x-component is less than it's y-component
087 // if they disagree, go with the one with the greater weight difference.
088 // rotate if positive
089 $weight = (abs($this->basis_matrix[$this->x][1]) - abs($this->basis_matrix[$this->x][0])) + (abs($this->basis_matrix[$this->y][0]) - abs($this->basis_matrix[$this->y][1]));
090
091 // Swap "x" with "y"
092 if ($weight > 0)
093 {
094 list($this->x, $this->y) = array($this->y, $this->x);
095 }
096
097 $this->abs_x = array($this->basis_matrix[$this->x][0], $this->basis_matrix[$this->x][1]);
098 $this->abs_y = array($this->basis_matrix[$this->y][0], $this->basis_matrix[$this->y][1]);
099
100 if ($this->abs_x[0] < 0)
101 {
102 $this->abs_x[0] *= -1;
103 $this->abs_x[1] *= -1;
104 }
105
106 if ($this->abs_y[1] > 0)
107 {
108 $this->abs_y[0] *= -1;
109 $this->abs_y[1] *= -1;
110 }
111
112 $this->letter = $letter;
113 }
114
115 /**
116 * Draw a character
117 */
118 function drawchar($scale, $xoff, $yoff, $img, $background, $colours)
119 {
120 $width = $this->bitmap_width;
121 $height = $this->bitmap_height;
122 $bitmap = $this->bitmap;
123
124 $colour1 = $colours[array_rand($colours)];
125 $colour2 = $colours[array_rand($colours)];
126
127 $swapx = ($this->basis_matrix[$this->x][0] > 0);
128 $swapy = ($this->basis_matrix[$this->y][1] < 0);
129
130 for ($y = 0; $y < $height; ++$y)
131 {
132 for ($x = 0; $x < $width; ++$x)
133 {
134 $xp = ($swapx) ? ($width - $x - 1) : $x;
135 $yp = ($swapy) ? ($height - $y - 1) : $y;
136
137 if ($bitmap[$height - $yp - 1][$xp])
138 {
139 $dx = $this->scale($this->abs_x, ($xp - ($swapx ? ($width / 2) : ($width / 2) - 1)) * $scale);
140 $dy = $this->scale($this->abs_y, ($yp - ($swapy ? ($height / 2) : ($height / 2) - 1)) * $scale);
141 $xo = $xoff + $dx[0] + $dy[0];
142 $yo = $yoff + $dx[1] + $dy[1];
143
144 $origin = array(0, 0, 0);
145 $xvec = $this->scale($this->basis_matrix[$this->x], $scale);
146 $yvec = $this->scale($this->basis_matrix[$this->y], $scale);
147 $face_corner = $this->sum2($xvec, $yvec);
148
149 $zvec = $this->scale($this->basis_matrix[$this->z], $scale);
150 $x_corner = $this->sum2($xvec, $zvec);
151 $y_corner = $this->sum2($yvec, $zvec);
152
153 imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $xvec, $x_corner,$zvec), 4, $colour1);
154 imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $yvec, $y_corner,$zvec), 4, $colour2);
155
156 $face = $this->gen_poly($xo, $yo, $origin, $xvec, $face_corner, $yvec);
157
158 imagefilledpolygon($img, $face, 4, $background);
159 imagepolygon($img, $face, 4, $colour1);
160 }
161 }
162 }
163 }
164
165 /*
166 * return a roughly acceptable range of sizes for rendering with this texttype
167 */
168 function range()
169 {
170 return array(3, 4);
171 }
172
173 /**
174 * Vector length
175 */
176 function vectorlen($vector)
177 {
178 return sqrt(pow($vector[0], 2) + pow($vector[1], 2) + pow($vector[2], 2));
179 }
180
181 /**
182 * Normalize
183 */
184 function normalize(&$vector, $length = 1)
185 {
186 $length = (( $length < 1) ? 1 : $length);
187 $length /= $this->vectorlen($vector);
188 $vector[0] *= $length;
189 $vector[1] *= $length;
190 $vector[2] *= $length;
191 }
192
193 /**
194 */
195 function cross_product($vector1, $vector2)
196 {
197 $retval = array(0, 0, 0);
198 $retval[0] = (($vector1[1] * $vector2[2]) - ($vector1[2] * $vector2[1]));
199 $retval[1] = -(($vector1[0] * $vector2[2]) - ($vector1[2] * $vector2[0]));
200 $retval[2] = (($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0]));
201
202 return $retval;
203 }
204
205 /**
206 */
207 function sum($vector1, $vector2)
208 {
209 return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1], $vector1[2] + $vector2[2]);
210 }
211
212 /**
213 */
214 function sum2($vector1, $vector2)
215 {
216 return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1]);
217 }
218
219 /**
220 */
221 function scale($vector, $length)
222 {
223 if (count($vector) == 2)
224 {
225 return array($vector[0] * $length, $vector[1] * $length);
226 }
227
228 return array($vector[0] * $length, $vector[1] * $length, $vector[2] * $length);
229 }
230
231 /**
232 */
233 function gen_poly($xoff, $yoff, &$vec1, &$vec2, &$vec3, &$vec4)
234 {
235 $poly = array();
236 $poly[0] = $xoff + $vec1[0];
237 $poly[1] = $yoff + $vec1[1];
238 $poly[2] = $xoff + $vec2[0];
239 $poly[3] = $yoff + $vec2[1];
240 $poly[4] = $xoff + $vec3[0];
241 $poly[5] = $yoff + $vec3[1];
242 $poly[6] = $xoff + $vec4[0];
243 $poly[7] = $yoff + $vec4[1];
244
245 return $poly;
246 }
247
248 /**
249 * dimensions
250 */
251 function dimensions($size)
252 {
253 $xn = $this->scale($this->basis_matrix[$this->x], -($this->bitmap_width / 2) * $size);
254 $xp = $this->scale($this->basis_matrix[$this->x], ($this->bitmap_width / 2) * $size);
255 $yn = $this->scale($this->basis_matrix[$this->y], -($this->bitmap_height / 2) * $size);
256 $yp = $this->scale($this->basis_matrix[$this->y], ($this->bitmap_height / 2) * $size);
257
258 $p = array();
259 $p[0] = $this->sum2($xn, $yn);
260 $p[1] = $this->sum2($xp, $yn);
261 $p[2] = $this->sum2($xp, $yp);
262 $p[3] = $this->sum2($xn, $yp);
263
264 $min_x = $max_x = $p[0][0];
265 $min_y = $max_y = $p[0][1];
266
267 for ($i = 1; $i < 4; ++$i)
268 {
269 $min_x = ($min_x > $p[$i][0]) ? $p[$i][0] : $min_x;
270 $min_y = ($min_y > $p[$i][1]) ? $p[$i][1] : $min_y;
271 $max_x = ($max_x < $p[$i][0]) ? $p[$i][0] : $max_x;
272 $max_y = ($max_y < $p[$i][1]) ? $p[$i][1] : $max_y;
273 }
274
275 return array($min_x, $min_y, $max_x, $max_y);
276 }
277 }
278