// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include "vtkChartLegend.h" #include "vtkChartXY.h" #include "vtkContextScene.h" #include "vtkContextView.h" #include "vtkDoubleArray.h" #include "vtkLookupTable.h" #include "vtkMath.h" #include "vtkNew.h" #include "vtkPen.h" #include "vtkPlotFunctionalBag.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkStringArray.h" #include "vtkTable.h" #include //------------------------------------------------------------------------------ int TestFunctionalBagPlot(int, char*[]) { // Creates an input table constexpr int numCols = 7; constexpr int numVals = 100; vtkNew inputTable; vtkNew arr[numCols]; for (int i = 0; i < numCols; i++) { std::stringstream ss; ss << "Y" << i; arr[i]->SetName(ss.str().c_str()); arr[i]->SetNumberOfValues(numVals); for (int j = 0; j < numVals; j++) { arr[i]->SetValue(j, (i + 1) * fabs(sin((j * 2.0 * vtkMath::Pi()) / static_cast(numVals))) * j + i * 20); } inputTable->AddColumn(arr[i]); } // Create a X-axis column vtkNew xArr; xArr->SetName("X"); xArr->SetNumberOfValues(numVals); for (int j = 0; j < numVals; j++) { xArr->SetValue(j, j * 2.0); } inputTable->AddColumn(xArr); // Create the bag columns vtkNew q3Arr; q3Arr->SetName("Q3"); q3Arr->SetNumberOfComponents(2); q3Arr->SetNumberOfTuples(numVals); vtkNew q2Arr; q2Arr->SetName("Q2"); q2Arr->SetNumberOfComponents(2); q2Arr->SetNumberOfTuples(numVals); for (int i = 0; i < numVals; i++) { double v0, v1; v0 = arr[1]->GetVariantValue(i).ToFloat(); v1 = arr[5]->GetVariantValue(i).ToFloat(); q3Arr->SetTuple2(i, v0, v1); v0 = arr[2]->GetVariantValue(i).ToFloat(); v1 = arr[4]->GetVariantValue(i).ToFloat(); q2Arr->SetTuple2(i, v0, v1); } inputTable->AddColumn(q3Arr); inputTable->AddColumn(q2Arr); // Set up a 2D scene and add an XY chart to it vtkNew view; view->GetRenderWindow()->SetSize(400, 400); view->GetRenderWindow()->SetMultiSamples(0); vtkNew chart; view->GetScene()->AddItem(chart); chart->SetShowLegend(true); chart->GetLegend()->SetHorizontalAlignment(vtkChartLegend::LEFT); chart->GetLegend()->SetVerticalAlignment(vtkChartLegend::TOP); // Create the functional bag plots vtkNew q3Plot; q3Plot->SetColorF(0.5, 0, 0); q3Plot->SetInputData(inputTable, "X", "Q3"); chart->AddPlot(q3Plot); vtkNew q2Plot; q2Plot->SetColorF(1., 0, 0); q2Plot->SetInputData(inputTable, "X", "Q2"); chart->AddPlot(q2Plot); vtkNew lookup; lookup->SetNumberOfColors(numCols); lookup->SetRange(0, numCols - 1); lookup->Build(); for (int j = 0; j < numCols; j++) { vtkNew plot; double rgb[3]; lookup->GetColor(j, rgb); plot->SetColorF(rgb[0], rgb[1], rgb[2]); plot->SetInputData(inputTable, "X", inputTable->GetColumn(j)->GetName()); chart->AddPlot(plot); } // Render the scene view->GetInteractor()->Initialize(); view->GetInteractor()->Start(); return EXIT_SUCCESS; }