首页 > 解决方案 > 使用 ipyvolume 在 jupyter 中绘制 2D 网格

问题描述

我想得到什么:

在此处输入图像描述

我使用 numpy、ipywidget 和 ipyvolume 编码的内容:

##define coordinates [TopPointX, ...etc.]

p1 = np.array([TopPointX, TopPointY, TopPointZ])
p2 = np.array([BottomPointX, BottomPointY, BottomPointZ])
p3 = np.array([ThirdPointX, ThirdPointY, ThirdPointZ])

##calculate plane

# These two vectors are in the plane
v1 = p3 - p1
v2 = p2 - p1

# the cross product is a vector normal to the plane
cp = np.cross(v1, v2)
a, b, c = cp

# This evaluates a * x3 + b * y3 + c * z3 which equals d
d = np.dot(cp, p3)

print('The equation is {0}x + {1}y + {2}z = {3}'.format(a, b, c, d))

x = np.linspace(TopPointX, BottomPointX, Meshcells)
y = np.linspace(TopPointY, BottomPointY, Meshcells)
X, Y = np.meshgrid(x, y)
Z = (d - a * X - b * Y) / c

#ipv
ipv.plot_surface(X, Y, Z, color="orange")
ipv.plot_wireframe(X, Y, Z, color="red")

ipv.show()

我得到什么: 在此处输入图像描述

我可以将 Z 的计算限制在 0 到 -100 的范围内吗?还是有更好的方法来完成这一切?

标签: pythonnumpy3djupyter

解决方案


所以,我终于想通了:

p1 = np.array([Point1X, Point1Y, Topheight])
p2 = np.array([Point2X, Point2Y, Topheight])
p3 = np.array([Point1X,Point1Y,Bottomheight])
v1 = p2 - p1 #horizontal vector
v2 = p3 - p1 #vertical vector
unitv1 = v1 / np.linalg.norm(v1) #horizontal unit vector
unitv2 = v2 / np.linalg.norm(v2) #vertical unit vector
numberofpointsH = int(np.linalg.norm(v1)/Meshsize) #number of points along horizontal vector
numberofpointsV = int(np.linalg.norm(v2)/Meshsize) #number of points along vertical vector

xy = np.empty([numberofpointsH,3])
for r, line in enumerate(xy):
    xy[r] = p1+(unitv1*r*Meshsize)
xz = np.empty([numberofpointsV,3])
for r, line in enumerate(xz):
    xz[r] = p1+(unitv2*r*Meshsize)

x = xy[:, [0]]
y = xy[:, [1]]
z = xz[:, [2]]
X, Z = np.meshgrid(x, z, indexing='xy') #, indexing='ij'
Y = np.empty_like(X)
for r,line in enumerate(Y):
    Y[r] = y.T

#plot
ipv.plot_surface(X, Y, Z, color="orange")
ipv.plot_wireframe(X, Y, Z, color="red")
ipv.show()

网格需要由 X 和 Z 应用,而不是由 X 和 Y 应用。结果现在是: 在此处输入图像描述


推荐阅读