public static TraceGroup ToTraceGroup(this Ink ink) { var traceGroup = new TraceGroup(); foreach (var stroke in ink.Strokes) { var trace = new Trace(); foreach (var point in stroke.GetPoints()) { var penPoint = new PenPoint { X = point.X, Y = point.Y }; trace.Points.Add(penPoint); } traceGroup.Traces.Add(trace); } return(traceGroup); }
public Trace ResampleTrace(Trace inTrace, int resamplePoints) { var outTrace = new Trace(); var xSum = 0f; var ySum = 0f; var x = 0f; var y = 0f; var numTracePoints = inTrace.Points.Count; var xDiff = 0f; var yDiff = 0f; var pointDistance = 0f; var unitLength = 0f; var distanceVec = new List <float>(); var balanceDistance = 0f; // distance between the last resampled point and // the next raw sample point var measuredDistance = 0f; var m1 = 0f; var m2 = 0f; var ptIndex = 0; var currentPointIndex = 0; var xVec = inTrace.ChannelX; var yVec = inTrace.ChannelY; var xTemp = 0f; var yTemp = 0f; if (resamplePoints == 1) { xSum = inTrace.GetSumX(); ySum = inTrace.GetSumY(); x = xSum / numTracePoints; y = ySum / numTracePoints; var penPoint = new PenPoint { X = x, Y = y }; outTrace.Points.Add(penPoint); } else { for (var i = 0; i < (numTracePoints - 1); ++i) { xDiff = inTrace.ChannelX[i] - inTrace.ChannelX[i + 1]; yDiff = inTrace.ChannelY[i] - inTrace.ChannelY[i + 1]; pointDistance = (float)Math.Sqrt(xDiff * xDiff + yDiff * yDiff); unitLength += pointDistance; distanceVec.Add(pointDistance); } unitLength /= (resamplePoints - 1); x = inTrace.ChannelX[0]; y = inTrace.ChannelY[0]; outTrace.Points.Add(new PenPoint { X = x, Y = y }); for (var i = 1; i < (resamplePoints - 1); ++i) { measuredDistance = balanceDistance; while (measuredDistance < unitLength) { measuredDistance += distanceVec[ptIndex++]; if (ptIndex == 1) { currentPointIndex = 1; } else { currentPointIndex++; } } if (ptIndex < 1) { ptIndex = 1; } m2 = measuredDistance - unitLength; m1 = distanceVec[ptIndex - 1] - m2; if (Math.Abs(m1 + m2) > _eps) { xTemp = (m1 * xVec[currentPointIndex] + m2 * xVec[currentPointIndex - 1]) / (m1 + m2); yTemp = (m1 * yVec[currentPointIndex] + m2 * yVec[currentPointIndex - 1]) / (m1 + m2); } else { xTemp = xVec[currentPointIndex]; yTemp = yVec[currentPointIndex]; } outTrace.Points.Add(new PenPoint { X = xTemp, Y = yTemp }); balanceDistance = m2; } x = xVec[xVec.Count - 1]; //adding x of last point y = yVec[yVec.Count - 1]; //adding y of last point outTrace.Points.Add(new PenPoint { X = x, Y = y }); } return(outTrace); }
private StylusPoint GetStylusPoint(PenPoint point) { var pressure = (point.Pressure / 255f); return(new StylusPoint((point.X + 350) / 2, (point.Y - 330) / 2, pressure)); }