示例#1
0
    public Vector3 SampleVelOpt(int x, int y, int z)
    {
        MegaFlowVector mv = optvel[(x * gridDim2[2] * gridDim2[1]) + (z * gridDim2[1]) + y];

        Vector3 v;

        v.x = (((float)mv.x * oadj) - 0.5f) * maxval.x;
        v.y = (((float)mv.y * oadj) - 0.5f) * maxval.y;
        v.z = (((float)mv.z * oadj) - 0.5f) * maxval.z;
        return(v);
    }
示例#2
0
	public void Optimize()
	{
		Vector3 max = Vector3.zero;

		if ( optvel == null )
			optvel = new List<MegaFlowVector>();

		optvel.Clear();

		for ( int i = 0; i < vel.Count; i++ )
		{
			Vector3 v = vel[i];

			if ( Mathf.Abs(v.x) > max.x  )
				max.x = Mathf.Abs(v.x);

			if ( Mathf.Abs(v.y) > max.y )
				max.y = Mathf.Abs(v.y);

			if ( Mathf.Abs(v.z) > max.z )
				max.z = Mathf.Abs(v.z);
		}

		maxval = max;

		for ( int i = 0; i < vel.Count; i++ )
		{
			MegaFlowVector mv = new MegaFlowVector();

			Vector3 v = vel[i];

			mv.x = (byte)(((v.x / maxval.x) + 1.0f) * 0.5f * 255.0f);
			mv.y = (byte)(((v.y / maxval.y) + 1.0f) * 0.5f * 255.0f);
			mv.z = (byte)(((v.z / maxval.z) + 1.0f) * 0.5f * 255.0f);

			optvel.Add(mv);
		}

		optimized = true;

		GetGridVel = GetGridVelOpt;
		SampleVel = SampleVelOpt;
		maxval *= 2.0f;

		vel.Clear();

		GC.Collect();
	}
示例#3
0
    public Vector3 GetGridVelOptXY(Vector3 pos, ref bool inbounds)
    {
        if (optvel.Count == 0)
        {
            return(Vector3.zero);
        }

        int xi = (int)(pos.x * oos.x);
        int yi = (int)(pos.y * oos.y);

        if (xi < 0 || xi >= gridDim2[0] - 1)
        {
            inbounds = false;
            return(Vector3.zero);
        }

        if (yi < 0 || yi >= gridDim2[1] - 1)
        {
            inbounds = false;
            return(Vector3.zero);
        }

        inbounds = true;

        float xr = Mathf.Abs((pos.x - (xi * spacing.x)) * oos.x);
        float yr = Mathf.Abs((pos.y - (yi * spacing.y)) * oos.y);

        int xi1 = (xi + 1) * gridDim2[2] * gridDim2[1];
        int yi1 = yi + 1;

        xi *= gridDim2[2] * gridDim2[1];

        MegaFlowVector mv = optvel[xi + yi];

        Vector3 V000;

        V000.x = (float)mv.x;
        V000.y = (float)mv.y;
        V000.z = (float)mv.z;

        mv = optvel[xi1 + yi];

        Vector3 V100;

        V100.x = (float)mv.x;
        V100.y = (float)mv.y;
        V100.z = (float)mv.z;

        mv = optvel[xi1 + yi1];

        Vector3 V110;

        V110.x = (float)mv.x;
        V110.y = (float)mv.y;
        V110.z = (float)mv.z;

        mv = optvel[xi + yi1];

        Vector3 V010;

        V010.x = (float)mv.x;
        V010.y = (float)mv.y;
        V010.z = (float)mv.z;

        float omx = 1.0f - xr;
        float omy = 1.0f - yr;

        Vector3 Vxyz = V000 * omx * omy + V100 * xr * omy + V010 * omx * yr + V110 * xr * yr;

        Vxyz.x = ((Vxyz.x * oadj) - 0.5f) * maxval.x;
        Vxyz.y = ((Vxyz.y * oadj) - 0.5f) * maxval.y;
        Vxyz.z = 0.0f;          //((Vxyz.z * oadj) - 0.5f) * maxval.z;

        return(Vxyz);
    }
示例#4
0
    public void Optimize()
    {
        Vector3 max = Vector3.zero;

        if (optvel == null)
        {
            optvel = new List <MegaFlowVector>();
        }

        optvel.Clear();

        for (int i = 0; i < vel.Count; i++)
        {
            Vector3 v = vel[i];

            if (Mathf.Abs(v.x) > max.x)
            {
                max.x = Mathf.Abs(v.x);
            }

            if (Mathf.Abs(v.y) > max.y)
            {
                max.y = Mathf.Abs(v.y);
            }

            if (Mathf.Abs(v.z) > max.z)
            {
                max.z = Mathf.Abs(v.z);
            }
        }

        maxval = max;

        for (int i = 0; i < vel.Count; i++)
        {
            MegaFlowVector mv = new MegaFlowVector();

            Vector3 v = vel[i];

            mv.x = (byte)(((v.x / maxval.x) + 1.0f) * 0.5f * 255.0f);
            mv.y = (byte)(((v.y / maxval.y) + 1.0f) * 0.5f * 255.0f);
            mv.z = (byte)(((v.z / maxval.z) + 1.0f) * 0.5f * 255.0f);

            optvel.Add(mv);
        }

        optimized = true;

        //GetGridVel = GetGridVelOpt;
        //SampleVel = SampleVelOpt;
        if (gridDim2[2] == 1)
        {
            SampleVel  = SampleVelOpt;
            GetGridVel = GetGridVelOptXY;
        }
        else
        {
            SampleVel  = SampleVelOpt;
            GetGridVel = GetGridVelOpt;
        }

        maxval *= 2.0f;

        vel.Clear();

        GC.Collect();
    }