螺旋平面相交

时间:2018-12-28 17:18:15

标签: python intersection curve plane

如何使用(修改)Python代码查找螺旋线(x = Rcos(t),y = Rsin(t),z = a * t)与平面的交点(n-平面和p0的法线向量-点上飞机)?谢谢。 在帖子“ 3D Line-Plane Intersection中,有关于如何对由两点定义的线进行处理的答案,但是我需要解决螺旋问题。

1 个答案:

答案 0 :(得分:1)

您需要求解方程(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,则在这种特定情况下实施Newton method相对容易(我们可以分析地计算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))

如果螺旋线的轴在平面中,则可能会失败(在这种情况下,您的问题定义得很糟),而且效率并不高。