python - Python - 如何在表面离散3D点(x,y,z)之后从给定的x,y获取z值
问题描述
我是 Python 的新手。我正在使用块代码从离散的 3D 点绘制曲面作为下面的块代码:
#!/usr/bin/python3
import sys
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from scipy import array, newaxis
DATA = array([
[-0.807237702464, 0.904373229492, 111.428744443],
[-0.802470821517, 0.832159465335, 98.572957317],
[-0.801052795982, 0.744231916692, 86.485869328],
[-0.802505546206, 0.642324228721, 75.279804677],
[-0.804158144115, 0.52882485495, 65.112895758],
[-0.806418040943, 0.405733109371, 56.1627277595],
[-0.808515314192, 0.275100227689, 48.508994388],
[-0.809879521648, 0.139140394575, 42.1027499025],
[-0.810645106092, -7.48279012695e-06, 36.8668106345],
[-0.810676720161, -0.139773175337, 32.714580273],
[-0.811308686707, -0.277276065449, 29.5977405865],
[-0.812331692291, -0.40975978382, 27.6210856615],
[-0.816075037319, -0.535615685086, 27.2420699235],
[-0.823691366944, -0.654350489595, 29.1823292975],
[-0.836688691603, -0.765630198427, 34.2275056775],
[-0.854984518665, -0.86845932028, 43.029581434],
[-0.879261949054, -0.961799684483, 55.9594146815],
[-0.740499820944, 0.901631050387, 97.0261463995],
[-0.735011699497, 0.82881933383, 84.971061395],
[-0.733021568161, 0.740454485354, 73.733621269],
[-0.732821755233, 0.638770044767, 63.3815970475],
[-0.733876941678, 0.525818698874, 54.0655910105],
[-0.735055978521, 0.403303715698, 45.90859502],
[-0.736448900325, 0.273425879041, 38.935709456],
[-0.737556181137, 0.13826504904, 33.096106049],
[-0.738278724065, -9.73058423274e-06, 28.359664343],
[-0.738507612286, -0.138781586244, 24.627237837],
[-0.738539663773, -0.275090412979, 21.857410904],
[-0.739099040189, -0.406068448513, 20.1110519655],
[-0.741152200369, -0.529726022182, 19.7019157715],
])
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)
ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))
fig.tight_layout()
plt.show()
现在我想从任何 X 和 Y 中获取 Z 值,例如 z = f(x,y) 但我不知道该怎么做。任何人都有解决方案来帮助我。
太感谢了。
解决方案
如果你想把这个点数组变成一个输入 x,y 和输出 z 的连续函数,你需要用一个模型来描述它。模型允许对点进行插值。
我假设这个点数组描述了一个曲面图,但绘制它是不必要的。
表面图看起来像这样(我只能提供链接): 表面图
曲面图中的每个四边形由 4 个点定义,代表平面的一部分。因此,描述您的数组的函数将是构成您的曲面图的所有不同平面的分段。
一个平面需要 3 个点来定义它,因此创建一个函数来遍历数组,依次选择 3 个点,找到平面的方程,然后将其添加到方程数组中。
给定 3 点的代码来查找方程:
def equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3):
a1 = x2 - x1
b1 = y2 - y1
c1 = z2 - z1
a2 = x3 - x1
b2 = y3 - y1
c2 = z3 - z1
a = b1 * c2 - b2 * c1
b = a2 * c1 - a1 * c2
c = a1 * b2 - b1 * a2
d = (- a * x1 - b * y1 - c * z1)
print "equation of plane is ",
print a, "x +",
print b, "y +",
print c, "z +",
print d, "= 0."
然后对于给定的 x 和 y 找出哪个平面包含这些 x 和 y 点(使用类似于 nils werners 答案的代码),得到相应的方程并使用该函数得到 z 坐标。
推荐阅读
- r - R Shiny 一准备好就异步渲染图
- swift - 为 PaintCode 代码创建的 UIButton 添加高亮效果
- c++ - 在地图中查找唯一值
>? - symfony - Symfony 4 swiftmailer 配置问题
- java - 保护Tomcat中的子目录
- algorithm - 您如何将交易或不交易的可能案例选择表示为 ADT?
- html - 如何在 Bootstrap 4 jumbotron 下删除空白
- macos - 0curl:(7)无法连接到服务器
- c# - HttpClient.PostAsync continueWith 未执行
- javascript - 从数据表对象获取列 mData 键