public virtual void Position(PointF srcPt, PointF destPt, RectangleF destBounds, int millis) {
float srcx, srcy;
float destx, desty;
float dx, dy;
PointF pt1, pt2;
if (parent != null) {
// First compute translation amount in global coordinates
RectangleF srcBounds = GlobalFullBounds;
srcx = Lerp(srcPt.X, srcBounds.X, srcBounds.X + srcBounds.Width);
srcy = Lerp(srcPt.Y, srcBounds.Y, srcBounds.Y + srcBounds.Height);
destx = Lerp(destPt.X, destBounds.X, destBounds.X + destBounds.Width);
desty = Lerp(destPt.Y, destBounds.Y, destBounds.Y + destBounds.Height);
// Convert vector to local coordinates
pt1 = new PointF(srcx, srcy);
pt1 = GlobalToLocal(pt1);
pt2 = new PointF(destx, desty);
pt2 = GlobalToLocal(pt2);
dx = (pt2.X - pt1.X);
dy = (pt2.Y - pt1.Y);
// Finally, animate change
PMatrix matrix = new PMatrix(MatrixReference.MatrixReference);
matrix.TranslateBy(dx, dy);
AnimateToMatrix(matrix, millis);
}
}