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.
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.
Powyższy efekt spowodowany jest przez następujący fragment kodu:
Domyślnie wykres jest generowany od wartości ymin do ymax. Możliwe jest również ustawienie granic dla osi y wykresu.
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.
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).
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:
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.
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.
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();