Exemple #1
0
        // determines the angle, in radians, between two points. the angle is defined
        // by the circle centered on the start point with a radius to the end point,
        // where 0 radians is straight right from start (+x-axis) and PI/2 radians is
        // straight down (+y-axis).
        public static double AngleInRadians(PointR start, PointR end, bool positiveOnly)
        {
            double radians = 0.0;

            if (start.X != end.X)
            {
                radians = Math.Atan2(end.Y - start.Y, end.X - start.X);
            }
            else                                                 // pure vertical movement
            {
                if (end.Y < start.Y)
                {
                    radians = -Math.PI / 2.0;                                                                                                                             // -90 degrees is straight up
                }
                else if (end.Y > start.Y)
                {
                    radians = Math.PI / 2.0;                                                                                                                             // 90 degrees is straight down
                }
            }
            if (positiveOnly && radians < 0.0)
            {
                radians += Math.PI * 2.0;
            }
            return(radians);
        }
Exemple #2
0
        public static ArrayList Resample(ArrayList points, int n)
        {
            double    I      = PathLength(points) / (n - 1);                                         // interval length
            double    D      = 0.0;
            ArrayList srcPts = new ArrayList(points);
            ArrayList dstPts = new ArrayList(n);

            dstPts.Add(srcPts[0]);
            for (int i = 1; i < srcPts.Count; i++)
            {
                PointR pt1 = (PointR)srcPts[i - 1];
                PointR pt2 = (PointR)srcPts[i];
                double d   = Distance(pt1, pt2);
                if ((D + d) >= I)
                {
                    double qx = pt1.X + ((I - D) / d) * (pt2.X - pt1.X);
                    double qy = pt1.Y + ((I - D) / d) * (pt2.Y - pt1.Y);
                    PointR q  = new PointR(qx, qy);
                    dstPts.Add(q);                                                                                 // append new point 'q'
                    srcPts.Insert(i, q);                                                                           // insert 'q' at position i in points s.t. 'q' will be the next i
                    D = 0.0;
                }
                else
                {
                    D += d;
                }
            }
            // somtimes we fall a rounding-error short of adding the last point, so add it if so
            if (dstPts.Count == n - 1)
            {
                dstPts.Add(srcPts[srcPts.Count - 1]);
            }
            return(dstPts);
        }
Exemple #3
0
        // rotate the points by the given radians about their centroid
        public static ArrayList RotateByRadians(ArrayList points, double radians)
        {
            ArrayList newPoints = new ArrayList(points.Count);
            PointR    c         = Centroid(points);

            double cos = Math.Cos(radians);
            double sin = Math.Sin(radians);

            double cx = c.X;
            double cy = c.Y;

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];

                double dx = p.X - cx;
                double dy = p.Y - cy;

                PointR q = PointR.Empty;
                q.X = dx * cos - dy * sin + cx;
                q.Y = dx * sin + dy * cos + cy;

                newPoints.Add(q);
            }
            return(newPoints);
        }
Exemple #4
0
        public static double Distance(PointR p1, PointR p2)
        {
            double dx = p2.X - p1.X;
            double dy = p2.Y - p1.Y;

            return(Math.Sqrt(dx * dx + dy * dy));
        }
Exemple #5
0
        // Rotate a point 'p' around a point 'c' by the given radians.
        // Rotation (around the origin) amounts to a 2x2 matrix of the form:
        //
        //		[ cos A		-sin A	] [ p.x ]
        //		[ sin A		cos A	] [ p.y ]
        //
        // Note that the C# Math coordinate system has +x-axis stright right and
        // +y-axis straight down. Rotation is clockwise such that from +x-axis to
        // +y-axis is +90 degrees, from +x-axis to -x-axis is +180 degrees, and
        // from +x-axis to -y-axis is -90 degrees.
        public static PointR RotatePoint(PointR p, PointR c, double radians)
        {
            PointR q = PointR.Empty;

            q.X = (p.X - c.X) * Math.Cos(radians) - (p.Y - c.Y) * Math.Sin(radians) + c.X;
            q.Y = (p.X - c.X) * Math.Sin(radians) + (p.Y - c.Y) * Math.Cos(radians) + c.Y;
            return(q);
        }
Exemple #6
0
 public override bool Equals(object obj)
 {
     if (obj is PointR)
     {
         PointR p = (PointR)obj;
         return(X == p.X && Y == p.Y);
     }
     return(false);
 }
Exemple #7
0
 // copy constructor
 public PointR(PointR p)
 {
     //_x = p.X;
     //_y = p.Y;
     //_t = p.T;
     X = p.X;
     Y = p.Y;
     T = p.T;
 }
 // copy constructor
 public PointR(PointR p)
 {
     //_x = p.X;
         //_y = p.Y;
         //_t = p.T;
         X = p.X;
         Y = p.Y;
         T = p.T;
 }
Exemple #9
0
        // translates the points by the given delta amounts
        public static ArrayList TranslateBy(ArrayList points, SizeR sz)
        {
            ArrayList newPoints = new ArrayList(points.Count);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                p.X += sz.Width;
                p.Y += sz.Height;
                newPoints.Add(p);
            }
            return(newPoints);
        }
Exemple #10
0
        // translates the points so that the upper-left corner of their bounding box lies at 'toPt'
        public static ArrayList TranslateBBoxTo(ArrayList points, PointR toPt)
        {
            ArrayList  newPoints = new ArrayList(points.Count);
            RectangleR r         = Utils.FindBox(points);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                p.X += (toPt.X - r.X);
                p.Y += (toPt.Y - r.Y);
                newPoints.Add(p);
            }
            return(newPoints);
        }
Exemple #11
0
        // translates the points so that their centroid lies at 'toPt'
        public static ArrayList TranslateCentroidTo(ArrayList points, PointR toPt)
        {
            ArrayList newPoints = new ArrayList(points.Count);
            PointR    centroid  = Centroid(points);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                p.X += (toPt.X - centroid.X);
                p.Y += (toPt.Y - centroid.Y);
                newPoints.Add(p);
            }
            return(newPoints);
        }
Exemple #12
0
        // scales the points so that the length of their shorter side
        // matches the length of the shorter side of the given box.
        // thus, both dimensions are warped proportionally, rather than
        // independently, like in the function ScaleTo.
        public static ArrayList ScaleToMin(ArrayList points, RectangleR box)
        {
            ArrayList  newPoints = new ArrayList(points.Count);
            RectangleR r         = FindBox(points);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                p.X *= (box.MinSide / r.MinSide);
                p.Y *= (box.MinSide / r.MinSide);
                newPoints.Add(p);
            }
            return(newPoints);
        }
Exemple #13
0
        // scales by the percentages contained in the 'sz' parameter. values of 1.0 would result in the
        // identity scale (that is, no change).
        public static ArrayList ScaleBy(ArrayList points, SizeR sz)
        {
            ArrayList  newPoints = new ArrayList(points.Count);
            RectangleR r         = FindBox(points);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                p.X *= sz.Width;
                p.Y *= sz.Height;
                newPoints.Add(p);
            }
            return(newPoints);
        }
Exemple #14
0
 // determines the angle, in radians, between two points. the angle is defined
 // by the circle centered on the start point with a radius to the end point,
 // where 0 radians is straight right from start (+x-axis) and PI/2 radians is
 // straight down (+y-axis).
 public static double AngleInRadians(PointR start, PointR end, bool positiveOnly)
 {
     double radians = 0.0;
     if (start.X != end.X)
     {
         radians = Math.Atan2(end.Y - start.Y, end.X - start.X);
     }
     else // pure vertical movement
     {
         if (end.Y < start.Y)
             radians = -Math.PI / 2.0; // -90 degrees is straight up
         else if (end.Y > start.Y)
             radians = Math.PI / 2.0; // 90 degrees is straight down
     }
     if (positiveOnly && radians < 0.0)
     {
         radians += Math.PI * 2.0;
     }
     return radians;
 }
Exemple #15
0
        // scales the points so that they form the size given. does not restore the
        // origin of the box.
        public static ArrayList ScaleTo(ArrayList points, SizeR sz)
        {
            ArrayList  newPoints = new ArrayList(points.Count);
            RectangleR r         = FindBox(points);

            for (int i = 0; i < points.Count; i++)
            {
                PointR p = (PointR)points[i];
                if (r.Width != 0d)
                {
                    p.X *= (sz.Width / r.Width);
                }
                if (r.Height != 0d)
                {
                    p.Y *= (sz.Height / r.Height);
                }
                newPoints.Add(p);
            }
            return(newPoints);
        }
        // assumes the reader has been just moved to the head of the content.
        private Gesture ReadGesture(XmlTextReader reader)
        {
            Debug.Assert(reader.LocalName == "Gesture");
            string name = reader.GetAttribute("Name");

            ArrayList points = new ArrayList(XmlConvert.ToInt32(reader.GetAttribute("NumPts")));

            reader.Read(); // advance to the first Point
            Debug.Assert(reader.LocalName == "Point");

            while (reader.NodeType != XmlNodeType.EndElement)
            {
                PointR p = PointR.Empty;
                p.X = XmlConvert.ToDouble(reader.GetAttribute("X"));
                p.Y = XmlConvert.ToDouble(reader.GetAttribute("Y"));
                p.T = XmlConvert.ToInt32(reader.GetAttribute("T"));
                points.Add(p);
                reader.ReadStartElement("Point");
            }

            return(new Gesture(name, points));
        }
Exemple #17
0
 public static double Distance(PointR p1, PointR p2)
 {
     double dx = p2.X - p1.X;
     double dy = p2.Y - p1.Y;
     return Math.Sqrt(dx * dx + dy * dy);
 }
Exemple #18
0
 // translates the points so that their centroid lies at 'toPt'
 public static ArrayList TranslateCentroidTo(ArrayList points, PointR toPt)
 {
     ArrayList newPoints = new ArrayList(points.Count);
     PointR centroid = Centroid(points);
     for (int i = 0; i < points.Count; i++)
     {
         PointR p = (PointR) points[i];
         p.X += (toPt.X - centroid.X);
         p.Y += (toPt.Y - centroid.Y);
         newPoints.Add(p);
     }
     return newPoints;
 }
Exemple #19
0
 // translates the points so that the upper-left corner of their bounding box lies at 'toPt'
 public static ArrayList TranslateBBoxTo(ArrayList points, PointR toPt)
 {
     ArrayList newPoints = new ArrayList(points.Count);
     RectangleR r = Utils.FindBox(points);
     for (int i = 0; i < points.Count; i++)
     {
         PointR p = (PointR) points[i];
         p.X += (toPt.X - r.X);
         p.Y += (toPt.Y - r.Y);
         newPoints.Add(p);
     }
     return newPoints;
 }
Exemple #20
0
 // Rotate a point 'p' around a point 'c' by the given radians.
 // Rotation (around the origin) amounts to a 2x2 matrix of the form:
 //
 //        [ cos A		-sin A	] [ p.x ]
 //        [ sin A		cos A	] [ p.y ]
 //
 // Note that the C# Math coordinate system has +x-axis stright right and
 // +y-axis straight down. Rotation is clockwise such that from +x-axis to
 // +y-axis is +90 degrees, from +x-axis to -x-axis is +180 degrees, and
 // from +x-axis to -y-axis is -90 degrees.
 public static PointR RotatePoint(PointR p, PointR c, double radians)
 {
     PointR q = PointR.Empty;
     q.X = (p.X - c.X) * Math.Cos(radians) - (p.Y - c.Y) * Math.Sin(radians) + c.X;
     q.Y = (p.X - c.X) * Math.Sin(radians) + (p.Y - c.Y) * Math.Cos(radians) + c.Y;
     return q;
 }
Exemple #21
0
 // determines the angle, in degrees, between two points. the angle is defined
 // by the circle centered on the start point with a radius to the end point,
 // where 0 degrees is straight right from start (+x-axis) and 90 degrees is
 // straight down (+y-axis).
 public static double AngleInDegrees(PointR start, PointR end, bool positiveOnly)
 {
     double radians = AngleInRadians(start, end, positiveOnly);
     return Rad2Deg(radians);
 }
Exemple #22
0
        public static ArrayList Resample(ArrayList points, int n)
        {
            double I = PathLength(points) / (n - 1); // interval length
            double D = 0.0;
            ArrayList srcPts = new ArrayList(points);
            ArrayList dstPts = new ArrayList(n);
            dstPts.Add(srcPts[0]);
            for (int i = 1; i < srcPts.Count; i++)
            {
                PointR pt1 = (PointR) srcPts[i - 1];
                PointR pt2 = (PointR) srcPts[i];

                double d = Distance(pt1, pt2);
                if ((D + d) >= I)
                {
                    double qx = pt1.X + ((I - D) / d) * (pt2.X - pt1.X);
                    double qy = pt1.Y + ((I - D) / d) * (pt2.Y - pt1.Y);
                    PointR q = new PointR(qx, qy);
                    dstPts.Add(q); // append new point 'q'
                    srcPts.Insert(i, q); // insert 'q' at position i in points s.t. 'q' will be the next i
                    D = 0.0;
                }
                else
                {
                    D += d;
                }
            }
            // somtimes we fall a rounding-error short of adding the last point, so add it if so
            if (dstPts.Count == n - 1)
            {
                dstPts.Add(srcPts[srcPts.Count - 1]);
            }

            return dstPts;
        }
Exemple #23
0
        // determines the angle, in degrees, between two points. the angle is defined
        // by the circle centered on the start point with a radius to the end point,
        // where 0 degrees is straight right from start (+x-axis) and 90 degrees is
        // straight down (+y-axis).
        public static double AngleInDegrees(PointR start, PointR end, bool positiveOnly)
        {
            double radians = AngleInRadians(start, end, positiveOnly);

            return(Rad2Deg(radians));
        }
        public bool SaveGesture(string filename, ArrayList points)
        {
            // add the new prototype with the name extracted from the filename.
            string name = Gesture.ParseName(filename);

            if (_gestures.ContainsKey(name))
            {
                _gestures.Remove(name);
            }
            Gesture newPrototype = new Gesture(name, points);

            _gestures.Add(name, newPrototype);

            // figure out the duration of the gesture
            PointR p0 = (PointR)points[0];
            PointR pn = (PointR)points[points.Count - 1];

            // do the xml writing
            bool          success = true;
            XmlTextWriter writer  = null;

            try
            {
                // save the prototype as an Xml file
                writer            = new XmlTextWriter(filename, Encoding.UTF8);
                writer.Formatting = Formatting.Indented;
                writer.WriteStartDocument(true);
                writer.WriteStartElement("Gesture");
                writer.WriteAttributeString("Name", name);
                writer.WriteAttributeString("NumPts", XmlConvert.ToString(points.Count));
                writer.WriteAttributeString("Millseconds", XmlConvert.ToString(pn.T - p0.T));
                writer.WriteAttributeString("AppName", Assembly.GetExecutingAssembly().GetName().Name);
                writer.WriteAttributeString("AppVer", Assembly.GetExecutingAssembly().GetName().Version.ToString());
                writer.WriteAttributeString("Date", DateTime.Now.ToLongDateString());
                writer.WriteAttributeString("TimeOfDay", DateTime.Now.ToLongTimeString());

                // write out the raw individual points
                foreach (PointR p in points)
                {
                    writer.WriteStartElement("Point");
                    writer.WriteAttributeString("X", XmlConvert.ToString(p.X));
                    writer.WriteAttributeString("Y", XmlConvert.ToString(p.Y));
                    writer.WriteAttributeString("T", XmlConvert.ToString(p.T));
                    writer.WriteEndElement();                     // <Point />
                }

                writer.WriteEndDocument();                 // </Gesture>
            }
            catch (XmlException xex)
            {
                Console.Write(xex.Message);
                success = false;
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                success = false;
            }
            finally
            {
                if (writer != null)
                {
                    writer.Close();
                }
            }
            return(success);            // Xml file successfully written (or not)
        }