Плохая автоматическая триангуляция с Mayavi для окраски поверхности, известной только ее углом

Я пытаюсь окрасить поверхность, известную только своим углом в соответствии с ее значением Y с Mayavi. Оригинал, II удается сделать то же самое с matplotlib ( здесь ), но я вернул эту каноническую информацию на мои настоящие данные, рендеринга было недостаточно, и поэтому я сейчас пытаюсь с Mayavi. Я нашел пример из Surface из примера нерегулярных данных, что весьма полезно. Однако при применении к моему делу, воспроизведя здесь в этом простом случае, триангуляция становится неправильной, как видно на рисунке ниже для левой поверхности, с двумя нижними треугольниками вместо верхнего и нижнего треугольников, как для правой поверхности.

введите описание изображения здесь

Я полагаю, что он исходил из положения вторых 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() 

2 Solutions collect form web for “Плохая автоматическая триангуляция с Mayavi для окраски поверхности, известной только ее углом”

Вы используете разные arrays по сравнению с вашим примером matplotlib.

Пример matplotlib:

  z = numpy.array([0, **0.5, 1,** 0]) 

Вот:

  Z1 = numpy.array([0, **1, 0.5**,0]) 

С правильным z массивом график похож на ваш пример matplotlib, включая интерполяцию, чтобы добиться более плавного перехода цвета.

Функция mlab.pipeline.delaunay2d вычисляет двумерную триангуляцию mlab.pipeline.delaunay2d множества точек. Это означает, что созданные треугольники зависят только от координат X и Y точек, игнорируют Z.

Насколько я понял, две триангуляции, которые вы получаете, являются ожидаемыми. Возможно, в вашем втором наборе данных была опечатка, и это объясняет, почему вы удивлены. Вы имели в виду следующее?

 X2 = numpy.array([0, 0, 1, 1]) Y2 = numpy.array([-0.5, -0.75, -1, -0.5]) Z2 = numpy.array([0, 1, 0.5,0]) 

Разница заключается в второй координате Y2 которая равна -0.75 вместо -0.45 .

Python - лучший язык программирования в мире.