“汽缸”;削减;python中的球体

“汽缸”;削减;python中的球体,python,matplotlib,geometry,Python,Matplotlib,Geometry,由于我不能很好地手工绘制,我使用python/matplotlib绘制球体和圆柱体,而不是“剪切”并绘制曲线。 这个圆柱体有一个方程式 x^2+y^2-a*x=0 球体由以下等式完成: x^2+y^2+z^2=a^2 我输入a并用 # -*- coding: utf-8 -*- from numpy import* import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import

由于我不能很好地手工绘制,我使用python/matplotlib绘制球体和圆柱体,而不是“剪切”并绘制曲线。 这个圆柱体有一个方程式

x^2+y^2-a*x=0

球体由以下等式完成:

x^2+y^2+z^2=a^2

我输入a并用

# -*- coding: utf-8 -*-
from numpy import*
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax=Axes3D(fig)
a=input('a? ')
u,v=mgrid[0:2*pi:20j,0:pi/2:10j]
x=a*cos(u)*sin(v)
y=a*sin(u)*sin(v)
z=a*cos(v)
ax.plot_wireframe(x,y,z,color='b')
ax.set_xlabel("x"); ax.set_ylabel("y"); ax.set_zlabel("z")
plt.show()
plt.close()
现在我想画圆柱体,如果可以的话,画两个图形相交的曲线。。。但是不知道


我想我忘了说这是xyz坐标的第一部分(都是正的)

圆柱体的等效参数方程是

x = b * sin(u) + xoff
y = b * cos(u) + yoff
z = v
假设您需要不同的半径和原点

我真的不明白你想要得到什么作为输出。大概不是两个曲面的交点——这是一条曲线(我本以为球形楔块是实心形状),你能用blender做你想做的吗

编辑-偏移

您可以将曲线创建为沿这些线计算的点阵列(这些图片是您想要的吗?)

EDIT2-只需查看您的代码,并注意到一些小问题,例如没有生成完整的球体。无论如何,这里有一个开始-你需要过滤掉负数的平方根,在对象不相交的地方

...
u,v=mgrid[0:2*pi:50j,0:pi:25j]

a1 = input('a1? ')
x1 = a1 * cos(u) * sin(v)
y1 = a1 * sin(u) * sin(v)
z1 = a1 * cos(v)
ax.plot_wireframe(x1, y1, z1, color='b')

a2 = input('a2? ')
xoff = input('offset? ')
x2 = a2 * cos(u) + xoff
y2 = a2 * sin(u)
z2 = (v - pi/2) * a1 / (pi/2)
ax.plot_wireframe(x2, y2, z2, color='g')

x3 = a2 * cos(u[:,0]) + xoff
y3 = a2 * sin(u[:,0])
zsq = (a1**2 - x3**2 - y3**2)
mask = where(zsq > 0)
x3 = x3[mask]
y3 = y3[mask]
z3 = zsq[mask] ** 0.5
ax.plot(x3, y3, z3, color='r')
ax.plot(x3, y3, -z3, color='r')
...

看来你想代表好人

使用球坐标,cyclinder方程变为

a²sin²(v)-a²cos(u)sin(v),


因此,只需改变
u
v
中的一个,推导出另一个参数并插入球面到笛卡尔变换,即可获得沿曲线的任意多个点,并使用绘图绘制。

您的圆柱体方程不正确。是的。。。我知道写得不好。。。但这可以理解吗?交点不总是一个圆吗(在赤道上,如果a(cyl)=a(sph)?你想让圆柱体在x和y方向上位移一定量吗?交点不是一个圆,而是一个球形楔块,我想要曲线从(a,0,0)到(0,0,a);(@LyonBuster刚刚在我的答案中添加了一个稍微修改过的代码,以帮助你。我对blender XD一无所知,我真的想要,你所说的,一个圆柱体和一个球体的交点,形成一条曲线。如果你最后公布你的结果会很好(f.I.屏幕副本)。
sin(v)=cos(u),
u+v=π/2.