private static void ConvertParametersToBackSurfaceRayAndBack(
     LensRayTransferFunction.Parameters inputParams)
 {
     ConvertParametersToRayAndBack(inputParams, (parameters, lens) =>
                                   lens.ConvertBackSurfaceRayToParameters(lens.ConvertParametersToBackSurfaceRay(parameters))
                                   );
 }
        public void ComputeLrtfForRandomInput()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);
            Random random = new Random();

            for (int i = 0; i < 1000; i++)
            {
                var incomingParams = new LensRayTransferFunction.Parameters(
                    random.NextDouble(), random.NextDouble(),
                    random.NextDouble(), random.NextDouble()
                    );
                LensRayTransferFunction.Parameters outgoingParams = lrtf.ComputeLrtf(incomingParams);
                if (outgoingParams != null)
                {
                    if (outgoingParams.DirectionTheta < 0 || outgoingParams.DirectionTheta > 1 ||
                        outgoingParams.DirectionPhi < 0 || outgoingParams.DirectionPhi > 1 ||
                        outgoingParams.PositionTheta < 0 || outgoingParams.PositionTheta > 1 ||
                        outgoingParams.PositionPhi < 0 || outgoingParams.PositionPhi > 1)
                    {
                        Console.WriteLine("Warning: parameter outside [0; 1] interval.");
                        Console.WriteLine("incoming: {0}", incomingParams);
                        Console.WriteLine("outgoing: {0}", outgoingParams);
                        Console.WriteLine();
                    }
                    //Assert.InRange(outgoingParams.DirectionTheta, 0.0, 1.0);
                    //Assert.InRange(outgoingParams.DirectionPhi, 0.0, 1.0);
                    //Assert.InRange(outgoingParams.PositionTheta, 0.0, 1.0);
                    //Assert.InRange(outgoingParams.PositionPhi, 0.0, 1.0);
                }
            }
        }
        public void ComputeLrtfResultInCorrectInterval()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);
            var incomingParams           = new LensRayTransferFunction.Parameters(0.835057026164167, 0.375245163857585, 0.854223355117358, 0.000161428470239708);

            LensRayTransferFunction.Parameters outgoingParams = lrtf.ComputeLrtf(incomingParams);
            Console.WriteLine(outgoingParams);
        }
        private static void ConvertParametersToRayAndBack(
            LensRayTransferFunction.Parameters inputParams,
            Func <LensRayTransferFunction.Parameters, ComplexLens, LensRayTransferFunction.Parameters> func)
        {
            ComplexLens lens         = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            var         outputParams = func(inputParams, lens);

            Assert.Equal(inputParams.PositionTheta, outputParams.PositionTheta, 5);
            Assert.Equal(inputParams.PositionPhi, outputParams.PositionPhi, 5);
            Assert.Equal(inputParams.DirectionTheta, outputParams.DirectionTheta, 5);
            Assert.Equal(inputParams.DirectionPhi, outputParams.DirectionPhi, 5);
        }
        public void ComputeLrtf()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);
            var incomingParams           = new LensRayTransferFunction.Parameters(0.5, 0.5, 0.7000000000000004, 0.0);

            LensRayTransferFunction.Parameters outgoingParams = lrtf.ComputeLrtf(incomingParams);
            Console.WriteLine("IN: {0}", incomingParams);
            Console.WriteLine("OUT: {0}", outgoingParams);
            if (outgoingParams != null)
            {
                Console.WriteLine("  {0}", lens.ConvertParametersToFrontSurfaceRay(outgoingParams));
            }
        }
        public void SampleLrtf()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);
            var defaultParameters        = new LensRayTransferFunction.Parameters(0.5, 0.5, 1.0, 0.5);
            var table = lrtf.SampleLrtf1D(defaultParameters,
                                          LensRayTransferFunction.VariableParameter.DirectionTheta, 101);

            //int i = 0;
            //foreach (LensRayTransferFunction.Parameters rayParams in table)
            //{
            //    Console.WriteLine("[{0}]: {1}", i, rayParams);
            //    if (rayParams != null)
            //    {
            //        //Console.WriteLine("  {0}", lens.ConvertParametersToFrontSurfaceRay(rayParams));
            //    }
            //    i++;
            //}
            Console.WriteLine("{{ {0} }}", string.Join(",\n", table.Select((item) => (item != null) ? item.ToString() : "Null").ToArray()));
        }
        private void Recompute()
        {
            if (!initialized)
            {
                return;
            }

            double positionTheta  = (double)positionThetaNumeric.Value;
            double positionPhi    = (double)positionPhiNumeric.Value;
            double directionTheta = (double)directionThetaNumeric.Value;
            double directionPhi   = (double)directionPhiNumeric.Value;
            var    inputRay       = new LensRayTransferFunction.Parameters(
                positionTheta, positionPhi, directionTheta, directionPhi);

            var variableParam = (LensRayTransferFunction.VariableParameter)
                                variableParameterComboBox.SelectedValue;

            outgoingRays = lrtf.SampleLrtf1D(inputRay, variableParam, sampleCount);

            InvalidatePanels();
        }
        public void CompareInterpolatedLrtfValueWithOriginalOnes()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);

            int    sampleCount = 128;
            string filename    = string.Format(@"data\lrtf_double_gauss_{0}.bin", sampleCount);
            var    table       = lrtf.SampleLrtf3DCached(sampleCount, filename);

            Random random = new Random();

            for (int i = 0; i < 1000; i++)
            {
                var incomingParams = new LensRayTransferFunction.Parameters(
                    random.NextDouble(), random.NextDouble(),
                    random.NextDouble(), random.NextDouble()
                    );
                var outgoingParamsOriginal     = lrtf.ComputeLrtf(incomingParams).ToVector4d();
                var outgoingParamsInterpolated = table.EvaluateLrtf3D(incomingParams).ToVector4d();
                //AssertEqualVector4d(outgoingParamsOriginal, outgoingParamsInterpolated);
            }
        }