Example #1
0
        private void Spline_Click(object sender, RoutedEventArgs e)
        {
            CubicSplineInterpolation csi = new CubicSplineInterpolation();

            csi.ShowDialog();
        }
Example #2
0
        static void Interpolation(string path)
        {
            //n, k 값을 보간하기 위해
            #region 물성값 파일 읽어오기
            string[] LoadingData;           // 물성값 데이터 저장할 배열. (한 줄씩 저장)
            string[] ColumnData;            // 물성 데이터를 임시로 저장할 배열.

            LoadingData = File.ReadAllLines(path);
            int LoopNum = LoadingData.Length;

            double[] wavelength = new double[LoopNum - 1];
            double[] n          = new double[LoopNum - 1];
            double[] k          = new double[LoopNum - 1];

            // 데이터의 첫번째 줄은 column 명이다.
            // 이를 제외하기 위해 반복문을 1부터 시작한다.
            int    StartIndex     = 1;
            char[] DelimiterChars = { ' ', '\t', '\n', ',' };

            for (int i = StartIndex; i < LoopNum; i++)
            {
                // Split한 데이터를 ColumnData에 저장한다.
                ColumnData = LoadingData[i].Split(DelimiterChars, StringSplitOptions.RemoveEmptyEntries);

                // 각 컬럼에 해당하는 데이터를 저장한다.
                wavelength[i - 1] = double.Parse(ColumnData[0]);
                n[i - 1]          = double.Parse(ColumnData[1]);
                k[i - 1]          = double.Parse(ColumnData[2]);
            }
            #endregion

            #region 기준이 될 측정 스펙트럼 파일 읽어오기
            // 2nm_on_si 스펙트럼 기준
            string[] SpectrumData;              // 측정 스펙트럼 데이터 저장할 배열. (한 줄씩 저장)
            string[] StdWavelength;             // 기준이 될 wavelength 값 저장할 배열

            SpectrumData = File.ReadAllLines("SiO2 2nm_on_Si_new.dat");
            int DataNum = SpectrumData.Length;

            double[] Abscissa = new double[DataNum - 1];

            for (int i = StartIndex; i < DataNum; i++)
            {
                // Split한 데이터를 StdWavelength에 저장한다.
                StdWavelength = SpectrumData[i].Split(DelimiterChars, StringSplitOptions.RemoveEmptyEntries);

                // wavelength에 해당하는 데이터를 저장한다.
                Abscissa[i - 1] = double.Parse(StdWavelength[0]);
            }

            //350~1000까지 간격 1nm
            //double[] Abscissa = new double[631];
            //for (int i = 0; i < 631; i++)
            //{
            //    Abscissa[i] = 350 + i;
            //}

            #endregion



            //보간
            CubicSplineInterpolation CS_n = new CubicSplineInterpolation(wavelength, n);
            CubicSplineInterpolation CS_k = new CubicSplineInterpolation(wavelength, k);

            #region new.txt 파일로 저장
            if (path == "SiO2_nm.txt")
            {
                path = "SiO2_new.txt";
                //path = "SiO2_new2.txt";
            }
            else if (path == "Si_nm.txt")
            {
                path = "Si_new.txt";
                //path = "Si_new2.txt";
            }
            else if (path == "SiN.txt")
            {
                path = "SiN_new.txt";
                //path = "SiN_new2.txt";
            }
            using (StreamWriter NewInterpolationFile = new StreamWriter(path))
            {
                // 컬럼 명 쓰기.
                NewInterpolationFile.WriteLine(
                    $"wavelength(nm)\t" +
                    $"n\t" +
                    $"k");

                // 스펙트럼 데이터 쓰기.
                foreach (double axis in Abscissa)
                {
                    Console.WriteLine(axis + "\t"
                                      + CS_n.Interpolate(axis) + "\t"
                                      + CS_k.Interpolate(axis));
                    NewInterpolationFile.WriteLine(axis + "\t"
                                                   + CS_n.Interpolate(axis) + "\t"
                                                   + CS_k.Interpolate(axis));
                }
            }
            #endregion
        }