示例#1
0
    public void AddNBody(int bodyNum, NBody nbody, Vector3 position, Vector3 velocity)
    {
        if (numBodies > maxBodies)
        {
            Debug.LogError("Added more than maximum allocated bodies! max=" + maxBodies);
            return;
        }
        if (bodyNum != numBodies)
        {
            Debug.LogError("Body numbers are out of sync integrator=" + numBodies + " GE=" + bodyNum);
            return;
        }
        active[numBodies] = true;
        // r,m already in GravityEngine
        vel[numBodies, 0] = velocity.x;
        vel[numBodies, 1] = velocity.y;
        vel[numBodies, 2] = velocity.z;

        // check for engine
        GEExternalAcceleration ext_accel = nbody.GetComponent <GEExternalAcceleration>();

        if (ext_accel != null)
        {
            externalAccel[numBodies] = ext_accel;
#pragma warning disable 162     // disable unreachable code warning
            if (GravityEngine.DEBUG)
            {
                Debug.Log("Added GEExternalAcceleration engine for " + nbody.gameObject);
            }
#pragma warning restore 162
        }
        //		Debug.Log ("add object at r=" + gameObject.transform.position + " v=" + ubody.vel + " size2=" + size2[numBodies]
        //					+ " mass=" + ubody.mass);
        numBodies++;
    }
示例#2
0
    public void GrowArrays(int growBy)
    {
        double[,] v_copy = new double[maxBodies, GravityState.NDIM];
        double[,] a_copy = new double[maxBodies, GravityState.NDIM];
        GEExternalAcceleration[] externalAccelerations_copy = new GEExternalAcceleration[maxBodies];

        for (int j = 0; j < numBodies; j++)
        {
            for (int k = 0; k < GravityState.NDIM; k++)
            {
                v_copy[j, k] = v[j, k];
                a_copy[j, k] = a[j, k];
            }
            externalAccelerations_copy[j] = externalAccel[j];
        }
        v             = new double[maxBodies + growBy, GravityState.NDIM];
        a             = new double[maxBodies + growBy, GravityState.NDIM];
        externalAccel = new GEExternalAcceleration[maxBodies + growBy];

        for (int j = 0; j < numBodies; j++)
        {
            for (int k = 0; k < GravityState.NDIM; k++)
            {
                v[j, k] = v_copy[j, k];
            }
            externalAccel[j] = externalAccelerations_copy[j];
        }
        maxBodies += growBy;
    }
示例#3
0
    public void AddBody(GameObject gameObject, float physToWorldFactor)
    {
        if (numBodies + 1 >= arraySize)
        {
            GrowArrays(GROW_ARRAY);
        }
        bodies[numBodies] = gameObject;
        NBody nbody = bodies[numBodies].GetComponent <NBody>();

        nbody.engineRef = new GravityEngine.EngineRef(GravityEngine.BodyType.MASSLESS, numBodies);

        // check for engine
        GEExternalAcceleration rocket = bodies[numBodies].GetComponent <GEExternalAcceleration>();

        if (rocket != null)
        {
            externalAccel[numBodies] = rocket;
#pragma warning disable 162     // disable unreachable code warning
            if (GravityEngine.DEBUG)
            {
                Debug.Log("Added rocket engine for " + gameObject);
            }
#pragma warning restore 162
        }

        Vector3 physicsPosition = nbody.initialPhysPosition / physToWorldFactor;
        r[numBodies, 0] = physicsPosition.x;
        r[numBodies, 1] = physicsPosition.y;
        r[numBodies, 2] = physicsPosition.z;
        v[numBodies, 0] = nbody.vel_phys.x;
        v[numBodies, 1] = nbody.vel_phys.y;
        v[numBodies, 2] = nbody.vel_phys.z;
        info[numBodies] = 0;
        for (int childNum = 0; childNum < nbody.transform.childCount; childNum++)
        {
            Trajectory trajectory = nbody.transform.GetChild(childNum).GetComponent <Trajectory>();
            if (trajectory != null)
            {
                trajectories[numBodies] = trajectory;
                break;
            }
        }

                #pragma warning disable 162             // disable unreachable code warning
        if (GravityEngine.DEBUG)
        {
            Debug.Log(string.Format("Added {0} at phys=({1} {2} {3})", gameObject.name,
                                    r[numBodies, 0], r[numBodies, 1], r[numBodies, 2]));
        }
                #pragma warning restore 162
        numBodies++;
    }
示例#4
0
    private void GrowArrays(int growBy)
    {
        double[,] r_copy = new double[arraySize, GravityState.NDIM];
        double[,] v_copy = new double[arraySize, GravityState.NDIM];
        GameObject[]             bodies_copy  = new GameObject[arraySize];
        byte[]                   info_copy    = new byte[arraySize];
        GEExternalAcceleration[] rockets_copy = new GEExternalAcceleration[arraySize];
        Trajectory[]             traj_copy    = new Trajectory[arraySize];

        for (int j = 0; j < numBodies; j++)
        {
            for (int k = 0; k < GravityState.NDIM; k++)
            {
                r_copy[j, k] = r[j, k];
                v_copy[j, k] = v[j, k];
            }
            info_copy[j]    = info[j];
            bodies_copy[j]  = bodies[j];
            traj_copy[j]    = trajectories[j];
            rockets_copy[j] = externalAccel[j];
        }
        r             = new double[arraySize + growBy, GravityState.NDIM];
        v             = new double[arraySize + growBy, GravityState.NDIM];
        a             = new double[arraySize + growBy, GravityState.NDIM];
        info          = new byte[arraySize + growBy];
        bodies        = new GameObject[arraySize + growBy];
        trajectories  = new Trajectory[arraySize + growBy];
        externalAccel = new GEExternalAcceleration[arraySize + growBy];
        for (int j = 0; j < numBodies; j++)
        {
            for (int k = 0; k < GravityState.NDIM; k++)
            {
                r[j, k] = r_copy[j, k];
                v[j, k] = v_copy[j, k];
            }
            info[j]          = info_copy[j];
            bodies[j]        = bodies_copy[j];
            trajectories[j]  = traj_copy[j];
            externalAccel[j] = rockets_copy[j];
        }
        arraySize += growBy;
    }
示例#5
0
    public void GrowArrays(int growBy)
    {
        int newSize = maxBodies + growBy;

        double[,] vel_copy  = new double[maxBodies, NDIM];
        double[,] acc_copy  = new double[maxBodies, NDIM];
        double[,] jerk_copy = new double[maxBodies, NDIM];

        double[,] old_pos_copy  = new double[maxBodies, NDIM];
        double[,] old_vel_copy  = new double[maxBodies, NDIM];
        double[,] old_acc_copy  = new double[maxBodies, NDIM];
        double[,] old_jerk_copy = new double[maxBodies, NDIM];
        double[] size_copy   = new double[maxBodies];
        bool[]   active_copy = new bool[maxBodies];
        GEExternalAcceleration[] externalAccelerations_copy = new GEExternalAcceleration[maxBodies];
        for (int j = 0; j < maxBodies; j++)
        {
            for (int k = 0; k < NDIM; k++)
            {
                vel_copy[j, k]      = vel[j, k];
                acc_copy[j, k]      = acc[j, k];
                jerk_copy[j, k]     = jerk[j, k];
                old_pos_copy[j, k]  = old_pos[j, k];
                old_vel_copy[j, k]  = old_vel[j, k];
                old_acc_copy[j, k]  = old_acc[j, k];
                old_jerk_copy[j, k] = old_jerk[j, k];
            }
            active_copy[j] = active[j];
            size_copy[j]   = size[j];
            externalAccelerations_copy[j] = externalAccel[j];
        }

        size = new double[newSize];
        vel  = new double[newSize, NDIM];
        acc  = new double[newSize, NDIM];
        jerk = new double[newSize, NDIM];

        old_pos  = new double[newSize, NDIM];
        old_vel  = new double[newSize, NDIM];
        old_acc  = new double[newSize, NDIM];
        old_jerk = new double[newSize, NDIM];

        active        = new bool[newSize];
        size          = new double[newSize];
        externalAccel = new GEExternalAcceleration[newSize];

        for (int j = 0; j < maxBodies; j++)
        {
            for (int k = 0; k < NDIM; k++)
            {
                vel[j, k]      = vel_copy[j, k];
                acc[j, k]      = acc_copy[j, k];
                jerk[j, k]     = jerk_copy[j, k];
                old_pos[j, k]  = old_pos_copy[j, k];
                old_vel[j, k]  = old_vel_copy[j, k];
                old_acc[j, k]  = old_acc_copy[j, k];
                old_jerk[j, k] = old_jerk_copy[j, k];
            }
            active[j]        = active_copy[j];
            size[j]          = size_copy[j];
            externalAccel[j] = externalAccelerations_copy[j];
        }
        maxBodies = newSize;
    }