假设两个矢量由公共点(1,1,1)的两个顶点(1,2,3)和(0,2,-1)定义。如何显示受这两个矢量或线条影响的锐角(在虚线圆弧的3D图中)?在我的代码中,我已经在使用
了fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
我是初学者,请帮忙。
答案 0 :(得分:0)
我遇到了类似的问题,并提出了以下解决方案:
import numpy as np
import math
from math import sin, cos
from mpl_toolkits.mplot3d import proj3d
def plot_arc3d(vector1, vector2, radius=0.2, fig=None, colour='C0'):
""" Plot arc between two given vectors in 3D space. """
""" Confirm correct input arguments """
assert len(vector1) == 3
assert len(vector2) == 3
""" Calculate vector between two vector end points, and the resulting spherical angles for various points along
this vector. From this, derive points that lie along the arc between vector1 and vector2 """
v = [i-j for i, j in zip(vector1, vector2)]
v_points_direct = [(vector2[0]+v[0]*l, vector2[1]+v[1]*l, vector2[2]+v[2]*l) for l in np.linspace(0, 1)]
v_phis = [math.atan2(v_point[1], v_point[0]) for v_point in v_points_direct]
v_thetas = [math.acos(v_point[2]/np.linalg.norm(v_point)) for v_point in v_points_direct]
v_points_arc = [(radius*sin(theta)*cos(phi), radius*sin(theta)*sin(phi), radius*cos(theta))
for theta, phi in zip(v_thetas, v_phis)]
v_points_arc.append((0, 0, 0))
if fig is None:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
else:
ax = fig.gca()
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
""" Plot polygon (face colour must be set afterwards, otherwise it over-rides the transparency)
https://stackoverflow.com/questions/18897786/transparency-for-poly3dcollection-plot-in-matplotlib """
points_collection = Poly3DCollection([v_points_arc], alpha=0.4)
points_collection.set_facecolor(colour)
ax.add_collection3d(points_collection)
return fig