我试图根据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/

10-13 05:23