Я пытаюсь понять, как преобразовать положение мыши (экранные координаты) в соответствующую точку на базовом преобразованном изображении, нарисованном на поверхности direct2d. код здесь следует рассматривать как псевдокод, поскольку я использую модифицированную оболочку C++/CLI вокруг Direct2D для C#, вы не сможете скомпилировать это ни в чем, кроме моего собственного проекта.
Render()
{
//The transform matrix combines a rotation, followed by a scaling then a translation
renderTarget.Transform = _rotate * _scale * _translate;
RectF imageBounds = new RectF(0, 0, _imageSize.Width, _imageSize.Height);
renderTarget.DrawBitmap(this._image, imageBounds, 1, BitmapInterpolationMode.Linear);
}
Zoom(float zoomfactor, PointF mousepos)
{
//mousePos is in screen coordinates. I need to convert it to image coordinates.
Matrix3x2 t = _translate.Invert();
Matrix3x2 s = _scale.Invert();
Matrix3x2 r = _rotate.Invert();
PointF center = (t * s * r).TransformPoint(mousePos);
_scale = Matrix3x2.Scale(zoomfactor, zoomfactor, center);
}
Это неверно, центр масштаба начинает резко перемещаться, когда коэффициент масштабирования плавно увеличивается или уменьшается, результирующая функция масштабирования не является плавной и сильно мерцает, даже если указатель мыши неподвижен в центре поверхности клиента. Я перепробовал все комбинации, какие только мог придумать, но так и не смог понять.
Если я установлю центральную точку масштаба как (imagewidth/2, imageheight/2), результирующее масштабирование будет плавным, но всегда центрируется по центру изображения, поэтому я почти уверен, что мерцание не связано с какой-то другой ошибочной частью программа.
Спасибо.
t * s * r
наr * s * t
. И убедитесь, что точка экрана находится в координатах клиента и учитывается (возможно, пользовательский) DPI. - person CodeAngry   schedule 02.12.2013