Visual provides the TransformToVisual method, which returns a GeneralTransform that can be used to transform points or rectangles:
var transform = visual1.TransformToVisual(visual2);
var point = transform.Transform(new Point(...));
If visual1
is a ContainerVisual, you can do this:
var bounds = transform.TransformBounds(visual1.ContentBounds);
or
var bounds = transform.TransformBounds(visual1.DescendantBounds);