Вычисление центра вращения после переноса

Мне нужно иметь возможность вращать изображение вокруг заданной точки, чтобы любая часть изображения, появляющаяся в центре моего контейнера, была центром вращения.

Чтобы вычислить центральные точки, я в настоящее время просто беру обратный перевод, примененный к изображению:

Rotate.CenterX = Translate.X * -1;
Rotate.CenterY = Translate.Y * -1;

Однако текущий расчет, который я использую, недостаточен, поскольку он не работает, если изображение было переведено после поворота.

Я уверен, что это достаточно простая триггерная функция, я просто не могу понять, что это такое!

Ваше здоровье


person CatBusStop    schedule 13.01.2010    source источник
comment
Нам нужно немного больше информации. Как у вас дела с трансформациями? Как ваша система координат связана с положением изображения?   -  person Will Vousden    schedule 13.01.2010
comment
Я использую встроенные функции преобразования WPF для обработки своих преобразований. По сути, у меня есть TransformGroup, которая содержит TranslateTransform, RotateTransform и ScaleTransform (добавлены в таком порядке). Каждое из них обновляется каждый раз, когда происходит преобразование, а не добавляется больше преобразований. До сих пор мне удавалось избегать каких-либо действий с координатами, кроме захвата положения мыши здесь и там... Надеюсь, это поможет!   -  person CatBusStop    schedule 13.01.2010


Ответы (1)


Если вы работаете с GDI+, используйте следующее:

double ImWidth = (double)Im.Width;
double ImHeight = (double)Im.Height;
double XTrans = -(ImWidth * X);
double YTrans = -(ImHeight * Y);

g.TranslateTransform((float)XTrans, (float)YTrans);    
g.TranslateTransform((float)(ImWidth / 2.0 - XTrans), (float)(ImHeight / 2.0 - YTrans));
g.RotateTransform((float)Angle);
g.TranslateTransform(-((float)(ImWidth / 2.0 - XTrans)), -((float)(ImHeight / 2.0 - YTrans)));

Если вы работаете с графическими объектами WPF, используйте следующую группу преобразования:

TransformGroup TC = new TransformGroup();
RotateTransform RT = new RotateTransform(Angle);
RT.CenterX = Im.Width / 2.0;
RT.CenterY = Im.Height / 2.0;
TranslateTransform TT = new TranslateTransform(-X * Im.PixelWidth, -Y * Im.PixelHeight);
TC.Children.Add(TT);
TC.Children.Add(RT);

X и Y — это процентные значения, в которые вы хотите преобразовать изображение (если изображение имеет размер 1000 пикселей, а X равно 0,1, то изображение будет переведено на 100 пикселей). Вот как мне нужно, чтобы функция работала, но вы можете легко изменить ее иначе.

person Gilad    schedule 14.01.2010
comment
Спасибо за Ваш ответ! Проблема, с которой я столкнулся, во многом связана с тем, как я работал с отдельными преобразованиями (я добавил по одному из каждого, а затем изменил их, а не накапливал несколько преобразований). Я еще не совсем там, но теперь я ближе и с гораздо меньшим количеством кода! - person CatBusStop; 18.01.2010