Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wykresy funkcji trygonometrycznych, jak usunąć asymptoty = dziedzina funkcji
Speedy
post
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


Witam!

Na wstępie dodam, że słabo znam się na GD - dopiero uczę się "malować" w php (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Pozdrawiam.

Ten post edytował Speedy 10.12.2005, 23:11:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Speedy
post
Post #3





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


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? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) .
Go to the top of the page
+Quote Post
legorek
post
Post #4





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 ;-)

Ten post edytował legorek 10.12.2005, 22:24:06
Go to the top of the page
+Quote Post
Speedy
post
Post #5





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


Legorek, dzięki wielkie (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) .
Może za mało podłubałem w matematycznych funkcjach w manualu...

W każdym razie teraz wszystko śmiga (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .

contangensoidę też sobie zrobiłem dzięki Tobie bez asymptot (IMG:http://forum.php.pl/style_emoticons/default/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ę (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Pozdrawiam!

Ten post edytował Speedy 10.12.2005, 23:04:38
Go to the top of the page
+Quote Post
Termit_
post
Post #6





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.06.2005
Skąd: Gostyń

Ostrzeżenie: (0%)
-----


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ł (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .
Go to the top of the page
+Quote Post
Speedy
post
Post #7





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


Proszę (IMG:http://forum.php.pl/style_emoticons/default/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. ?>


Ten post edytował Speedy 3.09.2008, 19:38:25
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 01:14