public RayTraceParameters(OpticalSystem system)
        {
            this._sequence         = new List <Element>();
            this._sequential_mode  = true;
            this._intensity_mode   = RayTracer.TraceIntensityMode.Simpletrace;
            this._propagation_mode = PropagationMode.RayPropagation;
            this._max_bounce       = 50;
            this._unobstructed     = false;
            this._lost_ray_length  = 1000;
            foreach (Element e in system.elements())
            {
                add(e);
            }

            _sequence.Sort((a, b) =>
            {
                double z1 = a.get_position().z();
                double z2 = b.get_position().z();
                if (z1 > z2)
                {
                    return(1);
                }
                else if (z1 < z2)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            });
            this._default_distribution = new Distribution(Pattern.MeridionalDist, 10, 0.999);
        }
        void draw_2d(RendererSvg r, OpticalSystem system)
        {
            // optical axis
            Vector3Pair b = system.get_bounding_box();

            r.draw_segment(new Vector2Pair(new Vector2(b.v0.z(), 0.0), new Vector2(b.v1.z(), 0.0)), Rgb.rgb_gray);

            foreach (Element e in system.elements())
            {
                draw_element_2d(r, e, null);
            }
        }
            public OpticalSystem build()
            {
                generateIds();
                Transform3Cache transform3Cache = setCoordinates();
                List <Element>  elements        = buildElements();
                OpticalSystem   system          = new OpticalSystem(elements, transform3Cache);

                foreach (Element e in system.elements())
                {
                    e.set_system(system);
                }

                return(system);
            }