Exemple #1
0
            public void SetSource(Parameter.SourceType sType,double _SW,int div)
            {
                pm.SW = _SW;

                s = new Coord1D(div);


                if (sType==Parameter.SourceType.Gaussian)
                {
                    double sigma = pm.SW / (2.0 * Math.Sqrt(2 * Math.Log(2.0)));
                    for (int i = 0; i < div; i++)
                    {
                        s.x[i] = s_xc;
                        s.y[i] = s_yc + 4.0 * (-div / 2.0 + i) * pm.SW / div;
                        s.u[i] = new Complex(Math.Exp(-s.y[i] * s.y[i] / (2.0 * sigma * sigma)) / (Math.Sqrt(2.0 * Math.PI) * sigma), 0.0);
                    }
                }
                else if(sType==Parameter.SourceType.Rectangle)
                {
                    for (int i = 0; i < div; i++)
                    {
                        s.x[i] = s_xc;
                        s.y[i] = s_yc + (-div / 2.0 + i) * pm.SW;
                        s.u[i] = new Complex(1.0, 0.0);
                    }
                }
                else
                {
                    s = new Coord1D(1);
                    s.x[0]= s_xc;
                    s.y[0] = s_yc;
                    s.u[0] = new Complex(1.0, 0.0);
                }
                s.Rot(pm.theta_s, s.xc, s.yc);

            }
Exemple #2
0
            public void SetDetector(double Fdx,int Fnx,double Fbx,double Fdy,int Fny,double Fby)
            {
                pm.Fdx = Fdx;
                pm.Fdy = Fdy;
                pm.Fnx = Fnx;
                pm.Fny = Fny;
                pm.Fbx = Fbx;
                pm.Fby = Fby;

                f = new Coord1D[pm.Fnx];

                //まず回転していない座標で設定
                for (int i = 0; i < pm.Fnx; i++)
                {
                    f[i] = new Coord1D(pm.Fny);
                    for (int j = 0; j < pm.Fny; j++)
                    {
                        f[i].x[j] = f_xc + (-pm.Fnx / 2 + i) * pm.Fdx + pm.Fbx;
                        f[i].y[j] = f_yc + (-pm.Fny / 2 + j) * pm.Fdy + pm.Fby;
                    }
                }

                //光軸にあわせて回転
                //focus_xc,focus_ycとmirror_xc,mirror_ycの直線に対して傾ける
                double theta = Math.Atan((f_yc - m_yc) / (f_xc - m_xc));
                for (int i = 0; i < pm.Fnx; i++)
                    f[i].Rot(theta, f_xc, f_yc);
            }
Exemple #3
0
            public void Init(Parameter _pm)
            {
                pm = _pm;

                curv = new double[pm.divML];
                theta = new double[pm.divML];
                FigError = new double[pm.divML];

                //ミラー
                m = new Coord1D(pm.divML);
                switch(pm.mirrorType)
                {
                    case Parameter.MirrorType.Ellipse:
                        Ellipse();
                        break;
                    case Parameter.MirrorType.Parabolic:
                        break;
                    case Parameter.MirrorType.Plane:
                        Plane();
                        break;
                }

                //光源
                if (pm.divSW != 0)
                    s = new Coord1D(pm.divSW);
                //焦点
                if (pm.Fnx != 0 && pm.Fny != 0)
                {
                    f = new Coord1D[pm.Fnx];
                    for (int i = 0; i < pm.Fnx; i++)
                        f[i] = new Coord1D(pm.Fny);
                }

                Move(-s_xc, -s_yc);
            }