private void createSplineToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Spline_points.Count < 4)
            {
                return;
            }

            for (int i = 0; i < Spline_points.Count; i++)
            {
                float a0_x =
                    (Spline_points[i % Spline_points.Count].X
                     + 4 * Spline_points[(i + 1) % Spline_points.Count].X
                     + Spline_points[(i + 2) % Spline_points.Count].X) / 6;
                float a1_x =
                    (-Spline_points[i % Spline_points.Count].X
                     + Spline_points[(i + 2) % Spline_points.Count].X) / 2;
                float a2_x =
                    (Spline_points[i % Spline_points.Count].X
                     - 2 * Spline_points[(i + 1) % Spline_points.Count].X
                     + Spline_points[(i + 2) % Spline_points.Count].X) / 2;
                float a3_x =
                    (-Spline_points[i % Spline_points.Count].X
                     + 3 * Spline_points[(i + 1) % Spline_points.Count].X
                     - 3 * Spline_points[(i + 2) % Spline_points.Count].X
                     + Spline_points[(i + 3) % Spline_points.Count].X) / 6;

                float a0_y =
                    (Spline_points[i % Spline_points.Count].Y
                     + 4 * Spline_points[(i + 1) % Spline_points.Count].Y
                     + Spline_points[(i + 2) % Spline_points.Count].Y) / 6;
                float a1_y =
                    (-Spline_points[i % Spline_points.Count].Y
                     + Spline_points[(i + 2) % Spline_points.Count].Y) / 2;
                float a2_y =
                    (Spline_points[i % Spline_points.Count].Y
                     - 2 * Spline_points[(i + 1) % Spline_points.Count].Y
                     + Spline_points[(i + 2) % Spline_points.Count].Y) / 2;
                float a3_y =
                    (-Spline_points[i % Spline_points.Count].Y
                     + 3 * Spline_points[(i + 1) % Spline_points.Count].Y
                     - 3 * Spline_points[(i + 2) % Spline_points.Count].Y
                     + Spline_points[(i + 3) % Spline_points.Count].Y) / 6;

                float a0_z =
                    (Spline_points[i % Spline_points.Count].Z
                     + 4 * Spline_points[(i + 1) % Spline_points.Count].Z
                     + Spline_points[(i + 2) % Spline_points.Count].Z) / 6;
                float a1_z =
                    (-Spline_points[i % Spline_points.Count].Z
                     + Spline_points[(i + 2) % Spline_points.Count].Z) / 2;
                float a2_z =
                    (Spline_points[i % Spline_points.Count].Z
                     - 2 * Spline_points[(i + 1) % Spline_points.Count].Z
                     + Spline_points[(i + 2) % Spline_points.Count].Z) / 2;
                float a3_z =
                    (-Spline_points[i % Spline_points.Count].Z
                     + 3 * Spline_points[(i + 1) % Spline_points.Count].Z
                     - 3 * Spline_points[(i + 2) % Spline_points.Count].Z
                     + Spline_points[(i + 3) % Spline_points.Count].Z) / 6;

                for (float t = 0; t < 1; t += spline_step)
                {
                    GR_Point p = new GR_Point(
                        ((a3_x * t + a2_x) * t + a1_x) * t + a0_x,
                        ((a3_y * t + a2_y) * t + a1_y) * t + a0_y,
                        ((a3_z * t + a2_z) * t + a1_z) * t + a0_z,
                        2,
                        Color.Black
                        );
                    mainScene.AddPoint_with_relative_coords(p);
                }
            }
        }