我尝试使用 Mayavi 根据 Y 值对仅通过其角点已知的表面进行着色。原来,我成功地用 matplotlib ( here ) 做了同样的事情,但我把这个规范放回到我的真实数据上,渲染不够充分,因此我现在正在尝试使用 Mayavi。我从Surface from irregular data example找到了这个例子这很有帮助。然而,当应用于我的案例时,在这个简单的案例中重现,三角测量会出错,如下图所示,左表面有两个下三角形,而不是右表面的上三角形和下三角形。
我发现它来自第二个 Y 顶点的位置,但是我想找到一个更通用的解决方案来 1)避免这种错误的三角测量,2)通过在每个角之间进行插值来获得更光滑的表面,如下所示我的previous post并尽可能避免在右侧表面上看到的折叠,因为我的表面仅分成两个三角形。关于使用 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 示例相比,您使用了不同的数组
。
matplotlib 示例:
z = numpy.array([0, **0.5, 1,** 0])
这里:
Z1 = numpy.array([0, **1, 0.5**,0])
使用正确的 z
数组,绘图看起来与 matplotlib 示例类似,包括插值以获得更平滑的颜色过渡。
我是一名优秀的程序员,十分优秀!