为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2022-01-18 15:36:38
我有一个从存储在 CSV 文件中的点数据创建的曲面图。如果我想在 3D 中创建的曲面上投影一条线(漂浮在曲面上方)。方法是什么?我尝试了以下帖子中的代码,用于在 xy-xz-yz 平面上投影一条线。我可以看到它在 xy-xz-yz 平面上投影线的端点。如果我想在使用点数据创建的表面上进行投影。我没有表面方程。我已经创建了可用的点数据。这是我想要实现的模型图像: 我已经生成了一个曲面,其中给定的散点存储在 CSV 文件中。现在我想将曲面顶部的线(红线)投影到曲面(作为绿线)。
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

让我们构建一个通用的 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

现在我们为一个表面生成一个 3D 点的集合S(注意它是一个不规则的网格):


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()

//img1.sycdn.imooc.com//61e66e3c000131c902750248.jpg

完整的 3D 结果如下所示:


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)

//img1.sycdn.imooc.com//61e66e4c00012e1803460227.jpg

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


//img1.sycdn.imooc.com//61e66e5900011e6103480225.jpg

查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信