示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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)
示例#6
0
    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
示例#7
0
def GravPotential(Object,Point):
    return Object.mass * veop.DotProduct(Object.Space.Gravity,veop.RelativeVector(Point,Object.Position))
示例#8
0
    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()