如何在z=f(x,y)曲面上标记xy平面等高线g(x,y)=c的正上方点?
实现方法说明
你的思路完全可行,但Python里有更简洁的实现方式,不用手动逐个收集点存列表,下面分两种场景给出具体方案:
一、从已绘制的等高线提取点映射到曲面
如果已经用matplotlib绘制了xy平面的g(x,y)=c等高线,可以直接从等高线对象里提取路径顶点,计算对应曲面的z值后绘制:
import matplotlib.pyplot as plt import numpy as np # 先定义你的函数f和g,以及参数c def f(x, y): return x**2 + y**2 # 示例函数,替换成你的实际函数 def g(x, y): return x**2 - y**2 # 示例函数,替换成你的实际函数 c = 0 # 示例约束值,替换成你的c # 生成网格数据 x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z_f = f(X, Y) Z_g = g(X, Y) # 创建3D绘图对象 fig = plt.figure() ax = fig.add_subplot(projection='3d') # 绘制原始3D曲面 ax.plot_surface(X, Y, Z_f, alpha=0.5, cmap='viridis') # 提取g(x,y)=c的等高线路径 contour_obj = ax.contour(X, Y, Z_g, levels=[c], colors='red') # 遍历每条等高线(如果有多条的话) for path in contour_obj.collections[0].get_paths(): # 获取等高线上的(x,y)坐标 vertices = path.vertices x_contour = vertices[:, 0] y_contour = vertices[:, 1] # 计算对应曲面的z值 z_contour = f(x_contour, y_contour) # 绘制曲面上方的约束路径(线) ax.plot3D(x_contour, y_contour, z_contour, color='blue', linewidth=2) # 如果需要标记离散点,用scatter3D # ax.scatter3D(x_contour, y_contour, z_contour, color='black', s=15) plt.show()
二、直接生成约束曲线的点(适用于解析形式的g(x,y)=c)
如果g(x,y)=c是有明确参数方程的曲线(比如圆、椭圆、直线),可以直接生成曲线上的点,再映射到曲面,这种方式更精准:
# 示例:g(x,y)=x²+y²=4(半径2的圆) c = 4 theta = np.linspace(0, 2*np.pi, 100) x_contour = np.sqrt(c) * np.cos(theta) y_contour = np.sqrt(c) * np.sin(theta) z_contour = f(x_contour, y_contour) # 在已有的3D图上绘制这条约束路径 ax.plot3D(x_contour, y_contour, z_contour, color='green', linewidth=2)
关于“反向投影”的说明
Python绘图库没有专门的“反向投影”命令,但上面的方法本质就是把2D等高线的点映射到3D曲面上,逻辑简单且代码量小,完全满足你的需求。
内容的提问来源于stack exchange,提问作者abstract_je
相关产品推荐
相关产品推荐

