python - 螺旋平面相交
问题描述
如何使用(修改)Python代码找到螺旋线(x = Rcos(t),y = Rsin(t),z = a * t)与平面(n - 平面的法线向量和p0 - 点的交点)飞机)?谢谢。在后“ 3D Line-Plane Intersection ”中有答案如何为由两点定义的线做这样的事情,但我需要螺旋线的解决方案。
解决方案
您需要求解方程 (h(t)-p0).n = 0,其中 h(t) 是您的螺旋。
该方程不允许简单的解析解,但您可以用数值求解它,例如 scipy:
import numpy as np
from scipy import optimize
n = np.array([nx, ny, nz])
p0 = np.array([p0x, p0y, p0z])
def h(t):
return np.array([R*np.cos(t), R*np.sin(t), a*t])
res = optimize.minimize_scalar(lambda t: np.dot(h(t) - p0, n))
print(res.x)
如果没有 scipy/numpy,在这种特定情况下实现牛顿法相对容易(我们可以解析计算 h(t) 的导数)。纯python版本:
from math import cos, sin
n = [nx, ny, nz]
p0 = [p0x, p0y, p0z]
def dot(a, b):
return sum([x*y for x, y in zip(a, b)])
def h(t):
return [R*cos(t), R*sin(t), a*t]
def hp(t): # the derivative of h
return [-R*sin(t), R*cos(t), a]
def find_root_newton(x, f, fp, epsilon=1e-5):
xn = x + 2*epsilon
while(abs(xn - x) > epsilon):
x = xn
xn = x - f(x)/fp(x)
return xn
t = find_root_newton(0., lambda t: dot(h(t), n) - dot(p0, n),
lambda t: dot(hp(t), n))
print(h(t))
如果螺旋的轴在平面上,它可能会失败(在这种情况下,无论如何你的问题定义不好),而且效率不高。
推荐阅读
- mysql - 如何使用 select 语句显示引用相同外键的 2 个不同外键?
- c - 为什么 `isnan` 返回 0 的长双设置为 NAN?
- python - 气流无法导入气流.providers
- android - 通过 adb android 查找哪个应用程序/包正在使用 wifi 数据
- r - 如何在 R 中的两列中打印大量 ggplot 图形而不使它们变平?
- java - Java r2dbc 客户端执行 sql 并使用返回的 id 进行下一次执行
- google-cloud-firestore - 我可以在不取消订阅的情况下修改 QuerySnapshot 侦听器吗?
- oracle - 如何将 ref_cursor 与用户定义的函数一起使用?
- r - 如何生成系列指标?
- css - 是否可以在 transform:scale() 中使用 calc()?