Необходимо соединить 2 произвольные точки в пространстве синусоидой

Есть 2 произвольные точки в пространстве, которые образуют линию Пример

Необходимо соединить их синусоидой, чтобы получилось что-то подобное

Пример 2 Пример 3

Еще нужно чтобы колебания синусоиды были параллельны оси X или Z относительно прямой Помогите пожалуйста, уже 4 день сижу с этим

Один из вариантов - получить углы вращения вектора, затем применить их к точке

import numpy
from math import sin, cos, radians
import math

start = (1, 1, 1)
end = (6, 8, 5)

vec_ = numpy.array([5, 7, 0])

def rotate_z (vec, rad):
    mat = numpy.array(
        [
            [sin(rad), -sin(rad), 0],
            [sin(rad), cos(rad), 0],
            [0, 0, 1]
        ]
    )

    return mat * vec

def rotate_x (vec, rad):
    mat = numpy.array([
        [1, 0, 0],
        [0, cos(rad), -sin(rad)],
        [0, sin(rad), cos(rad)]
    ])

    return mat* vec

def rotate_y (vec, rad):
    mat = numpy.array([
        [cos(rad), 0, sin(rad)],
        [0, 1, 0],
        [-sin(rad), 0, cos(rad)]
    ])

    return mat* vec

def dot (vec1, vec2):
    return vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2]

def length (vec1):
    return math.sqrt(
        math.pow(vec1[0], 2) +
        math.pow(vec1[1], 2) +
        math.pow(vec1[2], 2)
    )

def calc_angle (vec1, vec2):
    return math.acos(dot(vec1, vec2) / (length(vec1) * length(vec2)))

rx = calc_angle(vec_, numpy.array([1, 0, 0]))
ry = calc_angle(vec_, numpy.array([0, 1, 0]))
rz = calc_angle(vec_, numpy.array([0, 0, 1]))

print(rx)
print(ry)
print(rz)

temp = rotate_x((2, -1, 0), rx)[0]
temp = rotate_y(temp, ry)
print(rotate_z(temp, rz)[0])

Ответы (0 шт):