The article shows a few kinds of widgets which are used to measure the distance between two points, angle between two rays, and the bidimensional length of an object.

Distance

Measure The Distance On 2D Model

We need vtkDistanceWidget, vtkDistanceRepresentation2D and vtkPointHandleRepresentation2D to help us to calculate the distance between two points on 3D model. Both points can be moved flexibly.

int main()
{
    vtkSmartPointer<vtkPNGReader> reader =
            vtkSmartPointer<vtkPNGReader>::New();
    reader->SetFileName( "/Users/weiyang/Desktop/Untitled.png" );
    reader->Update();

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();

    vtkSmartPointer<vtkImageViewer2> imageViewer =
            vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputData( reader->GetOutput() );
    imageViewer->SetColorWindow( 256 );
    imageViewer->SetColorLevel( 127.5 );
    imageViewer->SetupInteractor( renderWindowInteractor );

    vtkPointHandleRepresentation2D *handle = vtkPointHandleRepresentation2D::New();
    vtkDistanceRepresentation2D *rep = vtkDistanceRepresentation2D::New();
    rep->SetHandleRepresentation( handle );

    vtkDistanceWidget *widget = vtkDistanceWidget::New();
    widget->SetInteractor( renderWindowInteractor );
    widget->SetRepresentation( rep );
    widget->SetWidgetStateToManipulate();
    widget->EnabledOn();
    widget->ProcessEventsOn();

    imageViewer->GetRenderer()->ResetCamera();
    imageViewer->Render();
    renderWindowInteractor->Start();

    handle->Delete();
    rep->Delete();
    widget->Delete();
    return 0;
}


Measure The Distance On 3D Model

This scenario is similar to the above last example, but we put both points on the 3D model in the following code.
We have to convert vtkDistanceRepresentation2D and vtkPointHandleRepresentation2D to vtkDistanceRepresentation3D and vtkPointHandleRepresentation3D individually.

int main()
{
    vtkSmartPointer<vtkSphereSource> sphereSource =
        vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData( sphereSource->GetOutput() );

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

    vtkSmartPointer<vtkRenderer> renderer =
            vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor( actor );
    renderer->SetBackground( 0, 0, 0 );

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

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

    vtkSmartPointer<vtkPointHandleRepresentation3D> handle =
            vtkSmartPointer<vtkPointHandleRepresentation3D>::New();
    vtkSmartPointer<vtkDistanceRepresentation3D> rep =
            vtkSmartPointer<vtkDistanceRepresentation3D>::New();
    rep->SetHandleRepresentation( handle );

    vtkSmartPointer<vtkDistanceWidget> widget =
            vtkSmartPointer<vtkDistanceWidget>::New();
    widget->SetInteractor( renderWindowInteractor );
    widget->SetRepresentation( rep );
    widget->SetWidgetStateToManipulate();
    widget->EnabledOn();
    widget->ProcessEventsOn();

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();

    return 0;
}


Angle

The examples in the angle section also show different measuring situations in 2D and 3D.
Let the code and images to tell you the details of angle measuring.

Measure Angle For 2D Model

int main()
{
    vtkSmartPointer<vtkPNGReader> reader =
            vtkSmartPointer<vtkPNGReader>::New();
    reader->SetFileName( "/Users/weiyang/Desktop/Untitled.png" );
    reader->Update();

    vtkSmartPointer<vtkImageActor> actor =
            vtkSmartPointer<vtkImageActor>::New();
    actor->GetMapper()->SetInputConnection( reader->GetOutputPort() );

    vtkSmartPointer<vtkRenderer> renderer =
            vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
    renderer->SetActiveCamera( camera );
    renderer->AddActor( actor );
    renderer->SetBackground( 0, 0, 0 );

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

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

    vtkPointHandleRepresentation2D *handle = vtkPointHandleRepresentation2D::New();
    vtkAngleRepresentation2D *rep = vtkAngleRepresentation2D::New();
    rep->SetHandleRepresentation(handle);

    vtkAngleWidget *widget = vtkAngleWidget::New();
    widget->SetInteractor( renderWindowInteractor );
    widget->SetRepresentation(rep);
    widget->EnabledOn();

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();

    handle->Delete();
    rep->Delete();
    widget->Delete();
    return 0;
}


Measure Angle For 3D Model

    vtkSmartPointer<vtkPointHandleRepresentation3D> handle =
            vtkSmartPointer<vtkPointHandleRepresentation3D>::New();
    vtkSmartPointer<vtkAngleRepresentation3D> rep =
            vtkSmartPointer<vtkAngleRepresentation3D>::New();
    rep->SetHandleRepresentation(handle);

    vtkSmartPointer<vtkAngleWidget> widget =
            vtkSmartPointer<vtkAngleWidget>::New();
    widget->SetInteractor( renderWindowInteractor );
    widget->SetRepresentation(rep);
    widget->EnabledOn();


BiDimensional

We use two finite, orthogonal lines that intersect within the finite extent of both lines to do bi-dimensional measure .
There are four end points can be positioned in the measuring.

int main()
{
    vtkSmartPointer<vtkPNGReader> reader =
            vtkSmartPointer<vtkPNGReader>::New();
    reader->SetFileName( "/Users/weiyang/Desktop/Untitled.png" );
    reader->Update();

    vtkSmartPointer<vtkImageActor> actor =
            vtkSmartPointer<vtkImageActor>::New();
    actor->GetMapper()->SetInputConnection( reader->GetOutputPort() );

    vtkSmartPointer<vtkRenderer> renderer =
            vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
    renderer->SetActiveCamera( camera );
    renderer->AddActor( actor );
    renderer->SetBackground( 0, 0, 0 );

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

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

    vtkBiDimensionalRepresentation2D *rep = vtkBiDimensionalRepresentation2D::New();
    vtkBiDimensionalWidget *widget = vtkBiDimensionalWidget::New();
    widget->SetInteractor( renderWindowInteractor );
    widget->SetRepresentation( rep );
    widget->EnabledOn();

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();

    rep->Delete();
    widget->Delete();
    return 0;
}


 


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

You cannot copy content of this page