public static double angleBetweenLines(Cordinates line1Point1, Cordinates line1Point2, Cordinates line2Point1, Cordinates line2Point2)
        {
            double slope1 = (line1Point2.Y - line1Point1.Y) / (line1Point2.X - line1Point1.X);
            double slope2 = (line2Point2.Y - line2Point1.Y) / (line2Point2.X - line2Point1.X);

            double temp = ((slope1 - slope2) / (1 + slope1 * slope2));
            double angle = Math.Atan(temp);
            return angle * (180 / Math.PI);
        }
        static void ExecuteTransformation()
        {
            String fileName = "C:\\temp\\Skeleton Lab Demo.txt";
            String transformfileName1 = "C:\\temp\\Skeleton Lab Demo_transform.txt";
            String transformfileName2 = "C:\\temp\\Skeleton Lab Demo_transform_angle.txt";

            Console.WriteLine("Parsing File : " + fileName);

            Dictionary<string, Cordinates> transformSkeleton = new Dictionary<string, Cordinates>();
            String metaData = null;
            String rawFile = null;

            using (StreamWriter sw = new StreamWriter(transformfileName1, true))
            {
                using (StreamReader sr = File.OpenText(fileName))
                {
                    rawFile = sr.ReadToEnd();
                    //TestReadingAndProcessingLinesFromFile_DoStuff(s);
                    List<String> frames = rawFile.Split(new string[] { "-------------EndFrame-------------" }, StringSplitOptions.None).ToList();
                    metaData = frames[0].Substring(0, frames[0].IndexOf(Environment.NewLine));
                    sw.WriteLine("Meta data : " + metaData);
                    Console.WriteLine("Meta data : " + metaData);
                    Dictionary<string, List<Cordinates>> medianDict = new Dictionary<string, List<Cordinates>>();

                    foreach (String frame in frames)
                    {
                        List<String> jointStrings = new List<string>();
                        using (StringReader reader = new StringReader(frame))
                        {
                            string line = string.Empty;
                            do
                            {
                                line = reader.ReadLine();
                                if (line != null)
                                {
                                    if (line.Contains("[JointPoints:"))
                                    {
                                        var t = line.Replace("[JointPoints:", "").Replace("]", "").Split(',');
                                        if (!medianDict.ContainsKey(t[0]))
                                        {
                                            Cordinates c = new Cordinates();
                                            c.X = Convert.ToDouble(t[1].Replace("X:", ""));
                                            c.Y = Convert.ToDouble(t[2].Replace("Y:", ""));
                                            List<Cordinates> p = new List<Cordinates>();
                                            p.Add(c);
                                            medianDict.Add(t[0], p);
                                        }
                                        else
                                        {
                                            Cordinates c = new Cordinates();
                                            c.X = Convert.ToDouble(t[1].Replace("X:", ""));
                                            c.Y = Convert.ToDouble(t[2].Replace("Y:", ""));
                                            medianDict[t[0]].Add(c);
                                        }
                                    }
                                }
                            } while (line != null);
                        }
                    }

                    foreach (var pair in medianDict)
                    {
                        sw.WriteLine(pair.Key);
                        Console.WriteLine(pair.Key);
                        List<Cordinates> sortedListX = pair.Value.OrderBy(o => o.X).ToList();
                        List<Cordinates> sortedListY = pair.Value.OrderBy(o => o.Y).ToList();
                        //Console.WriteLine(pair.Value.Count);
                        Cordinates c = new Cordinates();
                        c.X = sortedListX[pair.Value.Count / 2].X;
                        c.Y = sortedListY[pair.Value.Count / 2].Y;
                        transformSkeleton.Add(pair.Key, c);
                        sw.WriteLine("X= " + c.X);
                        Console.WriteLine("X= " + c.X);
                        sw.WriteLine("Y= " + c.Y);
                        Console.WriteLine("Y= " + c.Y);
                    }
                }
            }
            String transformString = null;
            StringBuilder ts = new StringBuilder();
            foreach (var pair in transformSkeleton)
            {
                ts.AppendFormat("[{0} : X={1},Y={2}]\n", pair.Key, pair.Value.X, pair.Value.Y);
            }
            transformString = ts.ToString();
            Console.Write(transformString);

            //Extraxt the angle
            using (StreamWriter sw = new StreamWriter(transformfileName2, true))
            {
                sw.Write(transformString);
                sw.WriteLine("--------------------------------------------------------------------");
                ts = new StringBuilder();
                double legAngle = Math.Abs(angleBetweenLines(transformSkeleton["SpineBase"], transformSkeleton["KneeLeft"], transformSkeleton["SpineBase"], transformSkeleton["KneeRight"]));
                double leftHandAngle = Math.Abs(angleBetweenLines(transformSkeleton["SpineBase"], transformSkeleton["SpineShoulder"], transformSkeleton["SpineShoulder"], transformSkeleton["ElbowLeft"]));
                double rightHandAngle = Math.Abs(angleBetweenLines(transformSkeleton["SpineBase"], transformSkeleton["SpineShoulder"], transformSkeleton["SpineShoulder"], transformSkeleton["ElbowRight"]));
                sw.WriteLine("Leg Angle : (SpineBase-KneeLeft,SpineBase-KneeRight) : " + legAngle);
                Console.WriteLine("Leg Angle : (SpineBase-KneeLeft,SpineBase-KneeRight) : " + legAngle);
                ts.AppendLine("Leg Angle : (SpineBase-KneeLeft,SpineBase-KneeRight) : " + legAngle);
                sw.WriteLine("Left Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowLeft) : " + leftHandAngle);
                Console.WriteLine("Left Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowLeft) : " + leftHandAngle);
                ts.AppendLine("Left Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowLeft) : " + leftHandAngle);
                sw.WriteLine("Right Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowRight) : " + rightHandAngle);
                Console.WriteLine("Right Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowRight) : " + rightHandAngle);
                ts.AppendLine("Right Hand Angle : (SpineBase-SpineShoulder,SpineShoulder-ElbowRight) : " + rightHandAngle);
            }
            // Save it in database

            pushToDataStore(metaData, rawFile, transformString, ts.ToString());

            Console.ReadLine();
        }