Select points inside a box by custom interactor style

I want to select points inside a box by custom interactor style. To do this, I try to decide if a point inside a defined frustum. The frustum.FunctionValue(pointdata) value of points inside frustum should smaller than zero. But the value always larger than zero. So what should i do to correct my code? Or, Is there any easy way to Select points inside a box? Here is my code. Thanks.


#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkIdTypeArray.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkRendererCollection.h>
#include <vtkProperty.h>
#include <vtkPlanes.h>
#include <vtkObjectFactory.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkExtractPoints.h>
#include <vtkInteractorStyleRubberBand3D.h>
#include <vtkAreaPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkUnstructuredGrid.h>
#include <vtkDataSet.h>
#include <vtkIdFilter.h>
#include <vtkSphereSource.h>

// Define interaction style
class InteractorStyle : public vtkInteractorStyleRubberBand3D
{
public:
    static InteractorStyle* New();
vtkTypeMacro(InteractorStyle,vtkInteractorStyleRubberBand3D);

    InteractorStyle()
    {
        this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
        this->SelectedActor = vtkSmartPointer<vtkActor>::New();
        this->SelectedActor->SetMapper(SelectedMapper);
    }


    void OnLeftButtonDown() {
        {
            vtkSmartPointer<vtkAreaPicker> picker =
                    vtkSmartPointer<vtkAreaPicker>::New();
            this->GetInteractor()->SetPicker(picker);
            auto frustum = picker->GetFrustum();

            vtkSmartPointer<vtkExtractPoints> extractor =
                    vtkSmartPointer<vtkExtractPoints>::New();
            extractor->SetImplicitFunction(frustum);
            extractor->SetInputData(this->dataset);
            extractor->Update();
            std::cout<<"extractor"<<extractor->GetOutput()->GetPointData()->GetNumberOfTuples();

            auto point_data = this->dataset->GetPointData();
            auto original_ids = dynamic_cast<vtkIdTypeArray *>(point_data->GetArray("OriginalIds"));
            auto ids = vtkSmartPointer<vtkIdTypeArray>::New();

            for (int i = 0; i < point_data->GetArray("OriginalIds")->GetNumberOfTuples(); i++) {
//            std::cout << frustum->FunctionValue(dataset->GetPoint(original_ids->GetValue(i)))<<std::endl;
                if (frustum->FunctionValue(this->dataset->GetPoint(original_ids->GetValue(i))) < 0) {
                    ids->InsertNextValue(original_ids->GetValue(i));
                }
            }

            // Forward events
            vtkInteractorStyleRubberBand3D::OnLeftButtonDown();
        }
    }
    void SetData(vtkSmartPointer<vtkDataSet> data){dataset=data;}

private:
    vtkSmartPointer<vtkDataSet> dataset;
    vtkSmartPointer<vtkActor> SelectedActor;
    vtkSmartPointer<vtkDataSetMapper> SelectedMapper;

};
vtkStandardNewMacro(InteractorStyle);

int main (int, char *[])
{
    vtkSmartPointer<vtkSphereSource> sphere_source = vtkSmartPointer<vtkSphereSource>::New();


    vtkSmartPointer<vtkIdFilter> idFilter =
            vtkSmartPointer<vtkIdFilter>::New();
    idFilter->SetInputConnection(sphere_source->GetOutputPort());
    idFilter->SetIdsArrayName("OriginalIds");
    idFilter->Update();

    auto input = idFilter->GetOutput();

    // Create a mapper and actor
    vtkSmartPointer<vtkDataSetMapper> mapper =
            vtkSmartPointer<vtkDataSetMapper>::New();
#if VTK_MAJOR_VERSION <= 5
    mapper->SetInputConnection(input->GetProducerPort());
#else
    mapper->SetInputData(input);
#endif
    mapper->ScalarVisibilityOff();

    vtkSmartPointer<vtkActor> actor =
            vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // Visualize
    vtkSmartPointer<vtkRenderer> renderer =
            vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow =
            vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkAreaPicker> areaPicker =
            vtkSmartPointer<vtkAreaPicker>::New();
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
            vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetPicker(areaPicker);
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->AddActor(actor);
    //renderer->SetBackground(1,1,1); // Background color white

    renderWindow->Render();

    vtkSmartPointer<InteractorStyle> style =
            vtkSmartPointer<InteractorStyle>::New();
    style->SetData(input);
    renderWindowInteractor->SetInteractorStyle( style );

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}