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