コード例 #1
0
        /// <summary>
        /// Set links amongst the points for tangent computation
        /// </summary>
        /// <param name="rError">Shortest distance between two distinct points</param>
        internal void SetTanLinks(double rError)
        {
            int count = Count;

            if (rError < 1.0)
            {
                rError = 1.0f;
            }

            for (int i = 0; i < count; ++i)
            {
                // Find a StylusPoint at distance-_span forward
                for (int j = i + 1; j < count; j++)
                {
                    if (_nodes[j] - _nodes[i] >= rError)
                    {
                        CDataPoint cdp = _points[i];
                        cdp.TanNext = j;
                        _points[i]  = cdp;

                        CDataPoint cdp2 = _points[j];
                        cdp2.TanPrev = i;
                        _points[j]   = cdp2;
                        break;
                    }
                }

                if (0 > _points[i].TanPrev)
                {
                    for (int j = i - 1; 0 <= j; --j)
                    {
                        if (_nodes[i] - _nodes[j] >= rError)
                        {
                            CDataPoint cdp = _points[i];
                            cdp.TanPrev = j;
                            _points[i]  = cdp;
                            break;
                        }
                    }
                }

                if (0 > _points[i].TanNext)
                {
                    CDataPoint cdp = _points[i];
                    cdp.TanNext = count - 1;
                    _points[i]  = cdp;
                }

                if (0 > _points[i].TanPrev)
                {
                    CDataPoint cdp = _points[i];
                    cdp.TanPrev = 0;
                    _points[i]  = cdp;
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Constructs internal data structure from points for doing operations like
        /// cusp detection or tangent computation
        /// </summary>
        /// <param name="stylusPoints">Points to be analyzed</param>
        /// <param name="rSpan">Distance between two consecutive distinct points</param>
        internal void Analyze(StylusPointCollection stylusPoints, double rSpan)
        {
            // If the count is less than 1, return
            if ((null == stylusPoints) || (stylusPoints.Count == 0))
            {
                return;
            }

            _points = new List <CDataPoint>(stylusPoints.Count);
            _nodes  = new List <double>(stylusPoints.Count);

            // Construct the lists of data points and nodes
            _nodes.Add(0);
            CDataPoint cdp0 = new CDataPoint();

            cdp0.Index = 0;
            //convert from Avalon to Himetric
            Point point = (Point)stylusPoints[0];

            point.X   *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
            point.Y   *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
            cdp0.Point = point;
            _points.Add(cdp0);

            //drop duplicates
            int index = 0;

            for (int i = 1; i < stylusPoints.Count; i++)
            {
                if (!DoubleUtil.AreClose(stylusPoints[i].X, stylusPoints[i - 1].X) ||
                    !DoubleUtil.AreClose(stylusPoints[i].Y, stylusPoints[i - 1].Y))
                {
                    //this is a unique point, add it
                    index++;

                    CDataPoint cdp = new CDataPoint();
                    cdp.Index = index;

                    //convert from Avalon to Himetric
                    Point point2 = (Point)stylusPoints[i];
                    point2.X *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
                    point2.Y *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
                    cdp.Point = point2;

                    _points.Insert(index, cdp);
                    _nodes.Insert(index, _nodes[index - 1] + (XY(index) - XY(index - 1)).Length);
                }
            }

            SetLinks(rSpan);
        }
コード例 #3
0
        /// <summary>
        /// Constructs internal data structure from points for doing operations like
        /// cusp detection or tangent computation
        /// </summary>
        /// <param name="stylusPoints">Points to be analyzed</param>
        /// <param name="rSpan">Distance between two consecutive distinct points</param>
        internal void Analyze(StylusPointCollection stylusPoints, double rSpan)
        {
            // If the count is less than 1, return
            if ((null == stylusPoints) || (stylusPoints.Count == 0))
                return;

            _points = new List<CDataPoint>(stylusPoints.Count);
            _nodes = new List<double>(stylusPoints.Count);

            // Construct the lists of data points and nodes
            _nodes.Add(0);
            CDataPoint cdp0 = new CDataPoint();
            cdp0.Index = 0;
            //convert from Avalon to Himetric
            Point point = (Point)stylusPoints[0];
            point.X *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
            point.Y *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
            cdp0.Point = point;
            _points.Add(cdp0);

            //drop duplicates
            int index = 0;
            for (int i = 1; i < stylusPoints.Count; i++)
            {
                if (!DoubleUtil.AreClose(stylusPoints[i].X, stylusPoints[i - 1].X) ||
                    !DoubleUtil.AreClose(stylusPoints[i].Y, stylusPoints[i - 1].Y))
                {
                    //this is a unique point, add it
                    index++;

                    CDataPoint cdp = new CDataPoint();
                    cdp.Index = index;

                    //convert from Avalon to Himetric
                    Point point2 = (Point)stylusPoints[i];
                    point2.X *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
                    point2.Y *= StrokeCollectionSerializer.AvalonToHimetricMultiplier;
                    cdp.Point = point2;

                    _points.Insert(index, cdp);
                    _nodes.Insert(index, _nodes[index - 1] + (XY(index) - XY(index - 1)).Length);
                }
            }
 
            SetLinks(rSpan);
        }