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
仅举个例子,将分辨率更改为7source.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();