diff --git a/vtk/src/CMakeLists.txt b/vtk/src/CMakeLists.txt index a97a1e0..7af562f 100644 --- a/vtk/src/CMakeLists.txt +++ b/vtk/src/CMakeLists.txt @@ -9,6 +9,10 @@ find_package(VTK COMPONENTS CommonCore CommonDataModel FiltersGeneral + FiltersGeometry + FiltersProgrammable + IOImage + ImagingSources InteractionStyle RenderingContextOpenGL2 RenderingCore @@ -16,7 +20,6 @@ find_package(VTK COMPONENTS RenderingGL2PSOpenGL2 RenderingOpenGL2 CommonColor - FiltersGeometry RenderingCore) if (NOT VTK_FOUND) diff --git a/vtk/src/main.cpp b/vtk/src/main.cpp index 2f7c56f..d317840 100644 --- a/vtk/src/main.cpp +++ b/vtk/src/main.cpp @@ -3,11 +3,18 @@ #include #include #include +#include +#include +#include +#include #include #include #include #include +#include +#include #include +#include #include #include #include @@ -15,6 +22,7 @@ #include #include +#include #define NLATS 67 #define NLONS 116 @@ -46,49 +54,107 @@ tuple, vector, vector> readGrid() { return {time, latitude, longitude}; } -int main() { - vtkNew colors; +void renderCoordinates(vtkRenderer *ren, vtkNamedColors *colors) { - vtkNew pCoords; - pCoords->SetNumberOfComponents(3); - pCoords->SetNumberOfTuples(NLATS*NLONS); + vtkNew points; auto [times, lats, lons] = readGrid(); double i = 0; for (double lat : lats) { for (double lon : lons) { - pCoords->InsertTuple3(i++, 0, lat, lon); + cout << "lat: " << (lat*1000-46125)*661/16500 << "\t lon: " << (lon*1000+15875)*661/28750 << endl; + points->InsertNextPoint((lat*1000-46125)*661/16500, (lon*1000+15875)*661/28750, 0); } } - - vtkNew points; - points->SetData(pCoords); - vtkNew polydata; polydata->SetPoints(points); + vtkNew glyphFilter; + glyphFilter->SetInputData(polydata); + glyphFilter->Update(); vtkNew mapper; - mapper->SetInputData(polydata); - mapper->SetScalarRange(0, 40); + mapper->SetInputConnection(glyphFilter->GetOutputPort()); + mapper->Update(); vtkNew actor; actor->SetMapper(mapper); + actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData()); + actor->GetProperty()->SetPointSize(3); - vtkNew ren; ren->AddActor(actor); - ren->SetBackground(colors->GetColor3d("DarkSlateGray").GetData()); +} + +void renderBackground(vtkRenderer *background) { + vtkSmartPointer imageData; + + vtkNew readerFactory; + vtkSmartPointer imageReader; + + imageReader.TakeReference(readerFactory->CreateImageReader2("../../../../data/map_661-661.png")); + imageReader->SetFileName("../../../../data/map_661-661.png"); + imageReader->Update(); + imageData = imageReader->GetOutput(); + + vtkNew imageActor; + imageActor->SetInputData(imageData); + + background->AddActor(imageActor); + + + // camera stuff + // essentially sets the camera to the middle of the background, and points it at the background + double origin[3], spacing[3]; + int extent[6]; + imageData->GetOrigin(origin); + imageData->GetSpacing(spacing); + imageData->GetExtent(extent); + + vtkCamera *camera = background->GetActiveCamera(); + camera->ParallelProjectionOn(); + + double xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0]; + double yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1]; + double yd = (extent[3] - extent[2] + 1) * spacing[1]; + double d = camera->GetDistance(); + camera->SetParallelScale(0.5 * yd); + camera->SetFocalPoint(xc, yc, 0.0); + camera->SetPosition(xc, yc, d); +} + +int main() { + vtkNew colors; + vtkNew Euler, Background, Lagrange; + Euler->SetBackground(colors->GetColor3d("DarkSlateGray").GetData()); + + + Background->SetLayer(0); + Background->InteractiveOff(); + Euler->SetLayer(1); + Euler->InteractiveOff(); + Lagrange->SetLayer(2); + + renderCoordinates(Euler, colors); + renderBackground(Background); vtkNew renWin; - renWin->AddRenderer(ren); - renWin->SetSize(900, 600); + renWin->SetNumberOfLayers(3); + // renWin->SetNumberOfLayers(2); + renWin->AddRenderer(Background); + renWin->AddRenderer(Euler); + renWin->AddRenderer(Lagrange); + renWin->SetWindowName("Simulation"); + renWin->SetSize(661, 661); vtkNew iren; iren->SetRenderWindow(renWin); + + renWin->Render(); iren->Start(); + return EXIT_SUCCESS; }