Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Рисуем косинус php

Сообщения:  [1-6] 

 
 автор: Sfinks   (31.03.2012 в 22:02)   письмо автору
 
   для: 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 и из них уже вычислить масштаб и смещение.

  Ответить  
 
 автор: OLi   (31.03.2012 в 18:49)   письмо автору
 
   для: 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 );  

  Ответить  
 
 автор: Sfinks   (31.03.2012 в 16:05)   письмо автору
 
   для: Sfinks   (31.03.2012 в 16:00)
 

Ну и еще бы я ось нарисовал бы для наглядности )))) Окончательный вариант:
<?php
  header 
("Content-type: image/png");

  
$width 1000;
  
$height 400;
  
$img imagecreatetruecolor$width $height );
  
$red imagecolorallocate($img25500);       // цвет функции
  
$green imagecolorallocate($img02550);     // цвет оси икс

  
$delitel $width / ( 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$i , (int)$y $red );                   // в функцию передаются целыезначения
    
imagesetpixel$img$i , (int)$height_div_2 $green );      // рисуем ось икс
    
}
  
imagepng($img);
  
imagedestroy($img)
?>

  Ответить  
 
 автор: Sfinks   (31.03.2012 в 16:00)   письмо автору
 
   для: Sfinks   (31.03.2012 в 15:53)
 

Кроме того, если вам именно нужен график косинусоиды, следует обратить внимание на то, что мы привыкли к тому, что у нас Y изменяется снизу вверх от отрицательного к положительному. А в GD ноль находится слева вверху и увеличивается вниз. Значит если вы хотите увидеть правильную косинусоиду, то следует ее отразить по Y:
$y = -1 * cos( $i/$delitel ) * $height_div_2 + $height_div_2;

  Ответить  
 
 автор: Sfinks   (31.03.2012 в 15:53)   письмо автору
 
   для: 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($img25500);
  
  
$delitel $width / ( 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)
?>

  Ответить  
 
 автор: OLi   (31.03.2012 в 12:48)   письмо автору
 
 

<?
header 
("Content-type: image/png");
$img imagecreatetruecolor(10241000);

 
$red imagecolorallocate($img25500); //возвращает индификатор цвета RGB для рисования
 
$i=0;
  while (
$i 400)
   {
     
$y cos($i)*200//вычисление значения Y
     
imagesetpixel($img$i $y$red); // Рисует попиксельно красный косинусоид
   
 
$i=$i+0.5;
   
   
  }
   
imagepng($img);
imagedestroy($img)

?>


Что не так делаю?

  Ответить  

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования