Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建vtk七棱柱体(7个面有4个顶点,2个面有7个顶点)_C#_Python_C++_Vtk - Fatal编程技术网

C# 如何创建vtk七棱柱体(7个面有4个顶点,2个面有7个顶点)

C# 如何创建vtk七棱柱体(7个面有4个顶点,2个面有7个顶点),c#,python,c++,vtk,C#,Python,C++,Vtk,在vtk中,您可以使用InsertNextCell(int-type,vtkIdType npts,vtkIdType*ptid)将一个六角棱镜单元添加到vtkunstucturedgrid。这很好,但我想在vtkunstucturedgrid中包含一个七边形和八角形的棱镜。未在vtk中定义单元格类型 为了澄清一些疑问,我正在使用c,但是一个c++或python示例就足以将其转换为c 回到问题,我首先复制并稍微修改了代码以获得体素(8点,celltype=11) 正确显示体素的步骤: 但是,由于

vtk
中,您可以使用
InsertNextCell(int-type,vtkIdType npts,vtkIdType*ptid)将一个六角棱镜单元添加到
vtkunstucturedgrid
。这很好,但我想在
vtkunstucturedgrid
中包含一个七边形和八角形的棱镜。未在vtk中定义单元格类型

为了澄清一些疑问,我正在使用
c
,但是一个
c++
python
示例就足以将其转换为
c

回到问题,我首先复制并稍微修改了代码以获得体素(8点,celltype=11)

正确显示体素的步骤:

但是,由于我想要一个七面体,我尝试使用
VTK_多面体
,改变告诉pf类型单元添加到非结构化网格的行

            unstructuredGrid1.InsertNextCell(11, 8, ptIdsPointer);
to(42代表
VTK\u多面体
,11代表
VTK\u体素
)和点=14

            unstructuredGrid1.InsertNextCell(42, 14, ptIdsPointer);
喜欢。我喜欢C++之类的东西,但没有得到任何结果
int numberOfVertices = 14;
int numberOfFaces = 9; //how to tell heptagonal prism has 2 faces with 7 vertices and 7 with 4 vertices?
int numberOfFaceVertices = 4;
vtkIdType heptagonPointsIds[14] =  
    {0, 1,  2,  3,  4,  5,  6
     7,  8, 9, 10, 11, 12,13};

//points that only change in z
vtkSmartPointer<vtkPoints> points =  vtkSmartPointer<vtkPoints>::New();
        points->InsertNextPoint(454.6, 678.534, 1.1009301757813); //id 0
        points->InsertNextPoint(454.6, 678.545, 1.1500146484375);//id 1
        points->InsertNextPoint(454.6, 678.556, 1.2255187988281);//id 2
        points->InsertNextPoint(455.1, 678.556, 1.6478076171875);//id 3
        points->InsertNextPoint(455.1, 678.534, 1.7926538085938);//id 4
        points->InsertNextPoint(455.1, 678.545, 1.7166479492188);//id 5
        points->InsertNextPoint(454.85, 678.534, 1.0092297363281);//id 6

        points->InsertNextPoint(454.6, 678.534, 5.1009301757813);//id 7
        points->InsertNextPoint(454.6, 678.545, 5.1500146484375);//id 8
        points->InsertNextPoint(454.6, 678.556, 5.2255187988281);//id 9
        points->InsertNextPoint(455.1, 678.556, 5.6478076171875);//id 10
        points->InsertNextPoint(455.1, 678.534, 5.7926538085938);//id 11
        points->InsertNextPoint(455.1, 678.545, 5.7166479492188);//id 12
        points->InsertNextPoint(454.85, 678.534, 5.0092297363281);//id13    
vtkIdType heptagonPrismFace[9][4] = {
      {0, 1, 7, 8},
      {1, 2, 8, 9},
      {2, 3, 9, 10},
      {3, 4, 10, 11},
      {4, 5, 11, 12},
      {5, 6, 12, 13},
      {6, 1, 13, 8},
      //last two faces how to tel they should be 0 1 2 3 4 5 6 and  7 8 9 10 11 12 13 ?
      {0, 1, 2, 3},
      {7, 8, 9, 10},
      };

  vtkSmartPointer<vtkCellArray> heptagonFaces=
    vtkSmartPointer<vtkCellArray>::New();
  for (int i = 0; i < numberOfFaces; i++)
    {
    heptagonFaces->InsertNextCell(numberOfFaceVertices, heptagonPrismFace[i]);
    }

  vtkSmartPointer<vtkUnstructuredGrid> uGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
  uGrid->InsertNextCell(VTK_POLYHEDRON,
          numberOfVertices, heptagonPointsIds,
        numberOfFaces, heptagonFaces->GetPointer());
  uGrid->SetPoints(points);

vtkSmartPointer<vtkDataSetMapper> mapper =     vtkSmartPointer<vtkDataSetMapper>::New();
  mapper->SetInputConnection(uGrid->GetProducerPort());


  //add actor to render and stuff...
int numberoftexts=14;
int numberOfFaces=9//如何判断七边形棱柱体有两个面(7个顶点)和7个面(4个顶点)?
int numberoffacetexts=4;
VtKid型七点式SIDS[14]=
{0, 1,  2,  3,  4,  5,  6
7,  8, 9, 10, 11, 12,13};
//仅在z方向变化的点
vtkSmartPointer points=vtkSmartPointer::New();
点->插入下一点(454.6678.534,1.1009301757813)//id 0
点->插入下一点(454.6678.545,1.150014648375)//id 1
点->插入下一点(454.6678.556,1.2255187988281)//id 2
点->插入下一点(455.1678.556,1.6478076171875)//id 3
点->插入下一点(455.1678.534,1.7926538085938)//id 4
点->插入下一点(455.1678.545,1.7166479492188)//身份证5
点->插入下一点(454.85678.534,1.00922973681)//id 6
点->插入下一点(454.6678.534,5.1009301757813)//id 7
点->插入下一个点(454.6678.545,5.1500146484375)//id 8
点->插入下一点(454.6678.556,5.2255187988281)//id 9
点->插入下一点(455.1678.556,5.6478076171875)//id 10
点->插入下一点(455.1678.534,5.7926538085938)//身份证11
点->插入下一点(455.1678.545,5.7166479492188)//id 12
点->插入下一点(454.85678.534,5.00922973681)//id13
vtkid型七棱柱面[9][4]={
{0, 1, 7, 8},
{1, 2, 8, 9},
{2, 3, 9, 10},
{3, 4, 10, 11},
{4, 5, 11, 12},
{5, 6, 12, 13},
{6, 1, 13, 8},
//最后两张脸怎么告诉他们应该是01 2 3 4 5 6和7 8 9 10 11 12 13?
{0, 1, 2, 3},
{7, 8, 9, 10},
};
vtkSmartPointer七面体=
vtkSmartPointer::New();
for(int i=0;i插入下一个单元格(面顶点数,七边形棱柱面[i]);
}
vtkSmartPointer uGrid=vtkSmartPointer::New();
uGrid->InsertNextCell(VTK_多面体,
顶点数,七边形点,
numberOfFaces,七边形面->GetPointer());
uGrid->设定点(点);
vtkSmartPointer映射器=vtkSmartPointer::New();
映射器->设置输入连接(uGrid->GetProducerPort());
//添加演员渲染和东西。。。

如何获得图像:

由于七边形和八角形棱镜没有定义,您必须手动定义所有面,然后将每个面添加到
vtkunstucturedgrid
,例如,检查此八角形棱镜定义(这应该可以让您开始):

这将导致:


我认为您可以使用
vtkPolyhedron
例如:

import vtk
import math

class Point:
    def __init__(self, x, y, z):
        self.x =float(x)
        self.y = float(y)
        self.z = float(z)
    def like_list(self):
        return [self.x,self.y,self.z]


def generate_points(n):
    l = []
    centre = Point(0.0,0.0,0.0)
    angle = (360.0/float(n))
    r_len = 1.0
    l.append(Point(1.0,0.0,0.0))
    for i in xrange(1,n):
        alpha = math.radians(float(i)*angle)
        x = r_len * math.cos(alpha)
        y = r_len * math.sin(alpha)
        l.append(Point(x, y, 0.0))
    #down face simple translate points on 1 up
    l2 = [Point(p.x,p.y,p.z + 1.0) for p in l]
    l.extend(l2)
    return l

def MakeHeptagonalPrism():
    p_list = generate_points(7) # 7 is a number of vertices in base of polyhedron
    points = vtk.vtkPoints()
    for p in p_list:
        points.InsertNextPoint(p.like_list())
    #You should fix list of faces if change number of vertices but 
    #I think it's posible to write aloritm to make it automaticaly
    heptagonalFace = [
        [0, 1, 2, 3, 4, 5, 6],
        [7, 8, 9, 10, 11, 12, 13],
        [0, 1, 8, 7],
        [1, 2, 9, 8],
        [2, 3, 10, 9],
        [3, 4, 11, 10],
        [4, 5, 12, 11],
        [5, 6, 13, 12],
        [6, 0, 7, 13]
        ]
    numberOfFaces = 9
    heptagonalFacesIdList = vtk.vtkIdList()
    # Number faces that make up the cell.
    heptagonalFacesIdList.InsertNextId(numberOfFaces)
    for face in heptagonalFace:
        # Number of points in the face == numberOfFaceVertices
        heptagonalFacesIdList.InsertNextId(len(face))
        # Insert the pointIds for that face.
        [heptagonalFacesIdList.InsertNextId(i) for i in face]

    uGrid = vtk.vtkUnstructuredGrid()
    uGrid.InsertNextCell(vtk.VTK_POLYHEDRON, heptagonalFacesIdList)
    uGrid.SetPoints(points)

    # Visualize
    mapper = vtk.vtkDataSetMapper()
    mapper.SetInput(uGrid)

    actor = vtk.vtkActor()
    actor.SetMapper(mapper)

    renderer = vtk.vtkRenderer()
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.AddRenderer(renderer)
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    renderWindowInteractor.SetRenderWindow(renderWindow)

    renderer.AddActor(actor)
    renderer.SetBackground(.2, .3, .4)

    renderWindow.Render()
    renderWindowInteractor.Start()


if __name__ == '__main__':
    MakeHeptagonalPrism()
仅供参考,在我看来这确实很棘手,但您也可以使用
vtkCylinderSource
仅举个例子,将分辨率更改为7
source.SetResolution(7.0)
(它应该绘制棱柱状形状,但它将是一个圆柱体:)


希望对您有所帮助。

使用vTklinearExtrausionFilter更容易。我写了一些C++代码来生成具有可变边的多边形棱镜。我希望这将有助于:

    vtkSmartPointer<vtkVectorText> vecText = 
vtkSmartPointer<vtkVectorText>::New();
vecText->SetText("Text!");
vecText->Update();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
double Radius=1;
int NumberOfSides=7;
for (int i=0;i<NumberOfSides;i++)
    points->InsertNextPoint(Radius*cos((double)i*2*vtkMath::Pi()/NumberOfSides), Radius*sin((double)i*2*vtkMath::Pi()/NumberOfSides), 0.0); 
// Create the polygon
vtkSmartPointer<vtkPolygon> polygon =
vtkSmartPointer<vtkPolygon>::New();
polygon->GetPointIds()->SetNumberOfIds(NumberOfSides); 

for(int i=0;i<NumberOfSides;i++)
    polygon->GetPointIds()->SetId(i, i);

// Add the polygon to a list of polygons
vtkSmartPointer<vtkCellArray> polygons =
vtkSmartPointer<vtkCellArray>::New();
polygons->InsertNextCell(polygon);

// Create a PolyData
vtkSmartPointer<vtkPolyData> polygonPolyData =
vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(points);
polygonPolyData->SetPolys(polygons);

// Apply linear extrusion 
vtkSmartPointer<vtkLinearExtrusionFilter> extrude = 
vtkSmartPointer<vtkLinearExtrusionFilter>::New();
extrude->SetInputData( polygonPolyData);
extrude->SetExtrusionTypeToNormalExtrusion();
extrude->SetVector(0, 0, 1 );
extrude->SetScaleFactor (2);
extrude->Update(); 
vtkSmartPointer<vtkRenderWindow> renderWindow = 
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper=vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> actor=vtkSmartPointer<vtkActor>::New();
mapper->SetInputData( extrude->GetOutput());
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer=vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderWindow->AddRenderer(renderer);

vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =  vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindow->SetInteractor( renderWindowInteractor);
renderWindow->Render(); 
VTKSmartText=
vtkSmartPointer::New();
vecText->SetText(“Text!”);
vecText->Update();
VTKSmart指针点=
vtkSmartPointer::New();
双半径=1;
int NumberOfSides=7;
对于(int i=0;iInsertNextPoint(半径*cos((双)i*2*vtkMath::Pi()/NumberOfSides),半径*sin((双)i*2*vtkMath::Pi()/NumberOfSides),0.0);
//创建多边形
VTKSmart指针多边形=
vtkSmartPointer::New();
多边形->GetPointIds()->SetNumberOfIds(NumberOfSides);
对于(int i=0;iGetPointIds()->SetId(i,i);
//将多边形添加到多边形列表中
vtkSmartPointer多边形=
vtkSmartPointer::New();
多边形->插入下一个单元格(多边形);
//创建一个PolyData
vtkSmartPointer polygonPolyData=
vtkSmartPointer::New();
polygonPolyData->设定点(点);
polygonPolyData->SetPolys(多边形);
//应用线性挤出
vtkSmartPointer挤出=
vtkSmartPointer::New();
挤出->设置输入数据(polygonPolyData);
extrude->SetExtrusionTypeToNormalExtrusion();
挤出->设置向量(0,0,1);
挤出->设置比例因子(2);
挤出->更新();
vtkSmartPointer Renderwinow=
vtkSmartPointer::New();
vtkSmartPointer映射器=vtkSmartPointer::New();
vtkSmartPointer=vtkSmartPointer::New();
映射器->设置输入数据(挤出->获取输出());
actor->SetMapper(映射器);
vtkSmartPointer=vtkSmartPointer::New();
渲染器->AddActor(actor);
renderWindow->AddRenderer(渲染器);
vtkSmartPointer renderWindowInteractor=vtkSmartPointer::New();
renderWindow->SetInteractor(RenderWindowActor);
renderWindow->Render();
我运行了代码,得到了七边形棱镜的3d形状:

为什么不使用的代码进行相应的编辑?我猜所有prism类都共享大部分代码,或者
import vtk
import math

class Point:
    def __init__(self, x, y, z):
        self.x =float(x)
        self.y = float(y)
        self.z = float(z)
    def like_list(self):
        return [self.x,self.y,self.z]


def generate_points(n):
    l = []
    centre = Point(0.0,0.0,0.0)
    angle = (360.0/float(n))
    r_len = 1.0
    l.append(Point(1.0,0.0,0.0))
    for i in xrange(1,n):
        alpha = math.radians(float(i)*angle)
        x = r_len * math.cos(alpha)
        y = r_len * math.sin(alpha)
        l.append(Point(x, y, 0.0))
    #down face simple translate points on 1 up
    l2 = [Point(p.x,p.y,p.z + 1.0) for p in l]
    l.extend(l2)
    return l

def MakeHeptagonalPrism():
    p_list = generate_points(7) # 7 is a number of vertices in base of polyhedron
    points = vtk.vtkPoints()
    for p in p_list:
        points.InsertNextPoint(p.like_list())
    #You should fix list of faces if change number of vertices but 
    #I think it's posible to write aloritm to make it automaticaly
    heptagonalFace = [
        [0, 1, 2, 3, 4, 5, 6],
        [7, 8, 9, 10, 11, 12, 13],
        [0, 1, 8, 7],
        [1, 2, 9, 8],
        [2, 3, 10, 9],
        [3, 4, 11, 10],
        [4, 5, 12, 11],
        [5, 6, 13, 12],
        [6, 0, 7, 13]
        ]
    numberOfFaces = 9
    heptagonalFacesIdList = vtk.vtkIdList()
    # Number faces that make up the cell.
    heptagonalFacesIdList.InsertNextId(numberOfFaces)
    for face in heptagonalFace:
        # Number of points in the face == numberOfFaceVertices
        heptagonalFacesIdList.InsertNextId(len(face))
        # Insert the pointIds for that face.
        [heptagonalFacesIdList.InsertNextId(i) for i in face]

    uGrid = vtk.vtkUnstructuredGrid()
    uGrid.InsertNextCell(vtk.VTK_POLYHEDRON, heptagonalFacesIdList)
    uGrid.SetPoints(points)

    # Visualize
    mapper = vtk.vtkDataSetMapper()
    mapper.SetInput(uGrid)

    actor = vtk.vtkActor()
    actor.SetMapper(mapper)

    renderer = vtk.vtkRenderer()
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.AddRenderer(renderer)
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    renderWindowInteractor.SetRenderWindow(renderWindow)

    renderer.AddActor(actor)
    renderer.SetBackground(.2, .3, .4)

    renderWindow.Render()
    renderWindowInteractor.Start()


if __name__ == '__main__':
    MakeHeptagonalPrism()
    vtkSmartPointer<vtkVectorText> vecText = 
vtkSmartPointer<vtkVectorText>::New();
vecText->SetText("Text!");
vecText->Update();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
double Radius=1;
int NumberOfSides=7;
for (int i=0;i<NumberOfSides;i++)
    points->InsertNextPoint(Radius*cos((double)i*2*vtkMath::Pi()/NumberOfSides), Radius*sin((double)i*2*vtkMath::Pi()/NumberOfSides), 0.0); 
// Create the polygon
vtkSmartPointer<vtkPolygon> polygon =
vtkSmartPointer<vtkPolygon>::New();
polygon->GetPointIds()->SetNumberOfIds(NumberOfSides); 

for(int i=0;i<NumberOfSides;i++)
    polygon->GetPointIds()->SetId(i, i);

// Add the polygon to a list of polygons
vtkSmartPointer<vtkCellArray> polygons =
vtkSmartPointer<vtkCellArray>::New();
polygons->InsertNextCell(polygon);

// Create a PolyData
vtkSmartPointer<vtkPolyData> polygonPolyData =
vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(points);
polygonPolyData->SetPolys(polygons);

// Apply linear extrusion 
vtkSmartPointer<vtkLinearExtrusionFilter> extrude = 
vtkSmartPointer<vtkLinearExtrusionFilter>::New();
extrude->SetInputData( polygonPolyData);
extrude->SetExtrusionTypeToNormalExtrusion();
extrude->SetVector(0, 0, 1 );
extrude->SetScaleFactor (2);
extrude->Update(); 
vtkSmartPointer<vtkRenderWindow> renderWindow = 
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper=vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> actor=vtkSmartPointer<vtkActor>::New();
mapper->SetInputData( extrude->GetOutput());
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer=vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderWindow->AddRenderer(renderer);

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