将曲面曲率映射到面?

2024-06-01 01:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将曲面曲率(平均曲率、高斯曲率和主曲率)值映射到曲面面。我已经计算了一个人工生成的三维曲面(例如圆柱体)的曲率值。我试图得到的三维曲面是这样的mean curvature mapped to surface。有人能告诉我怎么弄到这个吗?在

我正在创建的曲面的代码是:

import math import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111, projection='3d') xindex = [] yindex = [] zindex = [] x = [] y = [] z = [] count = 1 surfaceSt = [] import numpy numpy.set_printoptions(threshold=numpy.nan) #surfaceStX = numpy.empty((10,36)) #surfaceStY = numpy.empty((10,36)) #surfaceStZ = numpy.empty((10,36)) surfaceStZ = [] surfaceStX = [] surfaceStY = [] for i in range(1,21): if i < 11: x = [] y = [] z = [] pt = [] ptX = [] ptY = [] ptZ = [] for t in range(0,360,10): x = i*math.sin(math.radians(t)) y = i*math.cos(math.radians(t)) z = i-1 ptX.append(x) ptY.append(y) ptZ.append(z) pt.append([x,y,z]) ptX.append(ptX[0]) ptY.append(ptY[0]) ptZ.append(ptZ[0]) surfaceStX.append(ptX) surfaceStY.append(ptY) surfaceStZ.append(ptZ) # numpy.append(surfaceStX,ptX) # numpy.append(surfaceStY,ptY) # numpy.append(surfaceStZ,ptZ) #ax.scatter(x,y,z) elif i >= 11: x = [] y = [] z = [] pt = [] ptX = [] ptY = [] ptZ = [] for t in range(0,360,10): x = (i-count)*math.sin(math.radians(t)) y = (i-count)*math.cos(math.radians(t)) z = i-1 ptX.append(x) ptY.append(y) ptZ.append(z) pt.append([x,y,z]) ptX.append(ptX[0]) ptY.append(ptY[0]) ptZ.append(ptZ[0]) surfaceStX.append(ptX) surfaceStY.append(ptY) surfaceStZ.append(ptZ) count +=2 X = numpy.array(surfaceStX) Y = numpy.array(surfaceStY) Z = numpy.array(surfaceStZ) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, rstride=1, cstride=1,shade = 'True' ) from surfaceCurvature import surface_curvature Pcurvature,Gcurvature,Mcurvature = surface_curvature(X,Y,Z) plt.show()

我的表面曲率计算如下(由https://github.com/sujithTSR/surface-curvature提供):

编辑1:

我根据armatita提供的链接做了一些尝试。以下是我的代码:

''' Creat half cylinder ''' import numpy import matplotlib.pyplot as plt import math ptX= [] ptY = [] ptZ = [] ptX1 = [] ptY1 = [] ptZ1 = [] for i in range(0,10): x = [] y = [] z = [] for t in range(0,200,20): x.append(10*math.cos(math.radians(t))) y.append(10*math.sin(math.radians(t))) z.append(i) x1= 5*math.cos(math.radians(t)) y1 = 5*math.sin(math.radians(t)) z1 = i ptX1.append(x1) ptY1.append(y1) ptZ1.append(z1) ptX.append(x) ptY.append(y) ptZ.append(z) X = numpy.array(ptX) Y = numpy.array(ptY) Z = numpy.array(ptZ) fig = plt.figure() ax = fig.add_subplot(111,projection = '3d') from surfaceCurvature import surface_curvature p,g,m= surface_curvature(X,Y,Z) n = numpy.reshape(m,numpy.shape(X)) ax.plot_surface(X,Y,Z, rstride=1, cstride=1) plt.show() ''' Map mean curvature to color ''' import numpy as np X1 = X.ravel() Y1 = Y.ravel() Z1 = Z.ravel() from scipy.interpolate import RectBivariateSpline # Define the points at the centers of the faces: y_coords, x_coords = np.unique(Y1), np.unique(X1) y_centers, x_centers = [ arr[:-1] + np.diff(arr)/2 for arr in (y_coords, x_coords)] # Convert back to a 2D grid, required for plot_surface: #Y1 = Y.reshape(y_coords.size, -1) #X1 = X.reshape(-1, x_coords.size) #Z1 = Z.reshape(X.shape) C = m.reshape(X.shape) C -= C.min() C /= C.max() interp_func = RectBivariateSpline(x_coords, y_coords, C.T, kx=1, ky=1)

I get the following error:
raise TypeError('y dimension of z must have same number of y')
TypeError: y dimension of z must have same number of elements as y

所有尺寸都一样。有人能告诉我的实现出了什么问题吗?在


Tags: importnumpyforpltmathcoordsaxsurface
1条回答
网友
1楼 · 发布于 2024-06-01 01:12:21

我想你需要弄清楚你到底需要什么。看看你的代码,我注意到你在生成没有用处的变量。另外,你似乎有一个计算曲面曲率的函数,但是你尝试用np.unique函数进行一些计算,我在这里看不到它的用途(这就是为什么会出现错误)。在

我们假设:

  • 有一个函数可以返回每个单元的曲率值。在
  • 可以使用X、Y和Z网格来绘制该曲面。在

使用您的代码,假设您的m变量是曲率(同样在您的代码中),如果我这样做:

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import math

# Here would be the surface_curvature function

X = numpy.array(ptX)
Y = numpy.array(ptY)
Z = numpy.array(ptZ)   
p,g,m= surface_curvature(X,Y,Z)
C = m.reshape(X.shape)

C -= C.min()
C /= C.max() 

fig = plt.figure()
ax = fig.add_subplot(111,projection = '3d')
n = numpy.reshape(m,numpy.shape(X))
ax.plot_surface(X,Y,Z,facecolors = cm.jet(C), rstride=1, cstride=1)
plt.show()

,我得到这个:

Value mapped to color in matpotlib surface

它是映射到matplotlib曲面中颜色的值。如果你建立的C不是实际的曲率,你需要用它来代替它。在

相关问题 更多 >