我试图根据Mayavi的Y值对仅靠其角已知的表面进行着色。原始,我成功使用matplotlib(here)进行了相同的操作,但是我将这个规范返回到我的真实数据上,渲染还不够,因此我现在尝试使用Mayavi。我从Surface from irregular data example找到了一个非常有用的示例。但是,当应用于我的情况时,在此简单的情况下在此处重现,三角剖分会出错,如下图所示,左侧表面是两个下部三角形,而不是右侧表面是上部和下部三角形。
我发现它来自第二个Y顶点的位置,但是我想找到一个更通用的解决方案:1)避免这种错误的三角剖分; 2)通过在每个角之间进行插值来获得更平滑的表面,如我的并尽可能避免在右侧表面看到褶皱,这是因为我的表面仅分成两个三角形。有关使用Mayavi进行此操作的任何想法?
这是我用来生成此简单示例的代码:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import numpy
from mayavi import mlab
X1 = numpy.array([0, 0, 1, 1])
Y1 = numpy.array([0.5, 0.75, 1, 0.5])
Z1 = numpy.array([0, 1, 0.5,0])
X2 = numpy.array([0, 0, 1, 1])
Y2 = numpy.array([-0.5, -0.45, -1, -0.5])
Z2 = numpy.array([0, 1, 0.5,0])
fig = mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0.5, 0.5, 0.5))
# Building the working triangulation
# Define the points in 3D space
# including color code based on Z coordinate.
pts = mlab.points3d(X1, Y1, Z1, Y1, colormap='jet')
# Triangulate based on X, Y with Delaunay 2D algorithm.
# Save resulting triangulation.
mesh = mlab.pipeline.delaunay2d(pts)
# Remove the point representation from the plot
pts.remove()
# Draw a surface based on the triangulation
surf = mlab.pipeline.surface(mesh, colormap='jet')
# Building the buggus triangulation
pts = mlab.points3d(X2, Y2, Z2, Y2, colormap='jet')
# Triangulate based on X, Y with Delaunay 2D algorithm.
# Save resulting triangulation.
mesh = mlab.pipeline.delaunay2d(pts)
# Remove the point representation from the plot
pts.remove()
# Draw a surface based on the triangulation
surf = mlab.pipeline.surface(mesh, colormap='jet')
# Simple plot.
mlab.outline(extent=(0,1,-1,1,0,1))
mlab.axes(extent=(0,1,-1,1,0,1), nb_labels=3)
mlab.show()
最佳答案
与您的matplotlib示例相比,您使用的是不同的arrays
。
matplotlib示例:
z = numpy.array([0, **0.5, 1,** 0])
这里:
Z1 = numpy.array([0, **1, 0.5**,0])
使用正确的
z
数组,该图看起来与您的matplotlib示例相似,包括进行插值以获得更平滑的颜色过渡。关于python - Mayavi的自动三角剖分功能不好,无法为仅由其角部知道的表面着色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20979274/