Source code for svcco.test_rotation
import numpy as np
import pyvista as pv
[docs]def rotate(R0,R1,P0,P1,theta):
theta = (theta/180)*np.pi
Rvector = R1-R0
Rvector = Rvector/np.linalg.norm(Rvector)
vector = P1-P0
vector = vector/np.linalg.norm(vector)
vector_parallel = (np.dot(vector,Rvector.T)/np.dot(Rvector,Rvector.T))*Rvector
vector_perp = vector-vector_parallel
w = np.cross(Rvector,vector_perp)
x1 = np.cos(theta)/np.linalg.norm(vector_perp)
x2 = np.sin(theta)/np.linalg.norm(w)
rotated_vector = np.linalg.norm(vector_perp)*(x1*vector_perp+x2*w)+vector_parallel
new_point = P0+rotated_vector*(np.linalg.norm(P1-P0))
return new_point
[docs]def line(P0,P1):
mesh = pv.Line(P0,P1)
return mesh
[docs]def disk(R0,R1,P0,P1):
norm = R1-R0
norm = norm/np.linalg.norm(norm)
L = np.linalg.norm(P1-P0)
mesh = pv.Disc(center=R1,normal=norm,outer=L,inner=0)
return mesh
[docs]def test():
R0 = np.random.random(3).reshape(1,-1)
R1 = np.random.random(3).reshape(1,-1)
P0 = R1
P1 = np.random.random(3).reshape(1,-1)
theta = 180*np.random.random(1)
plotter = pv.Plotter()
axis = line(R0,R1)
original = line(P0,P1)
P_new = rotate(R0,R1,P0,P1,theta)
new = line(P0,P_new)
d = disk(R0,R1,P0,P1)
plotter.add_mesh(d,opacity=0.4)
plotter.add_mesh(axis,color='black')
plotter.add_mesh(original,color='r')
plotter.add_mesh(new,color='g')
plotter.show()
return