Laplace Transform for Mass Spring Damper

Plotted using VTK

#include <vtkChartXY.h>
#include <vtkContextView.h>
#include <vtkFloatArray.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlot.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTable.h>
#include <complex>

const double m = 1.0;   // Mass
const double k = 10.0;  // Spring constant
const double c = 0.5;   // Damping coefficient

// Function to calculate the Laplace transform
std::complex<double> laplaceTransform(std::complex<double> s) {
    std::complex<double> num(1.0);
    std::complex<double> den = m * s * s + c * s + k;
    return num / den;
}

void create_graph(vtkNew<vtkTable>& table)
{

    std::vector<double> frequency;
    for (double w = 0.1; w <= 10.0; w += 0.1) {
        frequency.push_back(w);
    }

    // Calculate the Laplace transform for each frequency
    std::vector<std::complex<double>> laplaceResults;
    for (double w : frequency) {
        double s_real = 0.0;
        double s_imag = w;
        std::complex<double> s(s_real, s_imag);
        std::complex<double> result = laplaceTransform(s);
        laplaceResults.push_back(result);
    }

    int numPoints = frequency.size();
    float inc = 0.1;
    table->SetNumberOfRows(numPoints);
    for (size_t i = 0; i < frequency.size(); ++i) {
        //gp << frequency[i] << " " << std::abs(laplaceResults[i]) << "\n";
        table->SetValue(i, 0, frequency[i]);
        table->SetValue(i, 1, std::abs(laplaceResults[i]));
    }
}
int main(int, char*[])
{
    vtkNew<vtkNamedColors> colors;

    // Create a table with some points in it.
    vtkNew<vtkTable> table;

    vtkNew<vtkFloatArray> arrX;
    arrX->SetName("X Axis");
    table->AddColumn(arrX);

    vtkNew<vtkFloatArray> arrC;
    arrC->SetName("Cosine");
    table->AddColumn(arrC);

    create_graph(table);

    // Set up the view
    vtkNew<vtkContextView> view;
    view->GetRenderWindow()->SetWindowName("LinePlot");
    //view->GetRenderer()->SetBackground(colors->GetColor3d("SlateGray").GetData());

    // Add multiple line plots, setting the colors etc.
    vtkNew<vtkChartXY> chart;
    view->GetScene()->AddItem(chart);
    vtkPlot* line = chart->AddPlot(vtkChart::LINE);
    line->SetInputData(table, 0, 1);
    line->SetColor(0, 0, 0, 255);
    line->SetWidth(5.0);


    // For dotted line, the line type can be from 2 to 5 for different dash/dot

    view->GetRenderWindow()->Render();
    view->GetInteractor()->Initialize();
    view->GetInteractor()->Start();

    return EXIT_SUCCESS;
}
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(LinePlot)

find_package(VTK COMPONENTS
  ChartsCore
  CommonColor
  CommonCore
  CommonDataModel
  InteractionStyle
  RenderingContext2D
  RenderingContextOpenGL2
  RenderingCore
  RenderingFreeType
  RenderingGL2PSOpenGL2
  RenderingOpenGL2
  ViewsContext2D
)

if (NOT VTK_FOUND)
  message(FATAL_ERROR "LinePlot: Unable to find the VTK build folder.")
endif()

# Prevent a "command line is too long" failure in Windows.
set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.")
add_executable(LinePlot MACOSX_BUNDLE main.cpp )
  target_link_libraries(LinePlot PRIVATE ${VTK_LIBRARIES}
)
# vtk_module_autoinit is needed
vtk_module_autoinit(
  TARGETS LinePlot
  MODULES ${VTK_LIBRARIES}
)