private double SolidAngle() { Func <Vector_3d, Vector_3d, Vector_3d, double> solid_angle_estimator = (Vector_3d r1, Vector_3d r2, Vector_3d r3) => { double numerator = Math.Abs(Vector_3d.Scalar(r1, Vector_3d.Vector(r2, r3))); double denumerator = r1.Lenght * r2.Lenght * r3.Lenght + Vector_3d.Scalar(r1, r2) * r3.Lenght + Vector_3d.Scalar(r2, r3) * r1.Lenght + Vector_3d.Scalar(r3, r1) * r2.Lenght; return(2.0 * Math.Atan2(numerator, denumerator)); }; Vector_3d mirror_center = new Vector_3d(this.SrcDist * Math.Cos(Rad(this.ScatterAngle)), this.SrcDist * Math.Sin(Rad(this.ScatterAngle)), 0.0); Vector_3d upper_left = new Vector_3d(mirror_center.x - this.crystalW / 2, mirror_center.y, this.crystalH / 2.0), down_left = new Vector_3d(mirror_center.x - this.crystalW / 2, mirror_center.y, -this.crystalH / 2.0), upper_right = new Vector_3d(mirror_center.x + this.crystalW / 2, mirror_center.y, this.crystalH / 2.0), down_right = new Vector_3d(mirror_center.x + this.crystalW / 2, mirror_center.y, -this.crystalH / 2.0); double left_triangle = solid_angle_estimator(down_left, upper_left, upper_right); double right_triangle = solid_angle_estimator(upper_right, down_right, down_left); return(left_triangle + right_triangle); }