三维python中直线与曲面的交点
我希望能够找到直线和三维曲面之间的交点 从数学上讲,我通过以下步骤实现了这一点:三维python中直线与曲面的交点,python,line,intersection,surface,Python,Line,Intersection,Surface,我希望能够找到直线和三维曲面之间的交点 从数学上讲,我通过以下步骤实现了这一点: 以参数化方式定义直线的(x、y、z)坐标。e、 g.(x,y,z)=(1+t,2+3t,1-t) 将曲面定义为函数。e、 g.z=f(x,y) 将直线中的x、y和z值替换为曲面函数 通过求解,我可以得到曲面和直线的交点 我想知道在Python中是否有这样做的方法。我也愿意听取关于解决交叉口问题的更简单方法的建议。您可以使用以下代码: 将numpy导入为np 导入scipy作为sc 导入scipy.optimize
我想知道在Python中是否有这样做的方法。我也愿意听取关于解决交叉口问题的更简单方法的建议。您可以使用以下代码:
将numpy导入为np
导入scipy作为sc
导入scipy.optimize
从matplotlib导入pyplot作为plt
定义f(x,y):
“曲面的功能”
#示例方程
z=x**2+y**2-10
返回z
p0=np.数组([1,2,1])#线的起点
方向=np.数组([1,3,-1])#方向向量
def管路功能(t):
直线的函数。
:param t:直线的曲线参数
:以数组“”的形式返回xyz值
返回p0+t*方向
def目标函数(t):
“”“将由fmin最小化的函数”
:param t:直线的曲线参数
:返回:(z_线(t)-z_面(t))**2–这是零
在交点处“
p_线=线函数(t)
z_面=f(*p_线[:2])
返回np.sum((p_线[2]-z_面)**2)
t_opt=sc.optimize.fmin(目标函数,x0=-10)
交点=直线函数(t选项)
其主要思想是将代数方程point\u of_line=point\u of_surface
(相交条件)转化为一个最小化问题:| point_of_line-point_of|surface |→ 最小值
。由于曲面表示为z_surface=f(x,y)
,因此仅根据z值计算给定t
-值的距离很方便。这是在target_func(t)
中完成的。然后通过fmin
找到最佳t
-值
可通过一些绘图检查结果的正确性和合理性:
从mpl_toolkits.mplot3d导入Axes3D
ax=plt.子地块(投影=3d')
X=np.linspace(-5,5,10)
Y=np.linspace(-5,5,10)
tt=np.linspace(-5,5100)
二十、 YY=np.网格(X,Y)
ZZ=f(XX,YY)
ax.plot_线框(XX,YY,ZZ,zorder=0)
LL=np.array([line_func(t)表示tt中的t])
轴图(*LL.T,color=“橙色”,zorder=10)
轴图([x]、[y]、[z]、“o”、color=“red”、ms=10、zorder=20)
请注意,线框和线图的这种组合处理不好,橙色线的哪一部分应位于曲面的蓝色线以下
还要注意,对于这种类型的问题,可能有从0到0的任意数量的解决方案+∞. 这取决于实际曲面
fmin
查找局部最优,这可能是目标函数(t_opt)=0的全局最优,也可能不是。更改初始猜测值x0
可能会更改fmin
找到的局部最优值。欢迎使用堆栈溢出!你有没有试过的代码?任何代码都会让社区更快地回答你的问题。不,我试过了,但没能做到。所谓“不能做到”,你是说你不能将代码格式化成你的问题,还是说你不能想出解决方案?即使它不能完全工作,代码示例也可以作为其他人的提纲。否则,他们对这个问题的理解就比你要晚。谢谢你的回答,你能解释一下这个函数,即target_func(t)。这并不难<代码>行函数是该行的函数。传入t,它返回时间t的(x,y,z)位置f
是曲面的函数。传入(x,y),它返回ztarget_func
返回从时间t
的直线到曲面的z距离,这有点欺骗,因为最近的点可能不在z轴的正上方,但如果它们相交,这就行了。@TimRoberts感谢您的快速回复抱歉我有optimize.fmin的官方文档有很多参数,其中t在代码t_opt=sc.optimize.fmin(target_func,-10)行中是什么,t在代码t_func(t)和target_func(t)行中传递了什么,以及如何找到相交的精确坐标我不应该责备,但cknoll的代码完全基于您的规范。您希望该行基于t
参数化。因此,我不知道你怎么会对t
的意思感到困惑,除非你没有在描述中真正写下步骤。