/// <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; } } }
/// <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); }
/// <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); }