如何在曲面图上投影一条线?

3

我有一个基于CSV文件中的点数据创建的曲面图。如果我想将浮在曲面上方的一条线投影到3D中创建的曲面上,应该如何操作?

我尝试了此文章中的代码来在xy-xz-yz平面上投影一条线。
我可以看到它是在xy-xz-yz平面上投影线的终点。

如果我想要在使用可用点数据创建的曲面上投影线条,但我没有曲面的方程式。

这是我想实现的样子:
enter image description here
我已经使用给定的散点数据生成了一个曲面。现在我想将线(red line)投影到曲面上(作为绿线)。

1个回答

4

让我们先构建一个通用的 MCVE,首先导入所需的包:

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import matplotlib.tri as mtri
np.random.seed(123456) # Fix the random seed

现在我们为一个表面S(注意它是一个不规则网格)生成一个3D点的集合:
NS = 100
Sx = np.random.uniform(low=-1., high=1., size=(NS,))
Sy = np.random.uniform(low=-1., high=1., size=(NS,))
Sz = -(Sx**2 + Sy**2) + 0.1*np.random.normal(size=(NS,))

还有一个参数曲线P

NP = 100
t = np.linspace(-1, 1, NP)
Px = t
Py = t**2 - 0.5
Pz = t**3 + 1

解决你的问题的关键是使用LinearNDInterpolator,该函数可以在N维空间中执行分段线性插值。
PSz = interpolate.LinearNDInterpolator(list(zip(Sx, Sy)), Sz)(list(zip(Px,Py)))

只需要将数据重新塑造以适应方法签名,从分离的向量转换为形状为(Nsample,Ndims)的矩阵即可。

list(zip(Sx, Sy))

我们可以从顶部检查数据:
tri = mtri.Triangulation(Sx, Sy)
fig, axe = plt.subplots()
axe.plot(Sx, Sy, '+')
axe.plot(Px, Py)
axe.triplot(tri, linewidth=1, color='gray')
axe.set_aspect('equal')
axe.grid()

在此输入图像描述

下面展示完整的三维结果:

axe = plt.axes(projection='3d')
axe.plot_trisurf(tri, Sz, cmap='jet', alpha=0.5)
axe.plot(Px, Py, Pz)
axe.plot(Px, Py, PSz, linewidth=2, color='black')
axe.scatter(Sx, Sy, Sz)
axe.view_init(elev=25, azim=-45)

enter image description here

axe.view_init(elev=75, azim=-45)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接