Python 如何使用matplotlib沿点(x1,y1)和(x2,y2)的长度以指定半径绘制圆柱体?

Python 如何使用matplotlib沿点(x1,y1)和(x2,y2)的长度以指定半径绘制圆柱体?,python,matplotlib,Python,Matplotlib,我想使用matplotlib沿着点(x1,y1)和(x2,y2)的长度绘制一个圆柱体,并指定半径r。请告诉我怎么做。为了好玩,我将把它推广到任意轴(x0,y0,z0)到(x1,y1,z1)。如果需要xy平面中的轴,请将z0和z1设定为0 通过在与轴相同的方向上找到单位向量,然后将其添加到p0并沿轴的长度缩放,可以很容易地找到轴的向量方程。通常你可以找到一个x=x0+cos(θ)*R和y=y0+sin(θ)*R的圆的坐标,但是这些圆不在xy平面上,所以我们需要用单位向量制作我们自己的轴,使其与圆柱

我想使用matplotlib沿着点(x1,y1)和(x2,y2)的长度绘制一个圆柱体,并指定半径r。请告诉我怎么做。

为了好玩,我将把它推广到任意轴(x0,y0,z0)到(x1,y1,z1)。如果需要xy平面中的轴,请将z0和z1设定为0

通过在与轴相同的方向上找到单位向量,然后将其添加到p0并沿轴的长度缩放,可以很容易地找到轴的向量方程。通常你可以找到一个x=x0+cos(θ)*R和y=y0+sin(θ)*R的圆的坐标,但是这些圆不在xy平面上,所以我们需要用单位向量制作我们自己的轴,使其与圆柱体的轴相互垂直,然后从中得到xyz坐标。我使用此网站来帮助我解决这个问题:。代码如下:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.linalg import norm

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
origin = np.array([0, 0, 0])
#axis and radius
p0 = np.array([1, 3, 2])
p1 = np.array([8, 5, 9])
R = 5
#vector in direction of axis
v = p1 - p0
#find magnitude of vector
mag = norm(v)
#unit vector in direction of axis
v = v / mag
#make some vector not in the same direction as v
not_v = np.array([1, 0, 0])
if (v == not_v).all():
    not_v = np.array([0, 1, 0])
#make vector perpendicular to v
n1 = np.cross(v, not_v)
#normalize n1
n1 /= norm(n1)
#make unit vector perpendicular to v and n1
n2 = np.cross(v, n1)
#surface ranges over t from 0 to length of axis and 0 to 2*pi
t = np.linspace(0, mag, 100)
theta = np.linspace(0, 2 * np.pi, 100)
#use meshgrid to make 2d arrays
t, theta = np.meshgrid(t, theta)
#generate coordinates for surface
X, Y, Z = [p0[i] + v[i] * t + R * np.sin(theta) * n1[i] + R * np.cos(theta) * n2[i] for i in [0, 1, 2]]
ax.plot_surface(X, Y, Z)
#plot axis
ax.plot(*zip(p0, p1), color = 'red')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)
plt.show()

圆柱体只是堆叠的圆。。。你可以用
x,y=center\ux+cos(angle)*半径,center\uy+sin(angle)*半径来计算圆的边缘点
我们能让这个两端有两个不同半径的圆柱体吗?不,因为这样它会是一个平截头体,而不是圆柱体。如果你想这样做,你需要R作为t的函数线性变化,当t=0时R=R1,当t=轴的长度时R=R2。正如我所理解的这个函数,你可以提供函数
R\u在位置(xi)
离散任意子午线。席是您用来定义代码> P0</代码>和<代码> P1<代码>的全局系统中的坐标。然后定义X,Y,Z为
X,Y,Z=[p0[i]+v[i]*t+[R_在_位置(xi=X)对于t[0]]*np.sin(θ)*n1[i]+[R_在_位置(xi=X)对于t[0]]*np.cos(θ)*n2[i]对于[0,1,2]
。这将使函数能够绘制以
p0
p1
为方向的任何旋转曲面。