Как определить функцию C ++ в VTK - PullRequest
0 голосов
/ 20 сентября 2019

enter image description here Я новичок в C ++ и VTK.Я пытаюсь получить идентификатор клетки в rectilinearGrid базовом примере.Я использую этот код, но компилятор говорит, что это неправильно с ошибкой, которую я написал в комментарии

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkFloatArray.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRectilinearGrid.h>
#include <vtkRectilinearGridGeometryFilter.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>

#include <array>

int main()
{
  vtkNew<vtkNamedColors> colors;

  std::array<int, 16> x = {
      {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};
  std::array<int, 16> y = {
      {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};
  std::array<int, 16> z = {
      {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};

  // Create a rectilinear grid by defining three arrays specifying the
  // coordinates in the x-y-z directions.
  vtkNew<vtkFloatArray> xCoords;
  for (auto&& i : x)
  {
    xCoords->InsertNextValue(i);
  }
  vtkNew<vtkFloatArray> yCoords;
  for (auto&& i : y)
  {
    yCoords->InsertNextValue(i);
  }
  vtkNew<vtkFloatArray> zCoords;
  for (auto&& i : z)
  {
    zCoords->InsertNextValue(i);
  }

  // The coordinates are assigned to the rectilinear grid. Make sure that
  // the number of values in each of the XCoordinates, YCoordinates,
  // and ZCoordinates is equal to what is defined in SetDimensions().
  //
  vtkNew<vtkRectilinearGrid> rgrid;
  rgrid->SetDimensions(int(x.size()), int(y.size()), int(z.size()));
  rgrid->SetXCoordinates(xCoords);
  rgrid->SetYCoordinates(yCoords);
  rgrid->SetZCoordinates(zCoords);

  vtkCell* GetCell(vtkRectilinearGrid * rgrid, int i, int j, int k) //I SHOULD INSERT IN HERE ";" FOR 
  {                                                                 //CLOSING THE STATEMENT. BUT IN                  
      int dims[3];                                                    //THIS WAY THE FUNCTION PARAMETER  
      rgrid->GetDimensions(dims);                                     // BEHIND WOULDN'T BE CONNECTED.

      if (i < 0 || i > dims[0] - 1 ||
          j < 0 || j > dims[1] - 1 ||
          k < 0 || k > dims[2] - 1)
      {
          return NULL; // out of bounds!
      }

      int pos[3];
      pos[0] = i;
      pos[1] = j;
      pos[2] = k;

      vtkIdType id;
      id = vtkStructuredData::ComputeCellId(dims, pos);

      return rgrid->GetCell(id);
  };




  // Extract a plane from the grid to see what we've got.
  vtkNew<vtkRectilinearGridGeometryFilter> plane;
  plane->SetInputData(rgrid);
  plane->SetExtent(0, 46, 16, 16, 0, 43);

  vtkNew<vtkPolyDataMapper> rgridMapper;
  rgridMapper->SetInputConnection(plane->GetOutputPort());

  vtkNew<vtkActor> wireActor;
  wireActor->SetMapper(rgridMapper);
  wireActor->GetProperty()->SetRepresentationToWireframe();
  wireActor->GetProperty()->SetColor(colors->GetColor3d("Black").GetData());

  // Create the usual rendering stuff.
  vtkNew<vtkRenderer> renderer;
  vtkNew<vtkRenderWindow> renWin;
  renWin->AddRenderer(renderer);
  vtkNew<vtkRenderWindowInteractor> iren;
  iren->SetRenderWindow(renWin);

  renderer->AddActor(wireActor);
  renderer->SetBackground(1, 1, 1);
  renderer->ResetCamera();
  renderer->GetActiveCamera()->Elevation(30.0);
  renderer->GetActiveCamera()->Azimuth(15.0);
  renderer->GetActiveCamera()->Zoom(1.0);
  renderer->SetBackground(colors->GetColor3d("Beige").GetData());

  renWin->SetSize(600, 600);






  // interact with data
  renWin->Render();
  iren->Start();

  return EXIT_SUCCESS;
}

Как можно исправить?

ОБНОВЛЕНИЕ 1: Я вставил изображениеошибки компиляции.Должен быть вставлен ";"для закрытия оператора до {}

ОБНОВЛЕНИЕ 2: точная ошибка

Ошибка (attivo) E0065 ожидается ';'RGrid C: \ vtk \ VTK-8.2.0 \ examples \ DataManipulation \ Cxx \ RGrid.cxx 73

Я использую Visual Studio.Я попытался отбросить последний ";"но ничего не меняется

ОБНОВЛЕНИЕ 3: Я загрузил весь код

1 Ответ

0 голосов
/ 23 сентября 2019

Вы определили свою функцию GetCell внутри тела функции main, что недопустимо в C ++.Внутри тела будет разрешено только объявление, поэтому компилятор ожидает точку с запятой после заголовка функции.

Переместите весь функциональный блок GetCell за пределы функции main.Если это приводит к проблемам, которые вы не можете решить, задайте еще один вопрос о них.

...