Beispiel #1
0
        public Form1()
        {
            InitializeComponent();


            TestEigenVectors();


            Color C = Color.SkyBlue;

            // Build the test curve
            float[][] Curve = new float[CURVE_SIZE][];

            Random RNG                = new Random(1);
            float  StepSize           = MAX_Z / CURVE_SIZE;
            float  TotalTransmittance = 1.0f;

            for (int i = 0; i < CURVE_SIZE; i++)
            {
                float x    = MAX_Z * i / CURVE_SIZE;
                float Rand = (float)RNG.NextDouble();
//				float	Density = Math.Max( 0.0f, Rand - 0.40f );
                float Density = (float)Math.Exp(-8.0f * Rand);
                Density *= Density;
                Density *= Smoothstep(0.0f, 3.0f, x);
                Density *= Smoothstep(6.0f, 4.0f, x);

                Density *= 1.0f - (x < 3.0f ? Smoothstep(2.0f, 3.0f, x) : Smoothstep(4.0f, 3.0f, x));


//Density = 0.0f;
//Density = 0.1f;

                float ExtinctionCoeff = 8.0f * Density;
                float Transmittance   = (float)Math.Exp(-ExtinctionCoeff * StepSize);

//Transmittance = 1.0f;

                TotalTransmittance *= Transmittance;

//TotalTransmittance = Math.Max(0.0f, 1.0f - 1.5f * i / CURVE_SIZE);    // Linear transmittance



                Curve[i] = new float[2] {
                    i *MAX_Z / CURVE_SIZE, TotalTransmittance
                };
            }
            displayPanelCurve.m_Curve = Curve;

            // Apply DCT compression
            float dx = 1.0f / SAMPLING_SIZE;                                                    // Normalized Z step size

            Vector4 CosTerm0 = (float)Math.PI * new Vector4(0, 1, 2, 3);
            Vector4 CosTerm1 = (float)Math.PI * new Vector4(4, 5, 6, 7);
            Vector4 dAngle0  = dx * CosTerm0;                                           // This is the increment in phase
            Vector4 dAngle1  = dx * CosTerm1;
//          Vector4	Angle0 = 0.5f * dAngle0;
//          Vector4	Angle1 = 0.5f * dAngle1;
            Vector4 Angle0 = 0.0f * dAngle0;
            Vector4 Angle1 = 0.0f * dAngle1;

            Vector4 DCTCoeffs0 = new Vector4(0, 0, 0, 0);
            Vector4 DCTCoeffs1 = new Vector4(0, 0, 0, 0);

            Vector4 CurrentCosAngle0      = new Vector4(1, 1, 1, 1);
            Vector4 CurrentCosAngle1      = new Vector4(1, 1, 1, 1);
            float   PreviousTransmittance = 1.0f;
            for (int i = 0; i < SAMPLING_SIZE; i++)
            {
                Angle0 += dAngle0;
                Angle1 += dAngle1;

                int CurveIndex = Math.Min(CURVE_SIZE - 1, CURVE_SIZE * (1 + i) / (SAMPLING_SIZE + 1));
//				int	CurveIndex = (int) (CURVE_SIZE * (0.0f+i) / (SAMPLING_SIZE+0.0f));
                float Transmittance = Curve[CurveIndex][1];

                // Use average of transmittance
//              float	TransmittanceToEncode = 0.5f * (PreviousTransmittance + Transmittance);
                PreviousTransmittance = Transmittance;
                float TransmittanceToEncode = Transmittance;

//              // Square integration (very bad with not enough steps!)
//				DCTCoeffs0 += TransmittanceToEncode * Angle0.Cos();
//				DCTCoeffs1 += TransmittanceToEncode * Angle1.Cos();

/*				// Better trapezoidal integration
 *                              Vector4	PreviousCosAngle0 = CurrentCosAngle0;
 *                              Vector4	PreviousCosAngle1 = CurrentCosAngle1;
 *                              CurrentCosAngle0 = Angle0.Cos();
 *                              CurrentCosAngle1 = Angle1.Cos();
 *
 *                              Vector4	AverageCosAngle0 = 0.5f * (PreviousCosAngle0 + CurrentCosAngle0);
 *                              Vector4	AverageCosAngle1 = 0.5f * (PreviousCosAngle1 + CurrentCosAngle1);
 *
 *                              DCTCoeffs0 += TransmittanceToEncode * AverageCosAngle0;
 *                              DCTCoeffs1 += TransmittanceToEncode * AverageCosAngle1;
 * //*/
//*				// Better trapezoidal integration
                Vector4 PreviousCosAngle0 = CurrentCosAngle0;
                Vector4 PreviousCosAngle1 = CurrentCosAngle1;
                CurrentCosAngle0 = TransmittanceToEncode * Angle0.Cos();                        // Include transmittance term in the integral! Tiny bit better!
                CurrentCosAngle1 = TransmittanceToEncode * Angle1.Cos();

                Vector4 AverageCosAngle0 = 0.5f * (PreviousCosAngle0 + CurrentCosAngle0);
                Vector4 AverageCosAngle1 = 0.5f * (PreviousCosAngle1 + CurrentCosAngle1);

                DCTCoeffs0 += AverageCosAngle0;
                DCTCoeffs1 += AverageCosAngle1;
//*/
            }
            DCTCoeffs0 *= 2.0f * dx;
            DCTCoeffs1 *= 2.0f * dx;
            displayPanelDCT.m_DCTCoefficients = new float[] { DCTCoeffs0.x, DCTCoeffs0.y, DCTCoeffs0.z, DCTCoeffs0.w, DCTCoeffs1.x, DCTCoeffs1.y, DCTCoeffs1.z, DCTCoeffs1.w };
        }