private ZArrayDescriptor GenerateWedge(int mValue, int width, int imageHeight, int imageWidth, double?mRatio = null)
        {
            ZArrayDescriptor arrayDescriptor = new ZArrayDescriptor(imageWidth + BLACK_SIDE_WIDTH, imageHeight);

            double maxIntensity = WEDGE_MAX_INTENSITY_VALUE;

            if (mRatio.HasValue)
            {
                maxIntensity = mRatio.Value * (WEDGE_MAX_INTENSITY_VALUE - WEDGE_MIN_INTENSITY_VALUE) + WEDGE_MIN_INTENSITY_VALUE;
            }

            Interval <double> interval1 = new Interval <double>(0, mValue - 1);
            Interval <double> interval2 = new Interval <double>(WEDGE_MIN_INTENSITY_VALUE, maxIntensity);

            RealIntervalTransform intervalTransform = new RealIntervalTransform(interval1, interval2);

            int[] array        = new int[width];
            int   currentValue = 0;

            //Create wedge 0..m
            for (int j = 0; j < width; j++)
            {
                if (currentValue >= mValue - 1)
                {
                    currentValue = 0;
                }
                array[j] = currentValue;
                currentValue++;
            }

            CorrectBr correctBr = new CorrectBr();

            double[] interpolatedClin = correctBr.InterpolateClin(clin);

            int qq = Convert.ToInt32(maxIntensity);

            //Stretch wedge to image width
            int k = imageWidth / (array.Length) + 1;

            for (int x = 0; x < imageWidth - 1; x++)
            {
                int i = x / k;
                for (int y = 0; y < imageHeight - 1; y++)
                {
                    double value = intervalTransform.TransformToFinishIntervalValue(array[i]);
                    //double correctedValue = CorrectBr.CorrectValueByClin(value, interpolatedClin, qq);
                    double correctedValue = value;
                    arrayDescriptor.array[x, y] = correctedValue;
                }
            }

            return(arrayDescriptor);
        }
        /// <summary>
        /// Синусоиды с учетом клина

        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ModelSinByClinButton_Click(object sender, EventArgs e)
        {
            double[] fzrad = new double[8];

            gamma   = Convert.ToDouble(textBox5.Text);
            N_pol   = Convert.ToDouble(textBox6.Text);   // Число точек на полоссу
            N_urovn = Convert.ToDouble(textBox8.Text);   // Амплитуда
            kr      = Convert.ToInt32(textBox9.Text);    // Разрядка нулями
            Nx      = Convert.ToInt32(textBox10.Text);
            Ny      = Convert.ToInt32(textBox12.Text);
            noise   = Convert.ToDouble(textBox11.Text);
            N_sdv   = Convert.ToInt32(textBox17.Text);   // Число сдвигов

            double minIntensity = 0;

            if (N_sdv > 8)
            {
                MessageBox.Show("Число сдвигов больше 8", "Message", MessageBoxButtons.OK);
            }


            fzrad = new double[8];

            fzrad[0] = Math.PI * Convert.ToDouble(textBox1.Text) / 180.0;   // Фаза в радианах
            fzrad[1] = Math.PI * Convert.ToDouble(textBox2.Text) / 180.0;
            fzrad[2] = Math.PI * Convert.ToDouble(textBox3.Text) / 180.0;
            fzrad[3] = Math.PI * Convert.ToDouble(textBox4.Text) / 180.0;

            fzrad[4] = Math.PI * Convert.ToDouble(textBox13.Text) / 180.0;
            fzrad[5] = Math.PI * Convert.ToDouble(textBox14.Text) / 180.0;
            fzrad[6] = Math.PI * Convert.ToDouble(textBox15.Text) / 180.0;
            fzrad[7] = Math.PI * Convert.ToDouble(textBox16.Text) / 180.0;

            CorrectBr correctBr = new CorrectBr();

            double[] interpolatedClin = correctBr.InterpolateClin(clin);

            //OnModelSin1(fzrad, N_sdv, N_urovn, gamma, N_pol, kr, Nx, Ny, noise, interpolatedClin);
            for (int i = 0; i < N_sdv; i++)
            {
                Form1.zArrayDescriptor[Form1.regComplex * 4 + i] = Model_Sinus.Sinus1(fzrad[i], N_urovn, N_pol, gamma, kr, Nx, Ny, noise, minIntensity, interpolatedClin);
                VisualRegImage(Form1.regComplex * 4 + i);
            }
            Close();
        }
Exemple #3
0
        /// <summary>
        /// Моделирование синусоидальной картины с заданным в точках размером полос
        /// </summary>
        /// <param name="fz"></param>           фазовый сдвиг полос
        /// <param name="a"></param>            амплитуда
        /// <param name="n_polos"></param>      размер полосы в точках
        /// <param name="gamma"></param>        гамма искажения
        /// <param name="Nx"></param>           размер по X
        /// <param name="Ny"></param>           размер по Y
        /// <param name="noise"></param>        шум в долях амплитуды (0,1)*a
        /// <returns></returns>
        public static ZArrayDescriptor Sinus1
        (
            double fz,
            double a,
            double n_polos,
            double gamma,
            int kr,
            int Nx,
            int Ny,
            double noise,
            double minIntensity,
            double[] clinArray = null
        )
        {
            int kr1 = kr + 1;

            int NX = Nx * kr1;
            int NY = Ny * kr1;
            //MessageBox.Show(" n_polos " + n_polos);

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

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

            //double kx = 2.0 * Math.PI / NX;

            // a = (a - min) * 2.0 * Math.PI / (max - min);   -pi +pi

            double a1 = a - minIntensity;

            double[] sn = new double[NX];

            for (int i = 0; i < NX; i += kr1)
            {
                double v = minIntensity + a1 * (Math.Sin(2.0 * Math.PI * i / n_polos - fz) + 1.0) / 2.0;          // синусоида от 0 до 1
                sn[i] = CorrectBr.CorrectValueByClin(v, clinArray, 255);
            }

            // double max = double.MinValue;
            //  double min = double.MaxValue;

            for (int j = 0; j < NY; j++)
            {
                for (int i = 0; i < NX; i += kr1)
                {
                    double fz1 = sn[i];                                                             // синусоида от 0 до 1
                    double fa  = (0.5 - rnd.NextDouble()) * a * noise;                              //rnd.NextDouble() 0-1
                    double s   = fz1 + fa;
                    //double s = Math.Pow(fz1, gamma);                                                // Гамма искажения
                    //double s = fz1;
                    //if (s > max) max = s;  if (s < min) min = s;
                    cmpl.array[i, j] = s;
                }
            }
            //double maxmin = max - min;

            //for (int j = 0; j < NY; j++)
            //    for (int i = 0; i < NX; i += kr1)
            //    {
            //        cmpl.array[i, j] = (cmpl.array[i, j] - min) * a / maxmin;
            //    }


            return(cmpl);
        }