|
|
|
|
<?
header ("Content-type: image/png");
$img = imagecreatetruecolor(1024, 1000);
$red = imagecolorallocate($img, 255, 0, 0); //возвращает индификатор цвета RGB для рисования
$i=0;
while ($i < 400)
{
$y = cos($i)*200; //вычисление значения Y
imagesetpixel($img, $i , $y, $red); // Рисует попиксельно красный косинусоид
$i=$i+0.5;
}
imagepng($img);
imagedestroy($img)
?>
|
Что не так делаю? | |
|
|
|
|
|
|
|
для: OLi
(31.03.2012 в 12:48)
| | Самое главное, что функция косинуса меняет весь цикл значений за (2 пи), т.е. от 0 до 6.283. А вы вычисляете ее с шагом 0.5, т.е. 12 значений на цикл. Получается набор несвязных точек.
Второе - Половина значений функции отрицательные, а вы ее просто умножаете на 200. Т.е. половина точек за пределами картинки.
Третье - вы вычисляете значения с шагом 0.5, а выводите с шагом 1, т.к. imagesetpixel() принимает целые координаты и не может нарисовать пол пикселя. Т.е. у вас получается в каждом иксе по две точки друг над другом.
Правильно будет так:
<?php
header ("Content-type: image/png");
$width = 1000;
$height = 400;
$img = imagecreatetruecolor( $width , $height );
$red = imagecolorallocate($img, 255, 0, 0);
$delitel = $width / ( 2 * pi() ); // вычисляем на сколько делить икс, чтоб получить один цикл функции
$height_div_2 = $height/2; // вычисляем половину высоты, чтоб сместить на нее функцию и
// избавиться от отрицательных значений
for( $i = 0; $i <$width; $i++ )
{
$y = cos( $i/$delitel ) * $height_div_2 + $height_div_2; // значения Y смещенное по вертикали
imagesetpixel( $img, (int)$i , (int)$y , $red ); // в функцию передаются целыезначения
}
imagepng($img);
imagedestroy($img)
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(31.03.2012 в 15:53)
| | Кроме того, если вам именно нужен график косинусоиды, следует обратить внимание на то, что мы привыкли к тому, что у нас Y изменяется снизу вверх от отрицательного к положительному. А в GD ноль находится слева вверху и увеличивается вниз. Значит если вы хотите увидеть правильную косинусоиду, то следует ее отразить по Y:
$y = -1 * cos( $i/$delitel ) * $height_div_2 + $height_div_2;
|
| |
|
|
|
|
|
|
|
для: Sfinks
(31.03.2012 в 16:00)
| | Ну и еще бы я ось нарисовал бы для наглядности )))) Окончательный вариант:
<?php
header ("Content-type: image/png");
$width = 1000;
$height = 400;
$img = imagecreatetruecolor( $width , $height );
$red = imagecolorallocate($img, 255, 0, 0); // цвет функции
$green = imagecolorallocate($img, 0, 255, 0); // цвет оси икс
$delitel = $width / ( 2 * pi() ); // вычисляем на сколько делить икс, чтоб получить один цикл функции
$height_div_2 = $height/2; // вычисляем половину высоты, чтоб сместить на нее функцию и
// избавиться от отрицательных значений
for( $i = 0; $i <$width; $i++ )
{
$y = -1 * cos( $i/$delitel ) * $height_div_2 + $height_div_2; // значения Y смещенное по вертикали
imagesetpixel( $img, $i , (int)$y , $red ); // в функцию передаются целыезначения
imagesetpixel( $img, $i , (int)$height_div_2 , $green ); // рисуем ось икс
}
imagepng($img);
imagedestroy($img)
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(31.03.2012 в 16:05)
| | А если в том же цикле хочу построить график функции, какие изменения надо сделать по смещению?
y=3 (x)^4+sin(x)
Так будет верно?
$y = (3*pow($i/$delitel,4))+sin($i/$delitel )* $height_div_2 + $height_div_2; // значения Y смещенное по вертикали
imagesetpixel( $img, $i , (int)$y , $yellow );
|
| |
|
|
|
|
|
|
|
для: OLi
(31.03.2012 в 18:49)
| | Нет. Анализировать нужно.
Во первых cos(x) - функция симметричная относительно оси Х, поэтому и множитель и смещение было равно высоте деленной пополам. А тут функция несимметричная, а возрастающая. При чем резко возрастающая и до бесконечности, т.е. мы не можем найти ее экстремумы. Так? Значит нам нужно знать в каких пределах ее нужно построить.
Кроме того, смотрите из чего она состоит? Первая часть парабола, вторая синусоида. Синусоида на любом отрезке меняется от -1 до +1. А парабола на отрезке Х от -бесконечности до 0 меняется по Y от бесконечности до 0 и от 0 до бесконечности по Х меняется от 0 до бесконечности по Y. Разницу величин чувствуете? Т.е. первая часть функции на отрезке от 0 до 1 будет меняться по Y от 0 до 3. Но уже в двойке будет равна 48! Значит какое-то влияние sin(x) на общую функцию будет заметно только от -1 до +1, а дальше это практически парабола.
Выводы: зная отрезок на котором ее нужно построить можно вычислить предельные значения по Y и из них уже вычислить масштаб и смещение. | |
|
|
|