From 945eebf76fa830b39a800c15e003dd215fff116b Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 13:01:36 +0200 Subject: [PATCH 1/8] kind of working but where did the euler layer go? --- particle-track-and-trace/src/CMakeLists.txt | 3 +- .../src/CartographicTransformation.cpp | 108 ++++++++++++++---- .../src/CartographicTransformation.h | 2 + .../src/commands/SpawnPointCallback.cpp | 7 +- .../src/commands/SpawnPointCallback.h | 6 +- .../src/layers/LGlyphLayer.cpp | 20 ++-- particle-track-and-trace/src/main.cpp | 48 ++++++++ 7 files changed, 151 insertions(+), 43 deletions(-) diff --git a/particle-track-and-trace/src/CMakeLists.txt b/particle-track-and-trace/src/CMakeLists.txt index 9364e77..ac28701 100644 --- a/particle-track-and-trace/src/CMakeLists.txt +++ b/particle-track-and-trace/src/CMakeLists.txt @@ -7,7 +7,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -find_package(VTK COMPONENTS +find_package(VTK COMPONENTS + GeovisCore CommonColor CommonColor CommonCore diff --git a/particle-track-and-trace/src/CartographicTransformation.cpp b/particle-track-and-trace/src/CartographicTransformation.cpp index 5518d61..ee07e53 100644 --- a/particle-track-and-trace/src/CartographicTransformation.cpp +++ b/particle-track-and-trace/src/CartographicTransformation.cpp @@ -2,6 +2,9 @@ #include #include #include +#include +#include +#include vtkSmartPointer createNormalisedCamera() { vtkSmartPointer camera = vtkSmartPointer::New(); @@ -15,32 +18,93 @@ vtkSmartPointer createNormalisedCamera() { return camera; } -vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid) { - const double XMin = uvGrid->lons.front(); - const double XMax = uvGrid->lons.back(); - const double YMin = uvGrid->lats.front(); - const double YMax = uvGrid->lats.back(); - - double eyeTransform[] = { - 2/(XMax-XMin), 0, 0, -(XMax+XMin)/(XMax-XMin), - 0, 2/(YMax-YMin), 0, -(YMax+YMin)/(YMax-YMin), - 0, 0, 1, 0, - 0, 0, 0, 1 - }; - - auto matrix = vtkSmartPointer::New(); - matrix->DeepCopy(eyeTransform); - return matrix; -} +//vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid) { +// const double XMin = uvGrid->lons.front(); +// const double XMax = uvGrid->lons.back(); +// const double YMin = uvGrid->lats.front(); +// const double YMax = uvGrid->lats.back(); +// +// double eyeTransform[] = { +// 2/(XMax-XMin), 0, 0, -(XMax+XMin)/(XMax-XMin), +// 0, 2/(YMax-YMin), 0, -(YMax+YMin)/(YMax-YMin), +// 0, 0, 1, 0, +// 0, 0, 0, 1 +// }; +// +// auto matrix = vtkSmartPointer::New(); +// matrix->DeepCopy(eyeTransform); +// return matrix; +//} // Assumes Normalised camera is used vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid) { - vtkNew transform; + auto proj = vtkSmartPointer::New(); + proj->SetName("merc"); - transform->SetMatrix(getCartographicTransformMatrix(uvGrid)); + auto geoTransform = vtkSmartPointer::New(); + geoTransform->SetDestinationProjection(proj); - vtkSmartPointer transformFilter = vtkSmartPointer::New(); - transformFilter->SetTransform(transform); + const double XMin = -15.875; + const double XMax = 12.875; + const double YMin = 46.125; + const double YMax = 62.625; - return transformFilter; + double bottomLeft[3] = {XMin, YMin, 0}; + double topRight[3] = {XMax, YMax, 0}; + geoTransform->TransformPoint(bottomLeft, bottomLeft); + geoTransform->TransformPoint(topRight, topRight); + + double width = topRight[0] - bottomLeft[0]; + double height = topRight[1] - bottomLeft[1]; + + auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); + scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); + scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); + + auto totalProjection = vtkSmartPointer::New(); + totalProjection->Identity(); + totalProjection->Concatenate(scaleIntoNormalisedSpace); + totalProjection->Concatenate(geoTransform); + + vtkSmartPointer transformFilter = vtkSmartPointer::New(); + transformFilter->SetTransform(totalProjection); + + return transformFilter; +} + +vtkSmartPointer createInverseCartographicTransformFilter(const std::shared_ptr uvGrid) { + auto proj = vtkSmartPointer::New(); + proj->SetName("merc"); + + auto geoTransform = vtkSmartPointer::New(); + geoTransform->SetDestinationProjection(proj); + + const double XMin = -15.875; + const double XMax = 12.875; + const double YMin = 46.125; + const double YMax = 62.625; + + double bottomLeft[3] = {XMin, YMin, 0}; + double topRight[3] = {XMax, YMax, 0}; + geoTransform->TransformPoint(bottomLeft, bottomLeft); + geoTransform->TransformPoint(topRight, topRight); + geoTransform->Inverse(); + + double width = topRight[0] - bottomLeft[0]; + double height = topRight[1] - bottomLeft[1]; + + auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); + scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); + scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); + scaleIntoNormalisedSpace->Inverse(); + + auto totalProjection = vtkSmartPointer::New(); + totalProjection->Identity(); + totalProjection->Concatenate(geoTransform); + totalProjection->Concatenate(scaleIntoNormalisedSpace); + + vtkSmartPointer transformFilter = vtkSmartPointer::New(); + transformFilter->SetTransform(totalProjection); + + return transformFilter; } diff --git a/particle-track-and-trace/src/CartographicTransformation.h b/particle-track-and-trace/src/CartographicTransformation.h index e59be8d..9b265e5 100644 --- a/particle-track-and-trace/src/CartographicTransformation.h +++ b/particle-track-and-trace/src/CartographicTransformation.h @@ -28,4 +28,6 @@ vtkSmartPointer getCartographicTransformMatrix(const std::shared_p * @return pointer to transform filter */ vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid); + +vtkSmartPointer createInverseCartographicTransformFilter(const std::shared_ptr uvGrid); #endif //NORMALISEDCARTOGRAPHICCAMERA_H diff --git a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp index 3253e23..3327443 100644 --- a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp @@ -38,8 +38,8 @@ void SpawnPointCallback::Execute(vtkObject *caller, unsigned long evId, void *ca ren->SetDisplayPoint(displayPos); ren->DisplayToWorld(); ren->GetWorldPoint(worldPos); - inverseCartographicProjection->MultiplyPoint(worldPos, worldPos); - // cout << "clicked on lon = " << worldPos[0] << " and lat = " << worldPos[1] << endl; + cout << "clicked on " << worldPos[1] << ", " << worldPos[0] << endl; + inverseCartographicProjection->TransformPoint(worldPos, worldPos); vtkIdType id = points->InsertNextPoint(worldPos[0], worldPos[1], 0); data->SetPoints(points); @@ -77,6 +77,5 @@ void SpawnPointCallback::setRen(const vtkSmartPointer &ren) { void SpawnPointCallback::setUVGrid(const std::shared_ptr &uvGrid) { this->uvGrid = uvGrid; - inverseCartographicProjection = getCartographicTransformMatrix(uvGrid); - inverseCartographicProjection->Invert(); + inverseCartographicProjection = createInverseCartographicTransformFilter(uvGrid)->GetTransform(); } diff --git a/particle-track-and-trace/src/commands/SpawnPointCallback.h b/particle-track-and-trace/src/commands/SpawnPointCallback.h index b7f7682..0896796 100644 --- a/particle-track-and-trace/src/commands/SpawnPointCallback.h +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.h @@ -1,13 +1,13 @@ #ifndef SPAWNPOINTCALLBACK_H #define SPAWNPOINTCALLBACK_H - #include #include #include #include #include -#include +#include + #include "../advection/UVGrid.h" class SpawnPointCallback : public vtkCallbackCommand { @@ -30,7 +30,7 @@ private: vtkSmartPointer points; vtkSmartPointer ren; std::shared_ptr uvGrid; - vtkSmartPointer inverseCartographicProjection; + vtkSmartPointer inverseCartographicProjection; void Execute(vtkObject *caller, unsigned long evId, void *callData) override; diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.cpp b/particle-track-and-trace/src/layers/LGlyphLayer.cpp index 3a4077a..60b12db 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/LGlyphLayer.cpp @@ -59,7 +59,7 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptr mapper; mapper->SetInputConnection(glyph2D->GetOutputPort()); mapper->Update(); - + vtkNew actor; actor->SetMapper(mapper); @@ -68,17 +68,11 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptrpoints->InsertNextPoint(-4.125, 61.375 , 0); - // this->points->InsertNextPoint(6.532949683882039, 53.24308582564463, 0); // Coordinates of Zernike - // this->points->InsertNextPoint(5.315307819255385, 60.40001057122271, 0); // Coordinates of Bergen - // this->points->InsertNextPoint( 6.646210231365825, 46.52346296009023, 0); // Coordinates of Lausanne - // this->points->InsertNextPoint(-6.553894313570932, 62.39522131195857, 0); // Coordinates of the top of the Faroe islands - - for (int i=0; i < 330; i+=5) { - for (int j=0; j < 330; j+=5) { - this->points->InsertNextPoint(-15.875+(12.875+15.875)/330*j, 46.125+(62.625-46.125)/330*i, 0); - } - } + this->points->InsertNextPoint(6.532949683882039, 53.24308582564463, 0); // Coordinates of Zernike + this->points->InsertNextPoint(5.315307819255385, 60.40001057122271, 0); // Coordinates of Bergen + this->points->InsertNextPoint(6.646210231365825, 46.52346296009023, 0); // Coordinates of Lausanne + this->points->InsertNextPoint(-6.553894313570932, 62.39522131195857, + 0); // Coordinates of the top of the Faroe islands this->points->Modified(); } @@ -89,7 +83,7 @@ void LGlyphLayer::updateData(int t) { for (vtkIdType n = 0; n < this->points->GetNumberOfPoints(); n++) { this->points->GetPoint(n, point); for (int i = 0; i < SUPERSAMPLINGRATE; i++) { - std::tie(point[1], point[0]) = advector->advect(t, point[1], point[0], (t-lastT)/SUPERSAMPLINGRATE); + std::tie(point[1], point[0]) = advector->advect(t, point[1], point[0], (t - lastT) / SUPERSAMPLINGRATE); } this->points->SetPoint(n, point[0], point[1], 0); } diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index f6a794e..c974467 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -17,6 +17,12 @@ #include "advection/kernel/RK4AdvectionKernel.h" #include "advection/kernel/SnapBoundaryConditionKernel.h" +#include +#include +#include +#include +#include + using namespace std; #define DT 60 * 60 // 60 sec/min * 60 mins @@ -29,6 +35,7 @@ int main() { cout << "Starting vtk..." << endl; auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4BoundaryChecked)); + l->spoofPoints(); unique_ptr program = make_unique(DT); program->addLayer(new BackgroundImage("../../../../data/map_661-661.png")); @@ -37,6 +44,47 @@ int main() { program->render(); +// auto proj = vtkSmartPointer::New(); proj->SetName("merc"); auto geoTransform = vtkSmartPointer::New(); geoTransform->SetDestinationProjection(proj); +// const double XMin = -15.875; +// const double XMax = 12.875; +// const double YMin = 46.125; +// const double YMax = 62.625; +// +// double bottomLeft[3] = {XMin, YMin, 0}; +// double topRight[3] = {XMax, YMax, 0}; +// geoTransform->TransformPoint(bottomLeft, bottomLeft); +// geoTransform->TransformPoint(topRight, topRight); +// +// double width = topRight[0] - bottomLeft[0]; +// double height = topRight[1] - bottomLeft[1]; +// +// auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); +// scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); +// scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); +// +// auto totalProjection = vtkSmartPointer::New(); +// totalProjection->PostMultiply(); +// totalProjection->Identity(); +// totalProjection->Concatenate(geoTransform); +// totalProjection->Concatenate(scaleIntoNormalisedSpace); +// +// double in[3] = {4.846871030623073, 52.364810061968335, 0}; +// geoTransform->TransformPoint(in, in); +// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; +// scaleIntoNormalisedSpace->TransformPoint(in, in); +// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; +// scaleIntoNormalisedSpace->Inverse(); +// scaleIntoNormalisedSpace->TransformPoint(in, in); +// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; +// geoTransform->Inverse(); +// geoTransform->TransformPoint(in, in); +// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; +//// totalProjection->TransformPoint(in, in); +//// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; +//// totalProjection->Inverse(); +//// totalProjection->TransformPoint(in, in); +//// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; + return EXIT_SUCCESS; } From 3c38704a7af8412588d5a0df76a29a7d35ec5391 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 13:20:10 +0200 Subject: [PATCH 2/8] hello?? --- particle-track-and-trace/src/main.cpp | 41 --------------------------- 1 file changed, 41 deletions(-) diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index c974467..3ceecf1 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -44,47 +44,6 @@ int main() { program->render(); -// auto proj = vtkSmartPointer::New(); proj->SetName("merc"); auto geoTransform = vtkSmartPointer::New(); geoTransform->SetDestinationProjection(proj); -// const double XMin = -15.875; -// const double XMax = 12.875; -// const double YMin = 46.125; -// const double YMax = 62.625; -// -// double bottomLeft[3] = {XMin, YMin, 0}; -// double topRight[3] = {XMax, YMax, 0}; -// geoTransform->TransformPoint(bottomLeft, bottomLeft); -// geoTransform->TransformPoint(topRight, topRight); -// -// double width = topRight[0] - bottomLeft[0]; -// double height = topRight[1] - bottomLeft[1]; -// -// auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); -// scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); -// scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); -// -// auto totalProjection = vtkSmartPointer::New(); -// totalProjection->PostMultiply(); -// totalProjection->Identity(); -// totalProjection->Concatenate(geoTransform); -// totalProjection->Concatenate(scaleIntoNormalisedSpace); -// -// double in[3] = {4.846871030623073, 52.364810061968335, 0}; -// geoTransform->TransformPoint(in, in); -// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; -// scaleIntoNormalisedSpace->TransformPoint(in, in); -// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; -// scaleIntoNormalisedSpace->Inverse(); -// scaleIntoNormalisedSpace->TransformPoint(in, in); -// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; -// geoTransform->Inverse(); -// geoTransform->TransformPoint(in, in); -// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; -//// totalProjection->TransformPoint(in, in); -//// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; -//// totalProjection->Inverse(); -//// totalProjection->TransformPoint(in, in); -//// cout << "in[3] = {" << in[0] << "," << in[1] << "," << in[2] << "}" << endl; - return EXIT_SUCCESS; } From 2b641a4a785bf500b4f12ba8622c69a28d8574ed Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 13:21:01 +0200 Subject: [PATCH 3/8] deleted includes --- particle-track-and-trace/src/main.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 3ceecf1..131755c 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -17,12 +17,6 @@ #include "advection/kernel/RK4AdvectionKernel.h" #include "advection/kernel/SnapBoundaryConditionKernel.h" -#include -#include -#include -#include -#include - using namespace std; #define DT 60 * 60 // 60 sec/min * 60 mins From 16d3423eb96025d1f14fef5b424ca8d1b631fc7e Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 13:59:20 +0200 Subject: [PATCH 4/8] no real changes --- .../src/CartographicTransformation.cpp | 86 +++++++++++-------- .../src/layers/EGlyphLayer.cpp | 5 ++ 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/particle-track-and-trace/src/CartographicTransformation.cpp b/particle-track-and-trace/src/CartographicTransformation.cpp index ee07e53..4f7e776 100644 --- a/particle-track-and-trace/src/CartographicTransformation.cpp +++ b/particle-track-and-trace/src/CartographicTransformation.cpp @@ -7,35 +7,17 @@ #include vtkSmartPointer createNormalisedCamera() { - vtkSmartPointer camera = vtkSmartPointer::New(); - camera->ParallelProjectionOn(); // Enable parallel projection + vtkSmartPointer camera = vtkSmartPointer::New(); + camera->ParallelProjectionOn(); // Enable parallel projection - camera->SetPosition(0, 0, 1000); // Place the camera above the center - camera->SetFocalPoint(0, 0, 0); // Look at the center - camera->SetViewUp(0, 1, 0); // Set the up vector to be along the Y-axis - camera->SetParallelScale(1); // x,y in [-1, 1] + camera->SetPosition(0, 0, 1000); // Place the camera above the center + camera->SetFocalPoint(0, 0, 0); // Look at the center + camera->SetViewUp(0, 1, 0); // Set the up vector to be along the Y-axis + camera->SetParallelScale(1); // x,y in [-1, 1] - return camera; + return camera; } -//vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid) { -// const double XMin = uvGrid->lons.front(); -// const double XMax = uvGrid->lons.back(); -// const double YMin = uvGrid->lats.front(); -// const double YMax = uvGrid->lats.back(); -// -// double eyeTransform[] = { -// 2/(XMax-XMin), 0, 0, -(XMax+XMin)/(XMax-XMin), -// 0, 2/(YMax-YMin), 0, -(YMax+YMin)/(YMax-YMin), -// 0, 0, 1, 0, -// 0, 0, 0, 1 -// }; -// -// auto matrix = vtkSmartPointer::New(); -// matrix->DeepCopy(eyeTransform); -// return matrix; -//} - // Assumes Normalised camera is used vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid) { auto proj = vtkSmartPointer::New(); @@ -44,10 +26,10 @@ vtkSmartPointer createCartographicTransformFilter(const std: auto geoTransform = vtkSmartPointer::New(); geoTransform->SetDestinationProjection(proj); - const double XMin = -15.875; - const double XMax = 12.875; - const double YMin = 46.125; - const double YMax = 62.625; + const double XMin = uvGrid->lons.front(); + const double XMax = uvGrid->lons.back(); + const double YMin = uvGrid->lats.front(); + const double YMax = uvGrid->lats.back(); double bottomLeft[3] = {XMin, YMin, 0}; double topRight[3] = {XMax, YMax, 0}; @@ -58,8 +40,8 @@ vtkSmartPointer createCartographicTransformFilter(const std: double height = topRight[1] - bottomLeft[1]; auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); - scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); - scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); + scaleIntoNormalisedSpace->Scale(2 / (width), 2 / (height), 1); + scaleIntoNormalisedSpace->Translate(-(bottomLeft[0] + topRight[0]) / 2, -(bottomLeft[1] + topRight[1]) / 2, 0); auto totalProjection = vtkSmartPointer::New(); totalProjection->Identity(); @@ -79,10 +61,10 @@ vtkSmartPointer createInverseCartographicTransformFilter(con auto geoTransform = vtkSmartPointer::New(); geoTransform->SetDestinationProjection(proj); - const double XMin = -15.875; - const double XMax = 12.875; - const double YMin = 46.125; - const double YMax = 62.625; + const double XMin = uvGrid->lons.front(); + const double XMax = uvGrid->lons.back(); + const double YMin = uvGrid->lats.front(); + const double YMax = uvGrid->lats.back(); double bottomLeft[3] = {XMin, YMin, 0}; double topRight[3] = {XMax, YMax, 0}; @@ -94,8 +76,8 @@ vtkSmartPointer createInverseCartographicTransformFilter(con double height = topRight[1] - bottomLeft[1]; auto scaleIntoNormalisedSpace = vtkSmartPointer::New(); - scaleIntoNormalisedSpace->Scale(2/(width), 2/(height), 1); - scaleIntoNormalisedSpace->Translate(-(bottomLeft[0]+topRight[0])/2, -(bottomLeft[1] + topRight[1])/2, 0); + scaleIntoNormalisedSpace->Scale(2 / (width), 2 / (height), 1); + scaleIntoNormalisedSpace->Translate(-(bottomLeft[0] + topRight[0]) / 2, -(bottomLeft[1] + topRight[1]) / 2, 0); scaleIntoNormalisedSpace->Inverse(); auto totalProjection = vtkSmartPointer::New(); @@ -108,3 +90,33 @@ vtkSmartPointer createInverseCartographicTransformFilter(con return transformFilter; } + +//vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid) { +// const double XMin = uvGrid->lons.front(); +// const double XMax = uvGrid->lons.back(); +// const double YMin = uvGrid->lats.front(); +// const double YMax = uvGrid->lats.back(); +// +// double eyeTransform[] = { +// 2/(XMax-XMin), 0, 0, -(XMax+XMin)/(XMax-XMin), +// 0, 2/(YMax-YMin), 0, -(YMax+YMin)/(YMax-YMin), +// 0, 0, 1, 0, +// 0, 0, 0, 1 +// }; +// +// auto matrix = vtkSmartPointer::New(); +// matrix->DeepCopy(eyeTransform); +// return matrix; +//} +// +//// Assumes Normalised camera is used +//vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid) { +// vtkNew transform; +// +// transform->SetMatrix(getCartographicTransformMatrix(uvGrid)); +// +// vtkSmartPointer transformFilter = vtkSmartPointer::New(); +// transformFilter->SetTransform(transform); +// +// return transformFilter; +//} \ No newline at end of file diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp index 39970b7..3906595 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/EGlyphLayer.cpp @@ -12,10 +12,13 @@ #include #include #include + #include "../CartographicTransformation.h" #include "../advection/readdata.h" #include "../advection/interpolate.h" +#include "vtkTransform.h" + using namespace std; EGlyphLayer::EGlyphLayer(std::shared_ptr uvGrid) { @@ -41,6 +44,7 @@ void EGlyphLayer::readCoordinates() { this->direction->SetNumberOfTuples(numLats * numLons); points->Allocate(numLats * numLons); + int i = 0; int latIndex = 0; for (double lat: uvGrid->lats) { @@ -49,6 +53,7 @@ void EGlyphLayer::readCoordinates() { auto [u, v] = (*uvGrid)[0, latIndex, lonIndex]; direction->SetTuple3(i, 5*u, 5*v, 0); points->InsertPoint(i++, lon, lat, 0); + lonIndex++; } latIndex++; From af1fc0afc004b6f1ff373f70a61cadeafa516e21 Mon Sep 17 00:00:00 2001 From: djairoh Date: Wed, 8 May 2024 16:00:00 +0200 Subject: [PATCH 5/8] fix: workaround to EGlyphs no longer appearing --- .../src/layers/EGlyphLayer.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp index 3906595..7a6a3ee 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/EGlyphLayer.cpp @@ -45,6 +45,9 @@ void EGlyphLayer::readCoordinates() { points->Allocate(numLats * numLons); + auto transform = createCartographicTransformFilter(uvGrid)->GetTransform(); + double *out = (double *)malloc(3*sizeof(double)); + int i = 0; int latIndex = 0; for (double lat: uvGrid->lats) { @@ -52,18 +55,20 @@ void EGlyphLayer::readCoordinates() { for (double lon: uvGrid->lons) { auto [u, v] = (*uvGrid)[0, latIndex, lonIndex]; direction->SetTuple3(i, 5*u, 5*v, 0); - points->InsertPoint(i++, lon, lat, 0); - + // pre-transform the points, so we don't have to include the cartographic transform while running the program. + out = transform->TransformPoint(lon, lat, 0); + points->InsertPoint(i++, out[0], out[1], 0); lonIndex++; } latIndex++; } + // free(out); //FIXME: causes a segfault for some reason? + this->data->SetPoints(points); this->data->GetPointData()->AddArray(this->direction); this->data->GetPointData()->SetActiveVectors("direction"); - vtkSmartPointer transformFilter = createCartographicTransformFilter(uvGrid); - transformFilter->SetInputData(data); + // transformFilter->SetInputData(data); vtkNew arrowSource; arrowSource->SetGlyphTypeToArrow(); @@ -72,7 +77,7 @@ void EGlyphLayer::readCoordinates() { vtkNew glyph2D; glyph2D->SetSourceConnection(arrowSource->GetOutputPort()); - glyph2D->SetInputConnection(transformFilter->GetOutputPort()); + glyph2D->SetInputData(data); glyph2D->OrientOn(); glyph2D->ClampingOn(); glyph2D->SetScaleModeToScaleByVector(); @@ -98,8 +103,8 @@ void EGlyphLayer::updateData(int t) { for (int lat = 0; lat < uvGrid->latSize; lat++) { for (int lon = 0; lon < uvGrid->lonSize; lon++) { auto [u, v] = (*uvGrid)[t/3600, lat, lon]; - // TODO: 5*v scaling stuff should really be a filter transform - this->direction->SetTuple3(i, 5*u, 5*v, 0); + // TODO: might want to multiple the u,v by some factor. + this->direction->SetTuple3(i, u, v, 0); i++; } } From 438bc841d9b9ffdbc5358437afc1c6454b2ff587 Mon Sep 17 00:00:00 2001 From: djairoh Date: Wed, 8 May 2024 16:26:54 +0200 Subject: [PATCH 6/8] fix: do not call GetTransform in the same line as CreateCartographicTransformation --- .../src/layers/EGlyphLayer.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp index 7a6a3ee..528a4a5 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/EGlyphLayer.cpp @@ -44,9 +44,10 @@ void EGlyphLayer::readCoordinates() { this->direction->SetNumberOfTuples(numLats * numLons); points->Allocate(numLats * numLons); - - auto transform = createCartographicTransformFilter(uvGrid)->GetTransform(); - double *out = (double *)malloc(3*sizeof(double)); + // auto transform = createCartographicTransformFilter(uvGrid)->GetTransform(); + vtkSmartPointer filter = createCartographicTransformFilter(uvGrid); + auto transform = filter->GetTransform(); + double *out; int i = 0; int latIndex = 0; @@ -54,15 +55,14 @@ void EGlyphLayer::readCoordinates() { int lonIndex = 0; for (double lon: uvGrid->lons) { auto [u, v] = (*uvGrid)[0, latIndex, lonIndex]; - direction->SetTuple3(i, 5*u, 5*v, 0); + direction->SetTuple3(i, u/2, v/2, 0); // pre-transform the points, so we don't have to include the cartographic transform while running the program. - out = transform->TransformPoint(lon, lat, 0); + out = transform->TransformPoint(lon, lat, 0.0); points->InsertPoint(i++, out[0], out[1], 0); lonIndex++; } latIndex++; } - // free(out); //FIXME: causes a segfault for some reason? this->data->SetPoints(points); this->data->GetPointData()->AddArray(this->direction); @@ -78,6 +78,7 @@ void EGlyphLayer::readCoordinates() { vtkNew glyph2D; glyph2D->SetSourceConnection(arrowSource->GetOutputPort()); glyph2D->SetInputData(data); + // glyph2D->SetInputConnection(transformFilter->GetOutputPort()); glyph2D->OrientOn(); glyph2D->ClampingOn(); glyph2D->SetScaleModeToScaleByVector(); @@ -103,8 +104,8 @@ void EGlyphLayer::updateData(int t) { for (int lat = 0; lat < uvGrid->latSize; lat++) { for (int lon = 0; lon < uvGrid->lonSize; lon++) { auto [u, v] = (*uvGrid)[t/3600, lat, lon]; - // TODO: might want to multiple the u,v by some factor. - this->direction->SetTuple3(i, u, v, 0); + // TODO: 5*v scaling stuff should really be a filter transform + this->direction->SetTuple3(i, u/2, v/2, 0); i++; } } From 52873b38def2292f0ad630bd0b3efa5cff4ca3da Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 19:36:19 +0200 Subject: [PATCH 7/8] fix: fixed leak --- particle-track-and-trace/src/layers/EGlyphLayer.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp index 528a4a5..85a9bde 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/EGlyphLayer.cpp @@ -44,10 +44,8 @@ void EGlyphLayer::readCoordinates() { this->direction->SetNumberOfTuples(numLats * numLons); points->Allocate(numLats * numLons); - // auto transform = createCartographicTransformFilter(uvGrid)->GetTransform(); vtkSmartPointer filter = createCartographicTransformFilter(uvGrid); auto transform = filter->GetTransform(); - double *out; int i = 0; int latIndex = 0; @@ -57,7 +55,8 @@ void EGlyphLayer::readCoordinates() { auto [u, v] = (*uvGrid)[0, latIndex, lonIndex]; direction->SetTuple3(i, u/2, v/2, 0); // pre-transform the points, so we don't have to include the cartographic transform while running the program. - out = transform->TransformPoint(lon, lat, 0.0); + double out[3] = {lon, lat, 0}; + transform->TransformPoint(out, out); points->InsertPoint(i++, out[0], out[1], 0); lonIndex++; } @@ -68,8 +67,6 @@ void EGlyphLayer::readCoordinates() { this->data->GetPointData()->AddArray(this->direction); this->data->GetPointData()->SetActiveVectors("direction"); - // transformFilter->SetInputData(data); - vtkNew arrowSource; arrowSource->SetGlyphTypeToArrow(); arrowSource->SetScale(0.2); //TODO: set this properly @@ -78,7 +75,6 @@ void EGlyphLayer::readCoordinates() { vtkNew glyph2D; glyph2D->SetSourceConnection(arrowSource->GetOutputPort()); glyph2D->SetInputData(data); - // glyph2D->SetInputConnection(transformFilter->GetOutputPort()); glyph2D->OrientOn(); glyph2D->ClampingOn(); glyph2D->SetScaleModeToScaleByVector(); From 0f99201c061fa26c99ecc504a2f5d1228c354bbd Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 8 May 2024 19:43:15 +0200 Subject: [PATCH 8/8] fix: removed comments and added comments --- .../src/CartographicTransformation.cpp | 32 +------------------ .../src/CartographicTransformation.h | 23 ++++++------- .../src/layers/LGlyphLayer.h | 12 ++++--- 3 files changed, 20 insertions(+), 47 deletions(-) diff --git a/particle-track-and-trace/src/CartographicTransformation.cpp b/particle-track-and-trace/src/CartographicTransformation.cpp index 4f7e776..1c8b09a 100644 --- a/particle-track-and-trace/src/CartographicTransformation.cpp +++ b/particle-track-and-trace/src/CartographicTransformation.cpp @@ -89,34 +89,4 @@ vtkSmartPointer createInverseCartographicTransformFilter(con transformFilter->SetTransform(totalProjection); return transformFilter; -} - -//vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid) { -// const double XMin = uvGrid->lons.front(); -// const double XMax = uvGrid->lons.back(); -// const double YMin = uvGrid->lats.front(); -// const double YMax = uvGrid->lats.back(); -// -// double eyeTransform[] = { -// 2/(XMax-XMin), 0, 0, -(XMax+XMin)/(XMax-XMin), -// 0, 2/(YMax-YMin), 0, -(YMax+YMin)/(YMax-YMin), -// 0, 0, 1, 0, -// 0, 0, 0, 1 -// }; -// -// auto matrix = vtkSmartPointer::New(); -// matrix->DeepCopy(eyeTransform); -// return matrix; -//} -// -//// Assumes Normalised camera is used -//vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid) { -// vtkNew transform; -// -// transform->SetMatrix(getCartographicTransformMatrix(uvGrid)); -// -// vtkSmartPointer transformFilter = vtkSmartPointer::New(); -// transformFilter->SetTransform(transform); -// -// return transformFilter; -//} \ No newline at end of file +} \ No newline at end of file diff --git a/particle-track-and-trace/src/CartographicTransformation.h b/particle-track-and-trace/src/CartographicTransformation.h index 9b265e5..46dc51f 100644 --- a/particle-track-and-trace/src/CartographicTransformation.h +++ b/particle-track-and-trace/src/CartographicTransformation.h @@ -15,19 +15,20 @@ vtkSmartPointer createNormalisedCamera(); /** - * Constructs a 4x4 projection matrix that maps homogenious (longitude, latitude, 0, 1) points - * to the normalised space. - * TODO: This transformation has room for improvement see: - * https://github.com/MakeNEnjoy/interactive-track-and-trace/issues/12 - * @return pointer to 4x4 matrix - */ -vtkSmartPointer getCartographicTransformMatrix(const std::shared_ptr uvGrid); - -/** - * Convenience function that converts the 4x4 projection matrix into a vtkTransformFilter - * @return pointer to transform filter + * Creates a mercator projection and then scales into normalised space. + * @param uvGrid grid that contains latitudes and longitudes + * @return pointer to transform filter */ vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid); +/** + * Creates an inverse mercator projection and then scales into normalised space. + * + * Note that it is not possible to call the Inverse() member function on the transform of the + * createCartographicTransformFilter. It produces the wrong output, + * I believe that this is a bug in VTK, I might make an issue about this sometime. + * @param uvGrid grid that contains latitudes and longitudes + * @return pointer to transform filter + */ vtkSmartPointer createInverseCartographicTransformFilter(const std::shared_ptr uvGrid); #endif //NORMALISEDCARTOGRAPHICCAMERA_H diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.h b/particle-track-and-trace/src/layers/LGlyphLayer.h index 125282f..5ffdbd1 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.h +++ b/particle-track-and-trace/src/layers/LGlyphLayer.h @@ -23,13 +23,15 @@ public: */ LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptr advectionKernel); - /** This function spoofs a few points in the dataset. Mostly used for testing. - */ + /** + * This function spoofs a few points in the dataset. Mostly used for testing. + */ void spoofPoints(); - /** updates the glyphs to reflect the given timestamp in the dataset. - * @param t : the time at which to fetch the data. - */ + /** + * updates the glyphs to reflect the given timestamp in the dataset. + * @param t : the time at which to fetch the data. + */ void updateData(int t) override; vtkSmartPointer createSpawnPointCallback();