Пересечение плоскости спирали - PullRequest
0 голосов
/ 28 декабря 2018

Как я могу использовать (изменить) код Python, чтобы найти пересечение спирали (x = Rcos (t), y = Rsin (t), z = a * t) с плоскостью (n - вектор нормали к плоскости и p0- точка на самолете)?Благодарю.В посте ' 3D Пересечение линии-плоскости ' есть ответы, как сделать это для линии, определяемой двумя точками, но мне нужно решение для спирали.

1 Ответ

0 голосов
/ 28 декабря 2018

Вам нужно будет решить уравнение (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))

Может произойти сбой, если ось спирали находится в плоскости (в этом случае ваша задача все равно плохо определена), и она не очень эффективна.

...