Skrypt PHP generujący wykres funkcji 2W

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 6743 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-5051015202530-5-4-3-2-1012345pow(x,2)sin (x · 8) · 8pow(x, 2) + sin (x · 8) · 8

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

use diagrams as dg; $FuDiagram = new dg\SvgDiagramFunction2d(600, 400, "Przykładowy wykres funkcji matematycznych"); // tworzenie nowego obiektu wykresu svg $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS); // włączenie rysowania osi X i Y $FuDiagram->setXLimits(-5,5); // Ustawienie granic dla osi x $FuDiagram->addFunctionExpression("pow(x,2)"); // dodanie funkcji x^2 $fu = "sin(x * 8) * " . (rand(1, 100) / 10); // wygenerowanie funkcji sinus o losowej amplitudzie $FuDiagram->addFunctionExpression($fu); // dodanie wygenerowanej losowo funkcji $FuDiagram->addFunctionExpression("pow(x, 2) + " . $fu); // utworzenie sumy funkcji sinus i x^2 $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-5051015202530-5-4-3-2-1012345f(x) = x2 g(x) = sin (x · 8) · 8s(x) = f(x) + g(x)

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

$FuDiagram->addFunctionExpression("pow(x, 2)", "f(x) = x^{2}"); $FuDiagram->addFunctionExpression($fu, "g(x) = " . $fu); $FuDiagram->addFunctionExpression("pow(x, 2) + " . $fu, "s(x) = f(x) + g(x)"); $FuDiagram->setYLabel("Oś Y"); $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) · 8s(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:

$FuDiagram = new dg\SvgDiagramFunction2d(600, 400, "Przykładowy wykres z oznaczeniami"); $FuDiagram->setDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS); $FuDiagram->setXLimits(-2,2); $FuDiagram->addFunctionExpression("pow(x,2)-1", "f(x)=x^{2}-1"); $Point = new dg\SvgPoint2d( // tworzenie obiektu punktu z opisem 1, // położenie na osi x 0, // położenie na osi y "f(x_{1} = 1) = 0", // opis punktu dg\svgPoint2d::CIRCLE, // typ znacznika punktu 0, // przesunięcie na osi x dla opisu punktu 20 // przesunięcie na osi y dla opisu punktu ); $FuDiagram->addSvgObject($Point); $Point = new dg\SvgPoint2d(-1, 0, "f(x_{2} = -1) = 0", dg\svgPoint2d::CIRCLE, 0, -10); $FuDiagram->addSvgObject($Point); $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:

use diagrams as dg; $FuDiagram = new dg\svgDiagramFunction2d(600, 400, "Przykładowy wykres z asymptotami"); $FuDiagram->SetDrawMode(dg\Scale::DRAW_X_AXIS | dg\Scale::DRAW_Y_AXIS); $FuDiagram->SetXLimits(0,2); $FuDiagram->SetYLimits(0,20); $FuDiagram->AddFunctionExpression("1 / x + 10*x", "f(x)=1 / x + 10 * x"); $Line = new dg\SvgDiagramLine2D(0,0,2,20,new dg\ColorRGB(255,0,255),2); $Line->setStyle("stroke-miterlimit", "8"); $Line->setStyle("stroke-dasharray", "8, 3"); $Line->setStyle("stroke-dashoffset", "0"); $FuDiagram->addSvgObject($Line); $Line = new dg\SvgDiagramLine2D(0,0,0,20,new dg\ColorRGB(0,150,0),8); $FuDiagram->addSvgObject($Line); $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:

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

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

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

Propozycje książek