Решаем дифуры на PHP

Достаточно достать из коробки какой-нибудь Asus EEE PC, написать такой код в «блокноте»:

<?php
function f1($x, $y1, $y2){
return $y2;
}

function f2($x, $y1, $y2){
return (1-$y1*$y1)*$y2-$y1;
}

header("Content-type: image/png");

$st = microtime();

$image = imagecreate(640, 480);

$colorBack = imageColorAllocate($image, 0, 0, 0);
$colorFore = imageColorAllocate($image, 255, 255, 255);

imageFilledRectangle($image, 0, 0, 639, 479, $colorBack);

$x0 = 0;
$y01 = 0;
$y02 = 0.0001;

$h = 0.1;

while($x0 < 64){
$p11 = $h*f1($x0, $y01, $y02);
$p12 = $h*f2($x0, $y01, $y02);

$p21 = $h*f1($x0 + $h/2, $y01 + $p11/2, $y02 + $p12/2);
$p22 = $h*f2($x0 + $h/2, $y01 + $p11/2, $y02 + $p12/2);

$p31 = $h*f1($x0 + $h/2, $y01 + $p21/2, $y02 + $p22/2);
$p32 = $h*f2($x0 + $h/2, $y01 + $p21/2, $y02 + $p22/2);

$p41 = $h*f1($x0 + $h, $y01 + $p31, $y02 + $p32);
$p42 = $h*f2($x0 + $h, $y01 + $p31, $y02 + $p32);

$x1 = $x0 + $h;
$y11 = $y01 + ($p11 + 2*$p21 + 2*$p31 + $p41) / 6;
$y12 = $y02 + ($p12 + 2*$p22 + 2*$p32 + $p42) / 6;

$x0e = $x0*10;
$y0e = 240 - $y01*100;

$x1e = $x1*10;
$y1e = 240 - $y11*100;

imageLine($image, $x0e, $y0e, $x1e, $y1e, $colorFore);

$x0 = $x1;
$y01 = $y11;
$y02 = $y12;
}

$st = microtime()-$st;

imageString($image, 3, 10, 10, "Calculation time " . $st . " ms", $colorFore);

imagePNG($image);
?>

загрузить все это на какой-нибудь бесплатный хостинг, пользуясь стандартным консольным ftp-клиентом, встроенным в Windows — и наблюдать вот такую картинку (обратите внимание, что выдает ее php-скрипт):

Можно, конечно, порешать и более «крутыми» методами, например, добавить в программу автоматический выбор длины шага, а для расчетов использовать формулы более высокого порядка — но за это может найти и линчевать хостер.

Решаем дифуры на PHP: 1 комментарий

  1. Поменяй imagecreate на imagecreatetruecolor, и добавь после него imageantialias.
    Щас результат хотя и получен современными средствами, но смотрится в стиле 80-х :-)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *