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);
                }
            }
        }
Пример #2
0
        public void PrepareLrtfLens(ComplexLens lens, string name)
        {
            int sampleCount = (int)lrtfSampleCountNumeric.Value;

            precomputedComplexLens = new PrecomputedComplexLens(lens,
                                                                @"data\lrtf_" + name + @"_{0}.bin", sampleCount);
            rayTracer.Camera.Lens = precomputedComplexLens;
        }
Пример #3
0
        private void PrepareLrtf(ComplexLens lens, int sampleCount)
        {
            lrtf = new LensRayTransferFunction(lens);
            // load precomputed LRTF from a file or compute it and save to file
            string filename = string.Format(@"data\lrtf_double_gauss_{0}.bin", sampleCount);

            lrtfTable = lrtf.SampleLrtf3DCached(sampleCount, filename);
        }
Пример #4
0
 private ComplexLens CreateLens()
 {
     //double curvatureRadius = 150;
     //double apertureRadius = 100;
     //return ComplexLens.CreateBiconvexLens(curvatureRadius, apertureRadius, 0);
     return(ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0));
     //return ComplexLens.CreatePetzvalLens(Materials.Fixed.AIR, 4.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);
        }
Пример #6
0
 private IList <ComplexLens> CreateLenses()
 {
     return(new List <ComplexLens>(
                new[] {
         ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0),
         ComplexLens.CreatePetzvalLens(Materials.Fixed.AIR, 4.0),
         ComplexLens.CreateBiconvexLens(150, 100, 0)
     }
                ));
 }
        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));
            }
        }
Пример #9
0
        public void TraceRays()
        {
            ComplexLens lens = ComplexLens.CreateBiconvexLens(4, 2, 0);

            Sampler  sampler         = new Sampler();
            int      sampleCount     = 64;
            int      sqrtSampleCount = (int)Math.Sqrt(sampleCount);
            Vector3d objectPos       = new Vector3d(10, 0, 100);

            foreach (Vector2d sample in sampler.GenerateJitteredSamples(sqrtSampleCount))
            {
                Vector3d lensPos = lens.GetBackSurfaceSample(sample);
                Ray      result  = lens.Transfer(objectPos, lensPos);
            }
        }
Пример #10
0
        public ComplexLensForm()
        {
            InitializeComponent();
            complexLens = CreateLens();
            if (showAlsoLrtf)
            {
                PrepareLrtf(complexLens, 128);
            }
            //directionPhi = Math.PI;
            directionPhi = 1.0;
            incomingRay  = new Ray(new Vector3d(25, 0, 300), new Vector3d(Math.Sin(directionPhi), 0, Math.Cos(directionPhi)));

            rayDirectionPhiNumeric.Value = (decimal)directionPhi;
            FillVectorToControls(incomingRay.Origin, rayOriginXNumeric, rayOriginYNumeric, rayOriginZNumeric);
            initialized = true;
            Recompute();
        }
Пример #11
0
        static void Main(string[] args)
        {
            //ComplexLens lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            //string lensName = "double_gauss";

            ComplexLens lens     = ComplexLens.CreatePetzvalLens(Materials.Fixed.AIR, 4.0);
            string      lensName = "petzval";

            //ComplexLens lens = ComplexLens.CreateBiconvexLens(150, 100, 0);
            //string lensName = "biconvex";

            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);

            int sampleCount = 128;

            Stopwatch stopwatch = Stopwatch.StartNew();

            var table = lrtf.SampleLrtf3D(sampleCount);

            stopwatch.Stop();

            //for (int i = 0; i < sampleCount; i++)
            //{
            //    for (int j = 0; j < sampleCount; j++)
            //    {
            //        for (int k = 0; k < sampleCount; k++)
            //        {
            //            var value = new LensRayTransferFunction.Parameters(table.Table[i, j, k]);
            //            Console.WriteLine((value != null) ? value.ToString() : "null");
            //        }
            //        Console.WriteLine();
            //    }
            //}

            Console.WriteLine("Size: {0}x{0}x{0}, elapsed time: {1} ms", sampleCount, stopwatch.ElapsedMilliseconds);

            string filename = string.Format(@"data\lrtf_{0}_{1}.bin", lensName, sampleCount);

            stopwatch.Reset();
            stopwatch.Start();
            table.Save(filename);
            stopwatch.Stop();

            Console.WriteLine("Saved sampled LRTF into file: {0}, elapsed time: {1} ms", filename, stopwatch.ElapsedMilliseconds);
        }
Пример #12
0
        public void TraceSingleRay()
        {
            ComplexLens lens = ComplexLens.CreateBiconvexLens(4, 2, 0);

            Sampler      sampler         = new Sampler();
            int          sampleCount     = 64;
            int          sqrtSampleCount = (int)Math.Sqrt(sampleCount);
            Vector3d     objectPos       = new Vector3d(10, 0, 100);
            Vector3d     direction       = new Vector3d(0, 0, 0);
            Ray          ray             = new Ray(objectPos, direction);
            Intersection isec            = lens.Intersect(ray);

            if (isec == null)
            {
                return;
            }
            Ray result = lens.Transfer(objectPos, isec.Position);
        }
        public void CompareEvaluationTime()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);

            int sampleCount = 128;

            Console.WriteLine("LRTF table size: {0}x{0}x{0}", sampleCount);
            string filename = string.Format(@"data\lrtf_double_gauss_{0}.bin", sampleCount);
            var    table    = lrtf.SampleLrtf3DCached(sampleCount, filename);

            int valueCount = 1000000;

            Console.WriteLine("Number of values to evaluate: {0}", valueCount);

            Random random   = new Random();
            var    inParams = new List <LensRayTransferFunction.Parameters>();

            for (int i = 0; i < valueCount; i++)
            {
                inParams.Add(new LensRayTransferFunction.Parameters(
                                 random.NextDouble(), random.NextDouble(),
                                 random.NextDouble(), random.NextDouble()
                                 ));
            }
            Stopwatch stopwatch = Stopwatch.StartNew();

            foreach (var inParam in inParams)
            {
                lrtf.ComputeLrtf(inParam);
            }
            stopwatch.Stop();
            Console.WriteLine("Ray tracing: {0} ms", stopwatch.ElapsedMilliseconds);
            stopwatch.Reset();
            stopwatch.Start();
            foreach (var inParam in inParams)
            {
                table.EvaluateLrtf3D(inParam);
            }
            stopwatch.Stop();
            Console.WriteLine("LRTF table interpolation: {0} ms", stopwatch.ElapsedMilliseconds);
        }
        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()));
        }
Пример #15
0
        public BiconvexLensForm()
        {
            InitializeComponent();
            biconvexLens = new BiconvexLens()
            {
                CurvatureRadius = 150,
                ApertureRadius  = 100,
                RefractiveIndex = Materials.Fixed.GLASS_CROWN_BK7
            };
            complexLens = ComplexLens.CreateBiconvexLens(150, 100, 0);
            double directionPhi = Math.PI;

            incomingRay = new Ray(new Vector3d(70, 0, 150), new Vector3d(Math.Sin(directionPhi), 0, Math.Cos(directionPhi)));

            rayDirectionPhiNumeric.Value = (decimal)directionPhi;
            curvatureRadiusNumeric.Value = (decimal)biconvexLens.CurvatureRadius;
            apertureRadiusNumeric.Value  = (decimal)biconvexLens.ApertureRadius;
            FillVectorToControls(incomingRay.Origin, rayOriginXNumeric, rayOriginYNumeric, rayOriginZNumeric);
            initialized = true;
            Recompute();
        }
        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);
            }
        }
        public void SampleLrtfSaveLoadAndCompare()
        {
            ComplexLens             lens = ComplexLens.CreateDoubleGaussLens(Materials.Fixed.AIR, 4.0);
            LensRayTransferFunction lrtf = new LensRayTransferFunction(lens);

            int sampleCount = 16;

            var table = lrtf.SampleLrtf3D(sampleCount);

            Console.WriteLine("Size: {0}x{0}x{0}", sampleCount);

            string filename = string.Format("lrtf_double_gauss_{0}.bin", sampleCount);

            table.Save(filename);

            Console.WriteLine("Saved sampled LRTF into file: {0}", filename);

            Console.WriteLine("Trying to load sampled LRTF from file and compare...");

            var recoveredTable = LensRayTransferFunction.Table3d.Load(filename);

            Assert.Equal(sampleCount, recoveredTable.Size);

            for (int i = 0; i < sampleCount; i++)
            {
                for (int j = 0; j < sampleCount; j++)
                {
                    for (int k = 0; k < sampleCount; k++)
                    {
                        Vector4d orig      = table.Table[i, j, k];
                        Vector4d recovered = recoveredTable.Table[i, j, k];
                        AssertEqualVector4d(orig, recovered);
                    }
                }
            }

            Console.WriteLine("Compared OK");
        }
Пример #18
0
        private void DrawComplexLens(Graphics g, Func <Vector3d, Point> projFunc, ComplexLens lens)
        {
            float maxApertureRadius = (float)lens.ElementSurfaces.Select(
                surface => surface.ApertureRadius).Max();

            // draw spheres
            foreach (var surface in lens.ElementSurfaces)
            {
                if (surface.Surface is Sphere)
                {
                    Sphere sphere = (Sphere)surface.Surface;
                    //DrawCircle(g, Pens.Blue, projFunc(sphere.Center), (float)sphere.Radius);
                    //FillSquare(g, Brushes.Aquamarine, projFunc(sphere.Center), 3);
                    DrawSphericalCap(g, sphere, surface.ApertureRadius, surface.Convex);
                }
                else if (surface.Surface is Circle)
                {
                    Circle circle = (Circle)surface.Surface;
                    DrawCircularStop(g, Pens.Violet, projFunc(
                                         new Vector3d(0, 0, circle.Z)), (float)circle.Radius, maxApertureRadius);
                }
            }
        }