Circle in 3D space

发布于 2022-10-13  87 次阅读


通过指定圆心,圆所在平面的法线,半径来绘制三维空间中的圆:

import numpy as np

normal = [1,1,1]
centroid = [1,1,1]
radius = 2


def threeDimensionalCircle(centroid, normal, radius, numPoints = 50):
    theta = np.linspace(0, 2*np.pi, numPoints)

    x1= radius *np.cos( theta )
    y1= radius *np.sin( theta )
    z1=np.zeros( theta.shape[0] )

    A1=np.arcsin(-normal[1]/np.sqrt(normal[1]**2+normal[2]**2))
    B1 =np.arcsin(normal[0]/np.sqrt(normal[0]**2+normal[2]**2))
    C1 = 0

    Rx_A1 = [[1, 0, 0], [0, np.cos(A1), np.sin(A1)], [0, -np.sin(A1), np.cos(A1)] ]
    Ry_B1=[[np.cos(B1), 0, -np.sin(B1)], [0, 1, 0], [np.sin(B1), 0, np.cos(B1)]]
    Rz_C1=[[np.cos(C1), np.sin(C1), 0], [-np.sin(C1), np.cos(C1), 0], [0., 0., 1.]]


    Rxyz1= np.linalg.multi_dot((Rz_C1, Ry_B1, Rx_A1, np.array([x1, y1, z1])))

    rayEnd = np.zeros([len(theta), 3])
    XC, YC, ZC = centroid[0], centroid[1], centroid[2]
    rayEnd[:,0]=Rxyz1[0,:] + XC * np.ones(len(theta))
    rayEnd[:,1]=Rxyz1[1,:] + YC * np.ones(len(theta))
    rayEnd[:,2]=Rxyz1[2,:] + ZC * np.ones(len(theta))

    return rayEnd

rayEnd = threeDimensionalCircle(centroid, normal, radius, numPoints = 50)

本当の声を響かせてよ