public static void specified_pos(Needle needle)
        {
            /*
            Needle needle = new Needle(); // for sake of have a valid head position and initial joint values for the following optimizer
            needle.kinematics.joint.UpperBevel = 60;
            needle.kinematics.joint.LowerBevel = 60;
            needle.kinematics.joint.Elbow = 150; // no need for twist, twist will be given in loop
            needle.kinematics.joint.twist=0;
            needle.update_needle();
            */

            Optimizer optimizer = new Optimizer();
            optimizer.point_target.X = NeedleKinematics.get_translation(needle.head).X;
            optimizer.point_target.Y = NeedleKinematics.get_translation(needle.head).Y;
            optimizer.point_target.Z = NeedleKinematics.get_translation(needle.head).Z;

            optimizer.x = new double[3] { needle.kinematics.joint.UpperBevel, needle.kinematics.joint.LowerBevel, needle.kinematics.joint.Elbow };
            int n = 20;
            for (int i = 0; i < n; i++)
            {
                optimizer.point_target.W = i * 360 / n;
                Joints optimized_joints = optimizer.minimize_postionNtwist();
                needle.kinematics.joint=optimized_joints;
                needle.update_needle();
                Print.PrintJointOnFile(optimized_joints);
                Print.PrintMatrixOnFile(needle.center);
                optimizer.x = new double[3] { optimized_joints.UpperBevel, optimized_joints.LowerBevel, optimized_joints.Elbow };
            }
        }
 public Trajectory()
 {
     t = 0;
     head = new Matrix3D();
     needle_entry = new Needle();
     needle_exit = new Needle();
     needle_mid = new Needle();
     interpolation = new Interpolation(); // might be deleted
     optimizer = new Optimizer();
 }
        public void set_entry_needle(Joints joint)
        {
            double central_angle = get_central_angle();
            Optimizer optimizer = new Optimizer();
            Point4D target = new Point4D(entry_point.X, entry_point.Y, entry_point.Z, central_angle);
            Console.Write("\noTarget entry: {0}, {1}, {2}, {3}", entry_point.X, entry_point.Y, entry_point.Z, central_angle);
            optimizer.point_target = target;
            optimizer.x = new double[] { joint.UpperBevel, joint.LowerBevel, joint.Elbow, joint.twist };
            Joints optimized = optimizer.minimize_angle();
            needle_entry.kinematics.joint.UpperBevel = optimized.UpperBevel;
            needle_entry.kinematics.joint.LowerBevel = optimized.LowerBevel;
            needle_entry.kinematics.joint.Elbow = optimized.Elbow;
            needle_entry.kinematics.joint.twist = optimized.twist;
            needle_entry.update_needle();

            // setup needle_mid
            needle_mid.kinematics.joint.UpperBevel = needle_entry.kinematics.joint.UpperBevel;
            needle_mid.kinematics.joint.LowerBevel = needle_entry.kinematics.joint.LowerBevel;
            needle_mid.kinematics.joint.Elbow = needle_entry.kinematics.joint.Elbow;
            needle_mid.kinematics.joint.twist = needle_entry.kinematics.joint.twist;
            needle_mid.update_needle();
        }
 // needle center for the needle frame and a point
 public Joints update_trajectory(Joints joint)
 {
     // not used
     double central_angle = get_central_angle();
     Optimizer optimizer = new Optimizer();
     Point4D target = new Point4D(entry_point.X, entry_point.Y, entry_point.Z, central_angle);
     optimizer.point_target = target;
     optimizer.x = new double[] { joint.UpperBevel, joint.LowerBevel, joint.Elbow, joint.twist };
     Joints optimized = optimizer.minimize_angle();
     return optimized;
     //Vector3D projected_exit_point = project_point(exit_point, needle_normal, needle_point);
     //Matrix3D head = calculate_needle_tip(entry_point, projected_exit_point, needle_normal);
 }
 //based on head frame
 public void update_needle(Matrix3D desired)
 {
     Optimizer optimizer = new Optimizer();
     optimizer.T_taget = desired;
     optimizer.x = new double[4] { kinematics.joint.UpperBevel, kinematics.joint.LowerBevel, kinematics.joint.Elbow, kinematics.joint.twist };
     Joints optimized_joints = optimizer.minimize_error();
     kinematics.joint.UpperBevel = optimized_joints.UpperBevel;
     kinematics.joint.LowerBevel = optimized_joints.LowerBevel;
     kinematics.joint.Elbow = optimized_joints.Elbow;
     kinematics.joint.twist = optimized_joints.twist;
     update_needle();
 }