//
        //                     Добавление фазового сдвига  fz и получение голограммы
        //
        public static ZArrayDescriptor Model_pl_PSI(double am, ZComplexDescriptor cmpl0,
                                                    double AngleX, double AngleY, double Lambda, double dx, double noise, double fz)
        {
            int    NX = cmpl0.width;
            int    NY = cmpl0.height;
            double kx = dx / NX;
            double ky = dx / NY;

            ZArrayDescriptor cmpl = new ZArrayDescriptor(NX, NY);     // Результирующий фронт

            am = SumClass.getAverage(cmpl0);                          // Амплитуда опорного пучка равна средней амплитуды объектного
            //MessageBox.Show("am = " + am + " fz= " + fz);

            Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);

            for (int i = 0; i < NX; i++)
            {
                for (int j = 0; j < NY; j++)
                {
                    double fz1 = 2 * Math.PI * (Math.Sin(AngleX) * kx * i + Math.Sin(AngleY) * ky * j) / Lambda;
                    double fa  = rnd.NextDouble() * 2.0 * Math.PI - Math.PI;

                    double f0 = fz1 + fa * noise + fz;

                    double Ap = cmpl0.array[i, j].Magnitude;                                   // амплитуда объектного пучка
                    double Fp = cmpl0.array[i, j].Phase;                                       // Фаза объектного пучка
                    cmpl.array[i, j] = Ap * Ap + am * am + 2 * Ap * am * Math.Cos(Fp - f0);    // Интенсивность
                }
            }

            return(cmpl);
        }
예제 #2
0
        public static void Diapazon(double a1, double a2)             // Привести к диапазону вещественный кадр
        {
            if (Form1.zArrayDescriptor[Form1.regImage] == null)
            {
                MessageBox.Show("Diapazon zArrayDescriptor[" + Form1.regImage + "] == NULL"); return;
            }
            int nx = Form1.zArrayDescriptor[Form1.regImage].width;
            int ny = Form1.zArrayDescriptor[Form1.regImage].height;

            //ZArrayDescriptor rez = new ZArrayDescriptor(nx, ny);

            double min = SumClass.getMin(Form1.zArrayDescriptor[Form1.regImage]);
            double max = SumClass.getMax(Form1.zArrayDescriptor[Form1.regImage]);

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    double d = Form1.zArrayDescriptor[Form1.regImage].array[i, j];
                    Form1.zArrayDescriptor[Form1.regImage].array[i, j] = (d - min) * (a2 - a1) / (max - min) + a1;
                }
            }


            VisualRegImage(Form1.regImage);
        }
        // Сложение с плоской волной => интенсивность в центральное окно

        public static ZArrayDescriptor Model_pl_ADD_I(double am, ZComplexDescriptor cmpl0,
                                                      double AngleX, double AngleY, double Lambda, double dx, double noise, double fzr)
        {
            MessageBox.Show("am = " + am);
            int NX = cmpl0.width;
            int NY = cmpl0.height;

            //ZComplexDescriptor cmpl1 = new ZComplexDescriptor(NX, NY);      // Фронт под углом AngleX,  AngleY
            ZArrayDescriptor cmpl = new ZArrayDescriptor(NX, NY);             // Результирующая интенсивность
            double           kx   = dx / NX;
            double           ky   = dx / NY;

            // a = (a - min) * 2.0 * Math.PI / (max - min);   -pi +pi
            //am = SumClass.getAverage(cmpl0);  // Средняя интенсивность комплексного массива

            Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);

            for (int i = 0; i < NX; i++)
            {
                for (int j = 0; j < NY; j++)
                {
                    double fz = 2 * Math.PI * (Math.Sin(AngleX) * kx * i + Math.Sin(AngleY) * ky * j) / Lambda;
                    double fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI;
                    double f0 = fz + fa * noise + fzr;
                    //Complex Pl = Complex.FromPolarCoordinates(am, f0);

                    //cmpl.array[i, j] = cmpl0.array[i, j] + Pl;
                    double a = cmpl0.array[i, j].Magnitude;
                    double f = cmpl0.array[i, j].Phase;
                    cmpl.array[i, j] = a * a + am * am + 2 * a * am * Math.Cos(f - f0);
                }
            }
            cmpl = SumClass.Range_Array1(cmpl, am);      // Приведение к диапазону от 0 до am
            return(cmpl);
        }
        // Сложение с плоской волной --------------------------------------------------------------------

        public static ZComplexDescriptor Model_pl_ADD_PSI(double am, ZComplexDescriptor cmpl0,
                                                          double AngleX, double AngleY, double Lambda, double dx, double noise, double fzr)
        {
            int NX = cmpl0.width;
            int NY = cmpl0.height;

            //ZComplexDescriptor cmpl1 = new ZComplexDescriptor(NX, NY);     // Фронт под углом AngleX,  AngleY
            ZComplexDescriptor cmpl = new ZComplexDescriptor(NX, NY);        // Результирующий фронт
            double             kx   = dx / NX;
            double             ky   = dx / NY;

            am = SumClass.getAverage(cmpl0);                                 // Среднее значение
            // a = (a - min) * 2.0 * Math.PI / (max - min);   -pi +pi

            Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);

            for (int i = 0; i < NX; i++)
            {
                for (int j = 0; j < NY; j++)
                {
                    double  fz = 2 * Math.PI * (Math.Sin(AngleX) * kx * i + Math.Sin(AngleY) * ky * j) / Lambda;
                    double  fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI;
                    double  f0 = fz + fa * noise + fzr;
                    Complex Pl = Complex.FromPolarCoordinates(am, f0);

                    cmpl.array[i, j] = cmpl0.array[i, j] + Pl;
                }
            }

            return(cmpl);
        }
예제 #5
0
        // Конструктор для заполнения фазы (Амплитуда постоянная)

        public ZComplexDescriptor(ZArrayDescriptor descriptorToCopy, double am)
        {
            if (descriptorToCopy == null)
            {
                MessageBox.Show("ZComplexDescriptor == NULL"); return;
            }

            width  = descriptorToCopy.width;
            height = descriptorToCopy.height;
            array  = new Complex[width, height];

            double max = SumClass.getMax(descriptorToCopy);
            double min = SumClass.getMin(descriptorToCopy);

            //MessageBox.Show("width =" + Convert.ToString(width) + "height =" + Convert.ToString(height));
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    double a = descriptorToCopy.array[i, j];
                    a           = (a - min) * 2.0 * Math.PI / (max - min);
                    a           = a - Math.PI;
                    array[i, j] = Complex.FromPolarCoordinates(am, a);

                    //array[i, j] = new Complex(1.0, descriptorToCopy.array[i, j]);
                }
            }
        }
예제 #6
0
        // Конструктор для случайного заполнения фазы (RANDOM) (Амплитуда из файла, k=1)

        public ZComplexDescriptor(ZArrayDescriptor descriptorToCopy, ZArrayDescriptor amp, int k)
        {
            if (amp == null)
            {
                MessageBox.Show("Ampl == NULL");               return;
            }
            if (descriptorToCopy == null)
            {
                MessageBox.Show("ZArrayDescriptor   == NULL"); return;
            }
            if (k != 1)
            {
                MessageBox.Show(" k!=1 ");                     return;
            }

            width  = amp.width;
            height = amp.height;
            array  = new Complex[width, height];

            double max = SumClass.getMax(descriptorToCopy);
            double min = SumClass.getMin(descriptorToCopy);

            int NX = descriptorToCopy.width;
            int NY = descriptorToCopy.height;

            if (NX > width)
            {
                NX = width;
            }
            if (NY > height)
            {
                NY = height;
            }
            //MessageBox.Show("width =" + Convert.ToString(width) + "height =" + Convert.ToString(height));
            Random rnd = new Random();

            for (int i = 0; i < NX; i++)
            {
                for (int j = 0; j < NY; j++)
                {
                    double am = amp.array[i, j];
                    double fz = descriptorToCopy.array[i, j];
                    double fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI;
                    fz = fz + fa;
                    //if (fz > Math.PI) fz = fz - Math.PI;
                    //if (fz < -Math.PI) fz = fz + Math.PI;
                    if (am <= 0)
                    {
                        fz = 0;                                       // По шаблону
                    }
                    //if (a > 0) a = rnd.NextDouble() *  Math.PI ; else a = 0;
                    array[i, j] = Complex.FromPolarCoordinates(am, fz);
                }
            }
        }
예제 #7
0
        public static void Diapazon_С(double a1, double a2)             // Привести к диапазону комплексный кадр
        {
            if (Form1.zComplex[Form1.regComplex] == null)
            {
                MessageBox.Show("Diapazon zComplex[" + Form1.regComplex + "] == NULL"); return;
            }

            int nx = Form1.zComplex[Form1.regComplex].width;
            int ny = Form1.zComplex[Form1.regComplex].height;

            ZArrayDescriptor rez = new ZArrayDescriptor(nx, ny);

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    rez.array[i, j] = Form1.zComplex[Form1.regComplex].array[i, j].Magnitude;
                }
            }

            double min = SumClass.getMin(rez);
            double max = SumClass.getMax(rez);

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    double d = rez.array[i, j];
                    rez.array[i, j] = (d - min) * (a2 - a1) / (max - min) + a1;
                }
            }

            ZComplexDescriptor rezc = new ZComplexDescriptor(Form1.zComplex[Form1.regComplex], rez);  // Амплитуда в rez, фаза старая

            Form1.zComplex[Form1.regComplex] = rezc;

            ComplexPictureImage(Form1.regComplex);
        }
        public static ZComplexDescriptor Model_SpSUB(double am, double Lambda, int NX, int NY, double dx, double d)
        {
            ZComplexDescriptor cmpl1 = Model_Sp(am, Lambda, NX, NY, dx, d);
            ZComplexDescriptor cmpl2 = Model_Sp1(am, Lambda, NX, NY, dx, d);
            ZArrayDescriptor   sub   = new  ZArrayDescriptor(NX, NY);

            double s, s1;

            for (int i = 0; i < NX; i++)
            {
                for (int j = 0; j < NY; j++)
                {
                    s  = cmpl1.array[i, j].Phase;
                    s1 = cmpl2.array[i, j].Phase;
                    sub.array[i, j] = Math.Abs(s1 - s);
                }
            }

            double max = (SumClass.getMax(sub) - SumClass.getMin(sub)) / Math.PI;

            MessageBox.Show(" Разброс в PI = " + max);
            return(cmpl1);
        }