Source code for svcco.collision.obb

import numpy as np
import numba as nb
import pyvista as pv

[docs]class grid: def __init__(self): self.P = pv.Plotter(shape=(4,4)) self.next = [0,0] self.size = [4,4]
[docs] def plot(self,cyl1,cyl2,plane=None,title="None"): self.P.subplot(self.next[0],self.next[1]) self.P.add_mesh(cyl1,color='g') self.P.add_mesh(cyl2) if plane is not None: self.P.add_mesh(plane) self.P.add_title(title) if self.next[1]+1 < self.size[1]: self.next[1] += 1 else: self.next[0] += 1 self.next[1] = 0
[docs] def show(self): self.P.show()
[docs]@nb.jit(nopython=True) def separating_axis(position,plane,U1,V1,W1,U2,V2,W2,U1_scale, V1_scale,W1_scale,U2_scale,V2_scale,W2_scale): return np.abs(np.dot(position,plane)) > (np.abs(np.dot(U1*U1_scale,plane))+ np.abs(np.dot(V1*V1_scale,plane))+ np.abs(np.dot(W1*W1_scale,plane))+ np.abs(np.dot(U2*U2_scale,plane))+ np.abs(np.dot(V2*V2_scale,plane))+ np.abs(np.dot(W2*W2_scale,plane)))
[docs]@nb.jit(nopython=True) def obb(data,edge): #C2 = (edge[0:3] + edge[3:6]) / 2 #C1 = (data[:,0:3] + data[:,3:6]) / 2 """ start = time.time() collision = False start = time.time() cyl_2 = vtk.vtkTubeFilter() line2 = vtk.vtkLineSource() line2.SetPoint1(edge[0],edge[1],edge[2]) line2.SetPoint2(edge[3],edge[4],edge[5]) cyl_2.SetInputConnection(line2.GetOutputPort()) cyl_2.SetRadius(edge[21]) cyl_2.SetNumberOfSides(20) cyl_2.CappingOn() for i in range(data.shape[0]): cyl_1 = vtk.vtkTubeFilter() line1 = vtk.vtkLineSource() line1.SetPoint1(data[i,0],data[i,1],data[i,2]) line1.SetPoint2(data[i,3],data[i,4],data[i,5]) cyl_1.SetInputConnection(line1.GetOutputPort()) cyl_1.SetRadius(data[i,21]) cyl_1.SetNumberOfSides(20) cyl_1.CappingOn() collision = vtk.vtkCollisionDetectionFilter() collision.SetInputConnection(0,cyl_1.GetOutputPort()) collision.SetInputConnection(1,cyl_2.GetOutputPort()) transform = vtk.vtkTransform() matrix = vtk.vtkMatrix4x4() collision.SetTransform(0,transform) collision.SetMatrix(1,matrix) collision.SetCollisionModeToAllContacts() collision.GenerateScalarsOn() collision.Update() if collision.GetNumberOfContacts() > 0: collision = True break #print('OBB: {}'.format(time.time()-start)) end = time.time() - start #print(end) return collision """ C1 = (edge[0:3] + edge[3:6]) / 2 C2 = (data[:,0:3] + data[:,3:6]) / 2 Position = C2 - C1 #CENTER_ALL = (C2 + C1)/2 # Basis vector construction edge[12:15] = ((edge[3:6] - edge[0:3]) / np.linalg.norm(edge[3:6] - edge[0:3])) if edge[14] == -1: edge[6:9] = np.array([-1,0,0]) edge[9:12] = np.array([0,-1,0]) else: edge[6:9] = np.array([1-edge[12]**2/(1+edge[14]), (-edge[12]*edge[13])/(1+edge[14]), -edge[12]]) edge[9:12] = np.array([(-edge[12]*edge[13])/(1+edge[14]), 1 - edge[13]**2/(1+edge[14]), -edge[13]]) edge[20] = np.linalg.norm(edge[3:6] - edge[0:3]) #print(np.linalg.norm(edge[6:9])) #print(np.linalg.norm(edge[9:12])) #print(np.linalg.norm(edge[12:15])) result = [] for i in range(data.shape[0]): #CENTER = CENTER_ALL[i] #G = grid() # U1 axis #cyl1 = pv.Cylinder(center=(data[i,0:3]+data[i,3:6])/2,direction=data[i,12:15], # radius=data[i,21],height=data[i,20]) #cyl2 = pv.Cylinder(center=(edge[0:3]+edge[3:6])/2,direction=edge[12:15], # radius=edge[21],height=edge[20]) #G.plot(cyl1,cyl2,plane=None,title="Objects") #plane = pv.Plane(center=CENTER,direction=edge[6:9]) #G.plot(cyl1,cyl2,plane=plane,title="U1 axis") if separating_axis(Position[i,:],edge[6:9],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # V1 axis #plane = pv.Plane(center=CENTER,direction=edge[9:12]) #G.plot(cyl1,cyl2,plane=plane,title="V1 axis") if separating_axis(Position[i,:],edge[9:12],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # W1 axis #plane = pv.Plane(center=CENTER,direction=edge[12:15]) #G.plot(cyl1,cyl2,plane=plane,title="W1 axis") if separating_axis(Position[i,:],edge[12:15],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # U2 axis #plane = pv.Plane(center=CENTER,direction=data[i,6:9]) #G.plot(cyl1,cyl2,plane=plane,title="U2 axis") if separating_axis(Position[i,:],data[i,6:9],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # V2 axis #plane = pv.Plane(center=CENTER,direction=data[i,9:12]) #G.plot(cyl1,cyl2,plane=plane,title="V2 axis") if separating_axis(Position[i,:],data[i,9:12],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # W2 axis #plane_obj = pv.Plane(center=CENTER,direction=data[i,12:15]) #G.plot(cyl1,cyl2,plane=plane,title="W2 axis") if separating_axis(Position[i,:],data[i,12:15],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # Mixed Plane Separation Tests # U1 X U2 plane = np.cross(edge[6:9],data[i,6:9]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="U1 x U2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # U1 X V2 plane = np.cross(edge[6:9],data[i,9:12]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="U1 x V2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # U1 X W2 plane = np.cross(edge[6:9],data[i,12:15]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="U1 x W2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # V1 X U2 plane = np.cross(edge[9:12],data[i,6:9]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="V1 x U2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # V1 X V2 plane = np.cross(edge[9:12],data[i,9:12]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="V1 x V2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # V1 X W2 plane = np.cross(edge[9:12],data[i,12:15]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="V1 x W2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # W1 X U2 plane = np.cross(edge[12:15],data[i,6:9]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="W1 x U2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # W1 X V2 plane = np.cross(edge[12:15],data[i,9:12]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="W1 x V2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue # W1 X W2 plane = np.cross(edge[12:15],data[i,12:15]) #plane_obj = pv.Plane(center=CENTER,direction=plane) #G.plot(cyl1,cyl2,plane=plane_obj,title="W1 x W2 axis") if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): result.append(False) #G.show() continue else: #print('Collision') #G.show() """ colors = vtk.vtkNamedColors() background_color = 'white' cyl = vtk.vtkTubeFilter() line = vtk.vtkLineSource() line.SetPoint1(edge[0],edge[1],edge[2]) line.SetPoint2(edge[3],edge[4],edge[5]) cyl.SetInputConnection(line.GetOutputPort()) cyl.SetRadius(edge[21]) cyl.SetNumberOfSides(100) #models.append(cyl) mapper = vtk.vtkPolyDataMapper() actor1 = vtk.vtkActor() mapper.SetInputConnection(cyl.GetOutputPort()) actor1.SetMapper(mapper) actor1.GetProperty().SetColor(colors.GetColor3d('green')) #actors.append(actor) colors = vtk.vtkNamedColors() cyl = vtk.vtkTubeFilter() line = vtk.vtkLineSource() line.SetPoint1(data[i,0],data[i,1],data[i,2]) line.SetPoint2(data[i,3],data[i,4],data[i,5]) cyl.SetInputConnection(line.GetOutputPort()) cyl.SetRadius(data[i,21]) cyl.SetNumberOfSides(100) #models.append(cyl) mapper = vtk.vtkPolyDataMapper() actor2 = vtk.vtkActor() mapper.SetInputConnection(cyl.GetOutputPort()) actor2.SetMapper(mapper) actor2.GetProperty().SetColor(colors.GetColor3d('green')) #actors.append(actor) renderer = vtk.vtkRenderer() renderer.SetBackground(colors.GetColor3d(background_color)) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetWindowName('SimVascular Vessel Collision') interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) renderer.AddActor(actor1) renderer.AddActor(actor2) render_window.Render() interactor.Start() """ return True return False
[docs]@nb.jit(nopython=True) def obbc(data,edge): C1 = (edge[0:3] + edge[3:6]) / 2 C2 = (data[:,0:3] + data[:,3:6]) / 2 Position = C2 - C1 # Basis vector construction edge[12:15] = ((edge[3:6] - edge[0:3]) / np.linalg.norm(edge[3:6] - edge[0:3])) if edge[14] == -1: edge[6:9] = np.array([-1,0,0]) edge[9:12] = np.array([0,-1,0]) else: edge[6:9] = np.array([1-edge[12]**2/(1+edge[14]), (-edge[12]*edge[13])/(1+edge[14]), -edge[12]]) edge[9:12] = np.array([(-edge[12]*edge[13])/(1+edge[14]), 1 - edge[13]**2/(1+edge[14]), -edge[13]]) edge[20] = np.linalg.norm(edge[3:6] - edge[0:3]) result = [] for i in range(data.shape[0]): # U1 axis #cyl1 = pv.Cylinder(center=(data[i,0:3]+data[i,3:6])/2,direction=data[i,12:15], # radius=data[i,21],height=data[i,20]) #cyl2 = pv.Cylinder(center=(edge[0:3]+edge[3:6])/2,direction=edge[12:15], # radius=edge[21],height=edge[20]) if separating_axis(Position[i,:],edge[6:9],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # V1 axis if separating_axis(Position[i,:],edge[9:12],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # W1 axis if separating_axis(Position[i,:],edge[12:15],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # U2 axis if separating_axis(Position[i,:],data[i,6:9],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # V2 axis if separating_axis(Position[i,:],data[i,9:12],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # W2 axis if separating_axis(Position[i,:],data[i,12:15],edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # Mixed Plane Separation Tests # U1 X U2 plane = np.cross(edge[6:9],data[i,6:9]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # U1 X V2 plane = np.cross(edge[6:9],data[i,9:12]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # U1 X W2 plane = np.cross(edge[6:9],data[i,12:15]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # V1 X U2 plane = np.cross(edge[9:12],data[i,6:9]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # V1 X V2 plane = np.cross(edge[9:12],data[i,9:12]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # V1 X W2 plane = np.cross(edge[9:12],data[i,12:15]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # W1 X U2 plane = np.cross(edge[12:15],data[i,6:9]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # W1 X V2 plane = np.cross(edge[12:15],data[i,9:12]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue # W1 X W2 plane = np.cross(edge[12:15],data[i,12:15]) if separating_axis(Position[i,:],plane,edge[6:9],edge[9:12],edge[12:15], data[i,6:9],data[i,9:12],data[i,12:15],edge[21],edge[21], edge[20]/2,data[i,21],data[i,21],data[i,20]/2): continue else: result.append(i) return result