码迷,mamicode.com
首页 > 其他好文 > 详细

VTK初学一,a Mesh from vtkImageData—球冠

时间:2016-12-01 07:49:10      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:back   etc   data   stat   art   技术分享   半径   std   upd   

技术分享

#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif

#include <iostream>
using namespace std;
#include <vtkVersion.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkMath.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkImageData.h>
#include <vtkGreedyTerrainDecimation.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkInteractionWidgetsModule.h>

void myShow(vtkGreedyTerrainDecimation* anInput)
{

    vtkSmartPointer<vtkPolyDataMapper> aMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
    aMapper->SetInputConnection(anInput->GetOutputPort());
    aMapper->ScalarVisibilityOn();

    vtkSmartPointer<vtkActor> anActor=vtkSmartPointer<vtkActor>::New();
    anActor->SetMapper(aMapper);
    anActor->GetProperty()->SetInterpolationToFlat();
    anActor->GetProperty()->EdgeVisibilityOn();
    anActor->GetProperty()->SetEdgeColor(1,0,0);

    vtkSmartPointer<vtkRenderer> ren1=vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renWin=vtkSmartPointer<vtkRenderWindow>::New();
    ren1->AddActor(anActor);
    ren1->ResetCamera();
    ren1->SetBackground(1,1,1);
    renWin->AddRenderer(ren1);
    renWin->SetSize(512,512);

    vtkSmartPointer<vtkRenderWindowInteractor> iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    iren->SetRenderWindow(renWin);
    iren->SetInteractorStyle(style);
    iren->Start();
}
int main()
{
    vtkSmartPointer<vtkImageData> image=vtkSmartPointer<vtkImageData>::New();
    image->SetDimensions(120,120,1);
    image->AllocateScalars(VTK_UNSIGNED_CHAR,1);
    int dims[3];
//    double max=sqrt(dims[0]*dims[0]+dims[1]*dims[1]);
    image->GetDimensions(dims);
    double R=100;//球面半径
    double r=0;//任意x、y坐标点,到(0,0)点的距离
    double r2=r*r;

    double rCrown=dims[0]/2;
    double rCrown2=rCrown*rCrown;//球冠半径的平方
    double hmax2=R*R-rCrown2;//最大弧矢高的平方
    double hmax=R-sqrt(hmax2);//最大弧矢高
    for(double i=0;i<dims[0];i++)
    {
        for(double j=0;j<dims[1];j++)
        {
            unsigned char* pixel=static_cast<unsigned char*>(image->GetScalarPointer(i,j,0));
            double x=(i-dims[0]/2),y=(j-dims[1]/2);
            r2=x*x+y*y;
            r=sqrt(r2);
            if(r<rCrown)
                //不知道为什么,要在后面多加一个最大弧矢高hmax,才能得到正确的球冠,大概是坐标方向问题吧
                pixel[0]=sqrt(R*R-r2)-(R-hmax)+hmax;
            else
                pixel[0]=hmax;
        }
    }
    vtkSmartPointer<vtkGreedyTerrainDecimation>decimation=vtkSmartPointer<vtkGreedyTerrainDecimation>::New();
    decimation->SetInputData(image);
    decimation->Update();
    //可视化
    myShow(decimation);
    return 0;
}

VTK初学一,a Mesh from vtkImageData—球冠

标签:back   etc   data   stat   art   技术分享   半径   std   upd   

原文地址:http://www.cnblogs.com/phoenixdsg/p/6120500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!