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); }
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); }
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); }