gpt4 book ai didi

python - 用两个物体做螺旋

转载 作者:行者123 更新时间:2023-12-03 14:31:35 26 4
gpt4 key购买 nike

我有一个平面和一条正弦曲线。请问如何旋转这两个对象?我的意思是让平面在 -0.1 到 0.4 的区间内缓慢倾斜,以便例如在 0.4 点垂直于 z?经过较长时间的旋转,平面和正弦的最大值和最小值将构建“圆柱的表面,轴从点[0,-0.1,0]到点[0,0.4,0]”。我希望我的意思很清楚。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import proj3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

plane1 = -0.1
plane2 = 0.4
h = 0.03

# Plane
xp = np.array([[0, 0], [0, 0]])
yp = np.array([[plane1, plane2], [plane1, plane2]])
zp = np.array([[-h, -h], [h, h]])

ax.plot_surface(xp, yp, zp, alpha=0.4, color = 'red')

# Sine
f = 100
amp = h
y = np.linspace(plane1, plane2, 5000)
z = amp*np.sin(y*f)
ax.plot(y, z, zdir='x')

plt.show()
enter image description here
所需的结果是由以下形状的正弦曲线填充的平面:
enter image description here
但没有那么旋转,整个间隔 30° 就足够了。

最佳答案

要回答标题问题,要创建螺旋,您正在寻找 a simple 3D function :

amp, f = 1, 1
low, high = 0, math.pi*20
n = 1000

y = np.linspace(low, high, n)
x = amp*np.cos(f*y)
z = amp*np.sin(f*y)

ax.plot(x,y,z)
这给出:
A helix
自己找到这个的一种方法是思考:从每个方向看它是什么样子?在 y/z 平面上制作二维图,您会看到 cos 图,而在 y/x 平面上制作二维图,您会看到正弦图。在 x/z 平面中的 2D 图形您会看到一个圆圈。这会告诉您有关 3D 功能的所有信息!

如果你真的想在 3D 空间中旋转正弦波的图像,它会变得复杂。此外,它不会像您期望的那样创建螺旋,因为您尝试创建的“圆柱”的半径会随着 y 值的变化而变化。但是,既然你问如何进行旋转......
您将要使用 affine transformation矩阵。单个旋转可以表示为 4x4 矩阵,您可以将矩阵乘以齐次坐标以找到结果点。 (有关这方面的插图,请参见链接)
rotate_about_y = np.array([
[cos(theta), 0, sin(theta), 0],
[0, 1, , 0],
[-sin(theta), 0, cos(theta), 0],
[0, 0, 0, 1],
])
然后,要将其应用于整个点列表,您可以执行以下操作:
# Just using a mathematical function to generate the points for illustation
low, high = 0, math.pi*16
n = 1000

y = np.linspace(low, high, n)
x = np.zeros_like(y)
z = np.cos(y)
xyz = np.stack([x, y, z], axis=1) # shaped [n, 3]


min_rotation, max_rotation = 0, math.pi*16
homogeneous_points = np.concatenate([xyz, np.full([n, 1], 1)], axis=1) # shaped [n, 4]
rotation_angles = np.linspace(min_rotation, max_rotation, n)
rotate_about_y = np.zeros([n, 4, 4])
rotate_about_y[:, 0, 0] = np.cos(rotation_angles)
rotate_about_y[:, 0, 2] = np.sin(rotation_angles)
rotate_about_y[:, 1, 1] = 1
rotate_about_y[:, 2, 0] = -np.sin(rotation_angles)
rotate_about_y[:, 2, 2] = np.cos(rotation_angles)
rotate_about_y[:, 3, 3] = 1

# This broadcasts matrix multiplication over the whole homogeneous_points array
rotated_points = (homogeneous_points[:, None] @ rotate_about_y).squeeze(1)
# Remove tacked on 1
new_points = rotated_points[:, :3]

ax.plot(x, y, z)
ax.plot(new_points[:, 0], new_points[:, 1], new_points[:, 2])
对于这种情况(其中 low == min_rotationhigh == max_rotation ),你会得到一个螺旋状结构,但是,正如我所说,它被我们绕 y 轴旋转的事实扭曲了,函数去 y=0 .
Rotated points
注: @ numpy 中的符号表示“矩阵乘法”。 “同质点”就是最后加1的点;我不会深入探讨为什么他们会成功,但他们确实做到了。
注意#2:上面的代码假设您要绕 y 轴旋转(即绕线 x=0, z=0)。如果要绕不同的线旋转,则需要组合转换。我不会在这里过多介绍,但过程大致是:
  • 变换点,使要绕其旋转的线映射到 y 轴
  • 执行上述转换
  • 执行此列表中第一个变换的逆运算

  • 您可以通过将每个变换相互乘以矩阵来组合它们。
    Here's a document I found这解释了仿射变换矩阵的工作原理和原因。但是,有很多关于这个主题的信息。

    关于python - 用两个物体做螺旋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64686981/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com