Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wykresy funkcji trygonometrycznych
Forum PHP.pl > Forum > PHP
Speedy
Witam!

Na wstępie dodam, że słabo znam się na GD - dopiero uczę się "malować" w php tongue.gif.

Mam taki kod:

  1. <?php
  2.  
  3. /**
  4.  * wykresy funkcji trygonometrycznych
  5.  */
  6.  
  7. Header("Content-type: image/png");
  8.  
  9. $picWidth = 360*2;
  10. $picHeight = 200;
  11. $pic = ImageCreate($picWidth+1,$picHeight+1);
  12. $cWhite = ImageColorAllocate($pic,255,255,255);
  13.  
  14. ImageFilledRectangle($pic,0,0,$picWidth+1,$picHeight+1,$cWhite);
  15.  
  16. $cRed = ImageColorAllocate($pic,255,0,0);
  17. $cBlue = ImageColorAllocate($pic,0,0,255);
  18. $cGreen = ImageColorAllocate($pic,12,192,0);
  19. $cOrange = ImageColorAllocate($pic,249,144,0);
  20.  
  21. // sinus
  22.  
  23. $curX = 0;
  24. $curY = $picHeight/2;
  25.  
  26. for($pt = 0; $pt<$picWidth; $pt++)
  27. {
  28. $newX=$curX+1;
  29. $newY=($picHeight/2)+(-sin(deg2rad($newX))*($picHeight/2));
  30. ImageLine($pic,$curX,$curY,$newX,$newY,$cBlue);
  31. $curX=$newX;
  32. $curY=$newY;
  33. }
  34.  
  35. // cosinus
  36.  
  37. $curX = 0;
  38. $curY = $picHeight;
  39.  
  40. for($pt = 0; $pt<$picWidth; $pt++)
  41. {
  42. $newX=$curX+1;
  43. $newY=($picHeight/2)+(-cos(deg2rad($newX))*($picHeight/2));
  44. ImageLine($pic,$curX,$curY,$newX,$newY,$cRed);
  45. $curX=$newX;
  46. $curY=$newY;
  47. }
  48.  
  49. // tangens 
  50.  
  51. $curX = 0;
  52. $curY = $picHeight/2;
  53.  
  54. for($pt = 0; $pt<$picWidth; $pt++)
  55. {
  56. $newX=$curX+1;
  57. $newY=($picHeight/2)+(-tan(deg2rad($newX))*($picHeight/2));
  58. ImageLine($pic,$curX,$curY,$newX,$newY,$cGreen);
  59. $curX=$newX;
  60. $curY=$newY;  
  61. }
  62.  
  63. // cotangens
  64.  
  65. $curX = 0;
  66. $curY = $picHeight;
  67.  
  68. for($pt = 0; $pt<$picWidth; $pt++)
  69. {
  70. $newX=$curX+1;
  71. $newY=($picHeight/2)+(1/(-tan(deg2rad($newX)))*($picHeight/2));
  72. ImageLine($pic,$curX,$curY,$newX,$newY,$cOrange);
  73. $curX=$newX;
  74. $curY=$newY;
  75. } 
  76.  
  77. $cBlack = ImageColorAllocate($pic,0,0,0);
  78. ImageLine($pic,360,0,360,$picHeight,$cBlack);
  79. ImageLine($pic,0,$picHeight/2,$picWidth,$picHeight/2,$cBlack);
  80. ImagePNG($pic);
  81. ImageDestroy($pic);
  82.  
  83. ?>


Jak narysować sinusoidę i cosinusoidę znalazłem w komentarzach w manualu. Zrobiłem tylko drobne przeróbki (dodałem minus przed tymi funkcjami, czyli odwróciłem je, bo nie wiedzieć dlaczego w oryginalnym skrypcie rysowały się one odwrócone tongue.gif).
Wykresy tangensa i contangensa sam sobie zrobiłem na podstawie wykresów cosinusa i sinusa.
Niestety tangensoida i cotangensoida rysują się razem z asymptotami, bo nie są określone ich dziedziny. Asymptoty nie należą do dziedziny.
W przypadku sinusa i cosinusa nie ma tego problemu, bo ich dziedziną jest zbiór liczb rzeczywistych.
Próbowałem różnych kombinacji, ale nic mi z tego nie wychodziło...

Jeśli chodzi o normalny zapis, to byłby on następujący:

( zapis lekko phpepowy, bo tak mi wygodniej, a symbole matematyczne mogłyby się komuś pomylić ze składnią php winksmiley.jpg )

//tangens

tan($x)=sin($x)/cos($x) dla cos($x)<>0

cos($x)<>0 dla $x<>pi()/2+round($k)*pi()

pi()/2+round($k)*pi() // asymptota tangensa

//cotangens

function ctan($x)
{
$v = cos($x)/sin($x);
return $v;
}

ctan($x) == true dla sin($x)<>0

sin($x)<>0 dla $x<>round($k)*pi()

round($k)*pi() // asymptota cotangensa

####

Zasadnicze pytanie brzmi następująco:

Jak usunąć asymptoty tangensoidy i contangensoidy na wykresie?

Dziękuję za wszelką pomoc smile.gif.

Pozdrawiam.
dr_bonzo
Dla tangensa
  1. <?php
  2. $newX=$curX+1;
  3. $newY=($picHeight/2)+(-tan(deg2rad($newX))*($picHeight/2));
  4. ImageLine($pic,$curX,$curY,$newX,$newY,$cGreen);
  5. ?>

rysujesz linie od poprzedniego pounktu do nowego, gdy mijasz asymptote: poprzedni Y == +nieskonczonosc, nowy Y == -nieskonczonosc, wiec rysuje ci linie miedzy tymi punktami: (PI +- 1 pixel, +inf) --> (PI +- 1 pixel, -INF).
Musisz wykryc X, dla ktorego wystepuje asymptota i wtedy nie rysowac linii.
Speedy
hm... wiem, tylko niestety nie wiem jak to zapisać w php...
Próbowałem robić jakieś instrukcje warunkowe, ale zawsze wypluwało mi błędy...

Mógłbym prosić o konkretny kod, lub chociaż jego zarys? snitch.gif .
legorek
To kwestia matematyki, a nie php

linijka 59:

zamień

  1. <?php
  2. ImageLine($pic,$curX,$curY,$newX,$newY,$cGreen);
  3. ?>


na

  1. <?php
  2. if ((fmod(($newX - 1), 90) != 0) OR (fmod(($newX - 1), 180) == 0)) ImageLine($pic,$curX,$curY,$newX,$newY,$cGreen);
  3. ?>


ctg, analogicznie

Aha piszę się asymptota ;-)
Speedy
Legorek, dzięki wielkie biggrin.gif.
Może za mało podłubałem w matematycznych funkcjach w manualu...

W każdym razie teraz wszystko śmiga winksmiley.jpg.

contangensoidę też sobie zrobiłem dzięki Tobie bez asymptot biggrin.gif

  1. <?php
  2.  
  3. if (fmod(($newX), 180) != 0) ImageLine($pic,$curX,$curY,$newX,$newY,$cOrange);
  4.  
  5. ?>


PS. Poprawiłem w swoich wypowiedziach wyraz asymptoty - dzięki za poprawkę winksmiley.jpg

Pozdrawiam!
Termit_
Taki drobiazg, jeśli nie sprawi Ci to kłopotu: możesz wkleić poprawiony kod? Może się przydać komuś, kto w przyszłości będzie szukał winksmiley.jpg.
Speedy
Proszę smile.gif

Dodatkowo dorzuciłem kilka zmiennych ($a, $b, $c, $d, $e, $f, $g, $h).
Zrobiłem to po to, aby wygodniej można było regulować zbiór wartości funkcji i okres zasadniczy.

  1. <?php
  2.  
  3. /**
  4.  * wykresy funkcji trygonometrycznych
  5.  */
  6.  
  7. Header("Content-type: image/png");
  8.  
  9. $picWidth = 360*2;
  10. $picHeight = 200;
  11. $pic = ImageCreate($picWidth+1,$picHeight+1);
  12. $cWhite = ImageColorAllocate($pic,255,255,255);
  13.  
  14. ImageFilledRectangle($pic,0,0,$picWidth+1,$picHeight+1,$cWhite);
  15.  
  16. $cRed = ImageColorAllocate($pic,255,0,0);
  17. $cBlue = ImageColorAllocate($pic,0,0,255);
  18. $cGreen = ImageColorAllocate($pic,12,192,0);
  19. $cOrange = ImageColorAllocate($pic,249,144,0);
  20.  
  21. // sinus
  22.  
  23. $a = 1;
  24. $b = 1;
  25.  
  26. $curX = 0;
  27. $curY = $picHeight/2;
  28.  
  29. for($pt = 0; $pt<$picWidth; $pt++)
  30. {
  31. $newX=$curX+1;
  32. $newY=($picHeight/2)+$a*(-sin(deg2rad($newX)*$b)*($picHeight/2));
  33. ImageLine($pic,$curX,$curY,$newX,$newY,$cBlue);
  34. $curX=$newX;
  35. $curY=$newY;
  36. }
  37.  
  38.  
  39. // cosinus
  40.  
  41. $c = 1;
  42. $d = 1;
  43.  
  44. $curX = 0;
  45. $curY = $picHeight;
  46.  
  47. for($pt = 0; $pt<$picWidth; $pt++)
  48. {
  49. $newX=$curX+1;
  50. $newY=($picHeight/2)+$c*(-cos(deg2rad($newX)*$d)*($picHeight/2));
  51. ImageLine($pic,$curX,$curY,$newX,$newY,$cRed);
  52. $curX=$newX;
  53. $curY=$newY;
  54. }
  55.  
  56.  
  57. // tangens 
  58.  
  59. $e = 1;
  60. $f = 1;
  61.  
  62. $curX = 0;
  63. $curY = $picHeight/2;
  64.  
  65. for($pt = 0; $pt<$picWidth; $pt++)
  66. {
  67. $newX=($curX+1);
  68. $newY=($picHeight/2)+$e*(-tan(deg2rad($newX)*$f)*($picHeight/2));
  69. if (fmod(($newX - 1), 90) != 0) ImageLine($pic,$curX,$curY,$newX,$newY,$cGreen);
  70. $curX=$newX;
  71. $curY=$newY;  
  72. }
  73.  
  74. // cotangens
  75.  
  76. $g = 1;
  77. $h = 1;
  78.  
  79. $curX = 0;
  80. $curY = $picHeight;
  81.  
  82. for($pt = 0; $pt<$picWidth; $pt++)
  83. {
  84. $newX=$curX+1;
  85. $newY=($picHeight/2)+$g*(1/(-tan(deg2rad($newX)*$h))*($picHeight/2));
  86. if (fmod(($newX), 180) != 0) ImageLine($pic,$curX,$curY,$newX,$newY,$cOrange);
  87. $curX=$newX;
  88. $curY=$newY;
  89. } 
  90.  
  91. $cBlack = ImageColorAllocate($pic,0,0,0);
  92. ImageLine($pic,360,0,360,$picHeight,$cBlack);
  93. ImageLine($pic,0,$picHeight/2,$picWidth,$picHeight/2,$cBlack);
  94. ImagePNG($pic);
  95. ImageDestroy($pic);
  96.  
  97. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.