Skrypt PHP generujący wykres funkcji 2W

Stronę tą wyświetlono już: 385 razy

Tworzenie wykresu z kilkoma funkcjami

Kolejny skrypt PHP do generowania wykresów funkcji 2W w wersji SVG. Przykład działania skryptu, a w zasadzie jego efekt końcowy można zobaczyć na poniższym przykładowym wykresie trzech różnych funkcji matematycznych.

Przykładowy wykres funkcji matematycznych-40481216202428-5-4-3-2-1012345pow(x,2)sin (x · 8) · 5.9pow(x, 2) + sin (x · 8) · 5.9

Powyższy wykres otrzymany został za pomocą następującego kodu:

Listing 1
  1. use diagrams as dg;
  2. $FuDiagram = new dg\SvgDiagramFunction2d(600, 400, "Przykładowy wykres funkcji matematycznych"); // tworzenie nowego obiektu wykresu svg
  3. $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS); // włączenie rysowania osi X i Y
  4. $FuDiagram->setXLimits(-5,5); // Ustawienie granic dla osi x
  5. $FuDiagram->addFunctionExpression("pow(x,2)"); // dodanie funkcji x^2
  6. $fu = "sin(x * 8) * " . (rand(1, 100) / 10); // wygenerowanie funkcji sinus o losowej amplitudzie
  7. $FuDiagram->addFunctionExpression($fu); // dodanie wygenerowanej losowo funkcji
  8. $FuDiagram->addFunctionExpression("pow(x, 2) + " . $fu); // utworzenie sumy funkcji sinus i x^2
  9. $FuDiagram->getSvg(); // czas wyświetlić wykres

Opisy kluczy legendy oraz podpisy osi x i y

Możliwe jest zmienienie nazw opisu kluczy legendy wykresu oraz dodanie podpisów osi X i osi Y wykresu.

Przykładowy wykres funkcji matematycznychOś YOś YOś X-40481216202428-5-4-3-2-1012345f(x) = x2 g(x) = sin (x · 8) · 5.9s(x) = f(x) + g(x)

Powyższy efekt spowodowany jest przez następujący fragment kodu:

Listing 2
  1. $FuDiagram->addFunctionExpression("pow(x, 2)", "f(x) = x^{2}");
  2. $FuDiagram->addFunctionExpression($fu, "g(x) = " . $fu);
  3. $FuDiagram->addFunctionExpression("pow(x, 2) + " . $fu, "s(x) = f(x) + g(x)");
  4. $FuDiagram->setYLabel("Oś Y");
  5. $FuDiagram->setXLabel("Oś X");

Zmiana granic wykresu dla osi y

Domyślnie wykres jest generowany od wartości ymin do ymax. Możliwe jest również ustawienie granic dla osi y wykresu.

Przykładowy wykres funkcji matematycznychOś YOś YOś X012345678910-5-4-3-2-1012345f(x) = x2 g(x) = sin (x · 8) · 5.9s(x) = f(x) + g(x)

Oznaczenia na wykresie

Często na wykresie konieczne jest nanoszenie pewnych punktów oraz ich opisywanie. Wychodząc naprzeciw tej potrzebie dodałem możliwość wstawiania na wykresie punktów, których współrzędne są określone w współrzędnych samego wykresu. Do punktu można dodać opis, którego przesunięcie będzie już liczone w globalnych jednostkach i w globalnym układzie odniesienia co oznacza, że dy=20 obniży położenie punktu zaczepienia kotwicy tekstu.

Przykładowy wykres z oznaczeniami-0.8-0.400.40.81.21.622.42.8-2-1.6-1.2-0.8-0.400.40.81.21.62f(x1 = 1) = 0f(x2 = -1) = 0f(x)=x2 -1

Kod dla tego wykresu będzie wyglądał następująco:

Listing 3
  1. $FuDiagram = new dg\SvgDiagramFunction2d(600, 400, "Przykładowy wykres z oznaczeniami");
  2. $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS);
  3. $FuDiagram->setXLimits(-2,2);
  4. $FuDiagram->addFunctionExpression("pow(x,2)-1", "f(x)=x^{2}-1");
  5. $Point = new dg\SvgPoint2d( // tworzenie obiektu punktu z opisem
  6. 1, // położenie na osi x
  7. 0, // położenie na osi y
  8. "f(x_{1} = 1) = 0", // opis punktu
  9. dg\svgPoint2d::CIRCLE, // typ znacznika punktu
  10. 0, // przesunięcie na osi x dla opisu punktu
  11. 20 // przesunięcie na osi y dla opisu punktu
  12. );
  13. $FuDiagram->addSvgObject($Point);
  14. $Point = new dg\SvgPoint2d(-1, 0, "f(x_{2} = -1) = 0", dg\svgPoint2d::CIRCLE, 0, -10);
  15. $FuDiagram->addSvgObject($Point);
  16. $FuDiagram->getSvg();

Dodatkowe oznaczenia liniowe można również wprowadzać. Na poniższym wykresie widać dodane do wykresu dwie linie oznaczające asymptoty wykreślonej funkcji - poziomą (kolor zielony) i ukośną (kolor magenta).

Przykładowy wykres z asymptotami0246810121416182000.20.40.60.811.21.41.61.82f(x)=1 / x + 10 · x

Kod tworzenia wykresu z oznaczeniami liniowymi wygląda następująco:

Listing 4
  1. use diagrams as dg;
  2. $FuDiagram = new dg\svgDiagramFunction2d(600, 400, "Przykładowy wykres z asymptotami");
  3. $FuDiagram->SetDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS);
  4. $FuDiagram->SetXLimits(0,2);
  5. $FuDiagram->SetYLimits(0,20);
  6. $FuDiagram->AddFunctionExpression("1 / x + 10*x", "f(x)=1 / x + 10 * x");
  7. $Line = new dg\SvgDiagramLine2D(0,0,2,20,new dg\ColorRGB(255,0,255),2);
  8. $Line->setStyle("stroke-miterlimit", "8");
  9. $Line->setStyle("stroke-dasharray", "8, 3");
  10. $Line->setStyle("stroke-dashoffset", "0");
  11. $FuDiagram->addSvgObject($Line);
  12. $Line = new dg\SvgDiagramLine2D(0,0,0,20,new dg\ColorRGB(0,150,0),8);
  13. $FuDiagram->addSvgObject($Line);
  14. $FuDiagram->getSvg();

Dodawanie oznaczenia kąta na wykresie

Jeżeli zastanawiasz się czytelniku, czy da się zaznaczyć kąt na wykresie, natychmiast zaprzestań tych rozmyślań, a to dlatego, że taka możliwość istnieje kolego:

Przykład naniesienia oznaczenia kąta0246810121416182000.20.40.60.811.21.41.61.82 α=atan(10) f(x)=1 / x + 10 · x

Powyższy wykres został utworzony za pomocą takiego oto kodu PHP:

Listing 5
  1. use diagrams as dg;
  2. $FuDiagram = new dg\svgDiagramFunction2d(600, 400, "Przykład naniesienia oznaczenia kąta");
  3. $FuDiagram->SetDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS);
  4. $FuDiagram->SetXLimits(0,2);
  5. $FuDiagram->SetYLimits(0,20);
  6. $FuDiagram->AddFunctionExpression("1 / x + 10*x", "f(x)=1 / x + 10 * x");
  7. $Line = new dg\SvgDiagramLine2D(0,0,2,20,new dg\ColorRGB(255,0,255),2);
  8. $Line->setStyle("stroke-miterlimit", "8");
  9. $Line->setStyle("stroke-dasharray", "8, 3");
  10. $Line->setStyle("stroke-dashoffset", "0");
  11. $FuDiagram->addSvgObject($Line);
  12. $Line = new dg\SvgDiagramLine2D(0,0,0,20,new dg\ColorRGB(0,150,0),8);
  13. $FuDiagram->addSvgObject($Line);
  14. $Angle = new dg\SvgAngle(0, 0, 1, 0, 1, 10, 150, "alpha=atan(10)"); // dodawanie oznaczenia kąta
  15. $FuDiagram->addSvgObject($Angle); // dodawanie obiektu oznaczenia kąta na wykresie
  16. $FuDiagram->getSvg();

Wyświetlanie danych punktowych na wykresie

Potrzebne są punkty na wykresie? No problemos amigos! Oto i przykład wygenerowanego moim skryptem wykresu funkcji interpolującej punkty.

Interpolacja punktów020040060080010001200-101234567894·x3 +50·x2 -20·x+100Punkty interpolowane

Powyższy wykres wygenerowany został przez następujący kod PHP:

Listing 6
  1. use diagrams as dg;
  2. $FuDiagram = new dg\SvgDiagramFunction2d(600, 400, "Interpolacja punktów");
  3. $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS);
  4. $FuDiagram->setXLimits(-1,9);
  5. $FuDiagram->setYLimits(0,1200);
  6. $FuDiagram->addFunctionExpression("-4*pow(x,3)+50*pow(x,2)-20*x+100", "4*x^{3}+50*x^{2}-20*x+100");
  7. $FuDiagram->addFunctionExpression("{0,100,2,228,8,1092,4,564}", "Punkty interpolowane", dg\FuClass::POINTS);
  8. $FuDiagram->getSvg();

Kreślenie w współrzędnych biegunowych

Zapewne nie raz zdarzy się czasami, że trzeba wykreślić coś w układzie współrzędnych biegunowych z zachowaniem osi układu kartezjańskiego. Toteż poniżej pokazuję, że mój skrypt i w tym zadaniu się spisuje.

Spirala Archimedesa-16-12-8-40481216-12-8-40481216r(φ)=φr(φ)=φ - w układzie kartezjańskim

Kod przykładowy, którym ten wykres generuję sobie:

Listing 7
  1. use diagrams as dg;
  2. $FuDiagram = new dg\SvgDiagramFunction2d(400, 420, "Spirala Archimedesa");
  3. $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS);
  4. $FuDiagram->setXLimits(0,6*pi());
  5. $FuDiagram->addFunctionExpression("x", "r(phi)=phi", dg\FuClass::POLAR2D_A_R);
  6. $FuDiagram->addFunctionExpression("x", "r(phi)=phi - w układzie kartezjańskim");
  7. $FuDiagram->getSvg();

Komentarze