TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
122 lines
3.1 KiB
<?php
|
|
/**
|
|
* Adapted by Simon Holywell to allow for ASCII output as
|
|
* a return value or to file via streams
|
|
*/
|
|
|
|
/* The Computer Language Benchmarks Game
|
|
http://benchmarksgame.alioth.debian.org/
|
|
contributed by Thomas GODART (based on Greg Buchholz's C program)
|
|
modified by anon
|
|
*/
|
|
|
|
function write_mandelbrot_to_stream($w, $h, $stream, $bitmap)
|
|
{
|
|
if ($bitmap)
|
|
fprintf($stream, "P4\n%d %d\n", $w, $h);
|
|
|
|
$bit_num = 128;
|
|
$byte_acc = 0;
|
|
$iter = 50;
|
|
|
|
$yfac = 2.0 / $h;
|
|
$xfac = 2.0 / $w;
|
|
|
|
$ochars = ' .:-;!/>)|&IH%*#';
|
|
$pack_format = 'c*';
|
|
|
|
for ($y = 0; $y < $h; ++$y) {
|
|
$Ci = $y * $yfac - 1.0;
|
|
for ($x = 0; $x < $w; ++$x) {
|
|
$Zr = 0.0;
|
|
$Zi = 0.0;
|
|
$Tr = 0.0;
|
|
$Ti = 0.0;
|
|
$Cr = $x * $xfac - 1.5;
|
|
|
|
try {
|
|
do {
|
|
for ($i = 0; $i < $iter; ++$i) {
|
|
$Zi = 2.0 * $Zr * $Zi + $Ci;
|
|
$Zr = $Tr - $Ti + $Cr;
|
|
$Tr = $Zr * $Zr;
|
|
|
|
if (($Tr + ($Ti = $Zi * $Zi)) > 4.0) {
|
|
throw new Exception("break 2");
|
|
}
|
|
}
|
|
$byte_acc += $bit_num;
|
|
} while (false);
|
|
} catch (Exception $e) {
|
|
}
|
|
|
|
if ($bitmap) {
|
|
if ($bit_num === 1) {
|
|
fwrite($stream, pack($pack_format, $byte_acc));
|
|
$bit_num = 128;
|
|
$byte_acc = 0;
|
|
} else {
|
|
$bit_num >>= 1;
|
|
}
|
|
} else {
|
|
if ($i == $iter) {
|
|
fwrite($stream, $ochars[0]);
|
|
} else {
|
|
fwrite($stream, $ochars[($i + 1) & 15]);
|
|
}
|
|
}
|
|
}
|
|
if ($bitmap) {
|
|
if ($bit_num !== 128) {
|
|
fwrite($stream, pack($pack_format, $byte_acc));
|
|
$bit_num = 128;
|
|
$byte_acc = 0;
|
|
}
|
|
} else {
|
|
fwrite($stream, "\n");
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function treffynnon_mandelbrot_to_file($filename, $w, $h, $binary_output)
|
|
{
|
|
$file_open_type = 'w';
|
|
if ($binary_output)
|
|
$file_open_type = 'wb';
|
|
|
|
$stream = fopen((string)$filename, $file_open_type);
|
|
if (false === $stream)
|
|
return false;
|
|
|
|
write_mandelbrot_to_stream((int)$w, (int)$h, $stream, (bool)$binary_output);
|
|
fclose($stream);
|
|
return true;
|
|
}
|
|
|
|
function treffynnon_mandelbrot_to_mem($w, $h, $binary_output)
|
|
{
|
|
$file_open_type = 'w+';
|
|
if ($binary_output)
|
|
$file_open_type = 'w+b';
|
|
|
|
$stream = fopen('php://memory', $file_open_type);
|
|
if (false === $stream)
|
|
return '';
|
|
|
|
write_mandelbrot_to_stream((int)$w, (int)$h, $stream, (bool)$binary_output);
|
|
rewind($stream);
|
|
$ret = stream_get_contents($stream);
|
|
fclose($stream);
|
|
return $ret;
|
|
}
|
|
|
|
function main()
|
|
{
|
|
global $argv;
|
|
if (count($argv) < 3) {
|
|
echo "Usage: php mandelbrot.php <width> <height> [<output_file>]\n";
|
|
exit(1);
|
|
}
|
|
echo treffynnon_mandelbrot_to_mem((int)$argv[2], (int)$argv[2], false);
|
|
}
|
|
|