def EField(charge,point): """Calculate electric field caused by a charge at a point Returns Vector charge: Charge Charge that cause electric field point: Vector Point in a 3-D space to calculate electric field """ E = cn.k.Value * charge.charge / veop.RelativeVector(charge.position,point).magnitude**2 vector = veop.List2Vector(E*veop.RelativeVector(point,charge.position).unitVector().numpy_array) return vector
def CoulombsLaw(charge1,charge2): """Calculate electric force act on second charge applied by first charge Returns Vector Attributes ---------- charge1: Charge First charge charge2: Charge Second Charge """ F = cn.k.Value * charge1.charge * charge2.charge / veop.RelativeVector(charge1.position,charge2.position).magnitude**2 vector = veop.List2Vector(F * veop.RelativeVector(charge2.position,charge1.position).unitVector().numpy_array) return vector
def EPotential2Charge(Charge1,Charge2): """Calculate potential energy that created by two charges Returns int Attribute --------- Charge1: Charge First charge Charge2: Charge Second charge """ return cn.k.Value * Charge1.charge * Charge2.charge/ veop.RelativeVector(Charge1.position,Charge2.position).magnitude
def EPotential(Charge,Point): """Calculates electric potential energy of an charge at a point. Returns int Attributes ---------- Charge: Charge A charge Point: Vector Point in a 3-D space """ return cn.k.Value * Charge.charge / veop.RelativeVector(Charge.position,Point).magnitude
def DipoleMoment(NegativeCharge,PositiveCharge): """Calculate the dipole moment of two charges Returns Vector Attribute --------- NegativeCharge: Charge Negative charge PositiveCharge: Charge Positive charge """ return veop.List2Vector(PositiveCharge.charge * veop.RelativeVector(PositiveCharge.position,NegativeCharge.position).numpy_array)
def Elastic(self): """Calculate final velocities of two object after an elastic collision Returns Vector,Vector Attributes ---------- Object1: Object First object of an elactic collision Object2: Object Second object of an elastic collision """ RlV = veop.List2Vector(veop.RelativeVector(self.Object2.Velocity,self.Object1.Velocity).numpy_array) IMom = veop.List2Vector(self.Object1.Momentum.numpy_array+self.Object2.Momentum.numpy_array) O2fV = veop.List2Vector(IMom.numpy_array+RlV.numpy_array*self.Object1.Mass/(self.Object1.Mass+self.Object2.Mass)) O1fV = veop.List2Vector(O2fV.numpy_array-RlV.numpy_array) return O1fV,O2fV
def GravPotential(Object,Point): return Object.mass * veop.DotProduct(Object.Space.Gravity,veop.RelativeVector(Point,Object.Position))
def Trajectory(self,t,plot="scatter",anim=False,show_forces=False,type_of_force='net'): """Draws trajectory of the object between 0-t seconds Attributes ---------- o: Object Object t: int Time """ time_mult = 1 p = self.o.Position.components fig = plt.figure() plt.get_current_fig_manager().window.state('zoomed') ax = fig.add_subplot(111, projection='3d') ax.scatter(p[0],p[1],p[2],c='#CC0033',marker='o',s=120*2,label="Object") ax.set_title('Trajectory of the object') ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') if plot=="scatter": tx = [] ty = [] tz = [] x,y,z=np.array([p[0]]),np.array([p[1]]),np.array([p[2]]) for tt in range(1,t*time_mult): tx.append(self.o.Future("position",tt/time_mult).x) ty.append(self.o.Future("position",tt/time_mult).y) tz.append(self.o.Future("position",tt/time_mult).z) if anim==True: scat =ax.scatter(tx,ty,tz,c='black',s=50) plt.pause(0.000001) tx=np.array(tx) ty=np.array(ty) tz=np.array(tz) self.o.Position = veop.Vector(tx,ty,tz) spcnt = np.zeros([3,len(tx)]) space_center = veop.Vector(spcnt[0],spcnt[1],spcnt[2]) scat =ax.scatter(tx,ty,tz,c=1e-3*self.o.Mass * veop.DotProduct(self.o.Space.Gravity,veop.RelativeVector(space_center,self.o.Position)),s=60,label='Trajectory',cmap="winter",alpha=1) x,y,z=np.append(x,tx),np.append(y,ty),np.append(z,tz) cbar = fig.colorbar(scat) cbar.set_label('Gravity Potential Energy (kJ)') if show_forces == True: force_mult = 10 f=self.o.Forces if type_of_force=='net' or type_of_force == 'all': x=np.append(x,tx+self.o.NetForce.x*force_mult) y=np.append(y,ty+self.o.NetForce.y*force_mult) z=np.append(z,tz+self.o.NetForce.z*force_mult) ax.quiver(tx,ty,tz,self.o.NetForce.x*force_mult,self.o.NetForce.y*force_mult,self.o.NetForce.z*force_mult,colors='black',label='F_net = ({}i,{}j,{}k)'.format(self.o.NetForce.x,self.o.NetForce.y,self.o.NetForce.z)) if type_of_force=='gravity': x=np.append(x,tx+self.o.Space.Gravity.x*force_mult) y=np.append(y,ty+self.o.Space.Gravity.y*force_mult) z=np.append(z,tz+self.o.Space.Gravity.z*force_mult) ax.quiver(tx,ty,tz,self.o.Space.Gravity.x*force_mult,self.o.Space.Gravity.y*force_mult,self.o.Space.Gravity.z*force_mult,colors='red',label='Gravity = ({}i,{}j,{}k)'.format(self.o.Space.Gravity.x,self.o.Space.Gravity.y,self.o.Space.Gravity.z)) # ax.quiver(tx,ty,tz,1,1,1) if type_of_force=='diff' or type_of_force == 'all': colors=[] fx,fy,fz=[],[],[] for i in range(len(f)): fi = f[i].components fx.append(fi[0]) fy.append(fi[1]) fz.append(fi[2]) col = 1/len(f) r = [0,0.5,col*i] colors.append(r) fx=np.array(fx) fy=np.array(fy) fz=np.array(fz) for q in range(len(f)): x=np.append(x,tx+fx[q]*force_mult) y=np.append(y,ty+fy[q]*force_mult) z=np.append(z,tz+fz[q]*force_mult) fmax = max([abs(fx[q]),abs(fy[q]),abs(fz[q])]) qui_col = [ abs(fx[q])/fmax , abs(fy[q])/fmax , abs(fz[q])/fmax] qui_col = np.array(qui_col) qui_col = qui_col/2 ax.quiver(tx,ty,tz,fx[q]*force_mult,fy[q]*force_mult,fz[q]*force_mult,colors=qui_col,label='force {} = ({}i,{}j,{}k)'.format(q,fx[q],fy[q],fz[q])) # print(x) ax.set_xlim3d(min(x),max(x)) ax.set_ylim3d(min(y),max(y)) ax.set_zlim3d(min(z),max(z)) plt.legend(loc=8,ncol=5) plt.show() if plot=="line": tx =[] ty=[] tz=[] for tt in range(1,t*10): # col = 1/t # r = [0,0,1-col*tt] # colors.append(r) tx.append(self.o.Future("position",tt*.1).components[0]) ty.append(self.o.Future("position",tt*.1).components[1]) tz.append(self.o.Future("position",tt*.1).components[2]) ax.plot(tx,ty,tz,color="red",label='Trajectory',linewidth=5) plt.legend() plt.show()