如何在 python 中找到曲面和线之间的交点?
How to find an intersection between a surface and a line in python?
我有一个由 x 和 y 值列表定义的表面,并为其指定了高度。连续表面是用样条方法构建的,所以最后我得到了所有可能的高度 (x,y)。我还有一个点和单位向量(从那个点导出)。我需要的是找到线(由该单位向量构成)击中我的表面的点。我在构建那条线(我不确定是否有必要)和找到最快的交叉路口时遇到了麻烦。谢谢你的帮助。
编辑
这是我的坐标示例和建议我写的 以拥有我的表面。
Z=[]
Z.append([20.2, 20.1, 35])
Z.append([20.1, 24.5, 36])
Z.append([21.0, 23.2, 33])
Z.append([22.3, 20.0, 34])
Z.append([22.3, 19.5, 28])
Z.append([20.1, 19.5, 27])
Z.append([20.1, 24.6, 31])
Z.append([22.3, 24.6, 32])
# ---------------------------
xin=np.array(Z)[:,0];
yin=np.array(Z)[:,1];
zin=np.array(Z)[:,2];
# ----------------------------
xout=np.linspace(20.,23.,10);
yout=np.linspace(19.,25.,10);
xout,yout = np.meshgrid(xout,yout);
# ----------------------------
zout=griddata((xin,yin),zin,(xout,yout),'cubic');
# -----------------------------
from pylab import pcolormesh,show
pcolormesh(xout,yout,zout);show();
假设我有一个点 (21.0, 20.0, 60),它向北旋转 9 度,向东旋转 2 度(这里 21.0 代表经度,20.0 - 纬度,60 - 高度)。
这不是一个简单的问题。
看起来,您的插值是分段的,大概是在三角剖分上定义的(如果不是,请说明)。
如果你知道插值的表达式,大概是三次多项式,你可以确定每个图块上取值的范围(你需要找到内部的固定点,边缘的固定点和角落的值).
这为每个面片创建了一个包围体,表面被垂直的、不重叠的棱镜包裹。
现在,对于给定的光线,您将其投射到 XY 平面上,并查看它穿过哪个棱镜底面。如果底边是凸多边形,它将沿着一条线段穿过它们。对于入口点和出口点,计算 Z 值(沿射线)并检查是否与补丁的 Z 范围重叠。
最后,找到命中后,求解由射线的参数方程和表面的显式方程组成的系统。在三次曲面的情况下,这给出了三次多项式,其解析公式可用。最多可以有三个解决方案。
您应该从源头开始追踪光线,并在找到解决方案后立即停止(如果同一块中有多个交叉点,请保持接近源头)。
我有一个由 x 和 y 值列表定义的表面,并为其指定了高度。连续表面是用样条方法构建的,所以最后我得到了所有可能的高度 (x,y)。我还有一个点和单位向量(从那个点导出)。我需要的是找到线(由该单位向量构成)击中我的表面的点。我在构建那条线(我不确定是否有必要)和找到最快的交叉路口时遇到了麻烦。谢谢你的帮助。
编辑
这是我的坐标示例和建议我写的
Z=[]
Z.append([20.2, 20.1, 35])
Z.append([20.1, 24.5, 36])
Z.append([21.0, 23.2, 33])
Z.append([22.3, 20.0, 34])
Z.append([22.3, 19.5, 28])
Z.append([20.1, 19.5, 27])
Z.append([20.1, 24.6, 31])
Z.append([22.3, 24.6, 32])
# ---------------------------
xin=np.array(Z)[:,0];
yin=np.array(Z)[:,1];
zin=np.array(Z)[:,2];
# ----------------------------
xout=np.linspace(20.,23.,10);
yout=np.linspace(19.,25.,10);
xout,yout = np.meshgrid(xout,yout);
# ----------------------------
zout=griddata((xin,yin),zin,(xout,yout),'cubic');
# -----------------------------
from pylab import pcolormesh,show
pcolormesh(xout,yout,zout);show();
假设我有一个点 (21.0, 20.0, 60),它向北旋转 9 度,向东旋转 2 度(这里 21.0 代表经度,20.0 - 纬度,60 - 高度)。
这不是一个简单的问题。
看起来,您的插值是分段的,大概是在三角剖分上定义的(如果不是,请说明)。
如果你知道插值的表达式,大概是三次多项式,你可以确定每个图块上取值的范围(你需要找到内部的固定点,边缘的固定点和角落的值).
这为每个面片创建了一个包围体,表面被垂直的、不重叠的棱镜包裹。
现在,对于给定的光线,您将其投射到 XY 平面上,并查看它穿过哪个棱镜底面。如果底边是凸多边形,它将沿着一条线段穿过它们。对于入口点和出口点,计算 Z 值(沿射线)并检查是否与补丁的 Z 范围重叠。
最后,找到命中后,求解由射线的参数方程和表面的显式方程组成的系统。在三次曲面的情况下,这给出了三次多项式,其解析公式可用。最多可以有三个解决方案。
您应该从源头开始追踪光线,并在找到解决方案后立即停止(如果同一块中有多个交叉点,请保持接近源头)。