Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WPF: Изменить значение RenderTransformOrigin, Повернутого объекта 
V
    Опции темы
Anyone
Дата 1.10.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Объект поворачивается так:
Код

                RotateTransform rotateTransform = this._canvasItem.RenderTransform as RotateTransform;
                rotateTransform.Angle = this._startAngle + Math.Round(angle, 0);

Если объект повернут на некоторый угол, то при изменении значения this._canvasItem.RenderTransformOrigin, объект начинает "прыгать".
Это можно как-то избежать?
PM MAIL   Вверх
math64
Дата 2.10.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Объект будет поворачиваться вокруг того же центра, вокруг которого уже был повёрнут. Если же он ещё не поворачивался, код работать не будет.
Код

RotateTransform rotateTransform = this._canvasItem.RenderTransform as RotateTransform;
if (rotateTransform == null) {
 this._canvasItem.RenderTransformOrigin = new Point(orgX, orgY);
  this._canvasItem.RenderTransform = rotateTransform = new RotateTransform();
}
rotateTransform.Angle = this._startAngle + Math.Round(angle, 0);

orgX и orgY задаются в долях ширины и высоты, при повороте воруг центра orgX = orgY = 0.5;

Добавлено через 8 минут и 27 секунд
Если объект был уже повёрнут и его нужно ещё повернуть вокруг другого центра, новый центр поворота нужно вычислять (геометрическая задача) или задать в RenderTransform комбинацию из двух поворотов.
PM   Вверх
Anyone
Дата 2.10.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Наверное я не правильно понят.
Проблем с поворотом объекта нету.
Мне нужно изменять центр поворота (перемещается мышкой).
Когда объект не повернут, все работает замечательно, а когда повернут - при изменении центра объект начинает смещаться в разных направлениях.
Центр перемещаю так:
Код

    public class CenterThumb : Thumb
    {
        public CenterThumb()
        {
            DragDelta += new DragDeltaEventHandler(CenterThumb_DragDelta);
        }

        void CenterThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            Point dragPoint = new Point(e.HorizontalChange, e.VerticalChange);

            Margin = new System.Windows.Thickness(
                Margin.Left + dragPoint.X, Margin.Top + dragPoint.Y, 
                Margin.Right - dragPoint.X, Margin.Bottom - dragPoint.Y);

            if (_canvasItem != null)
                _canvasItem.RenderTransformOrigin = new Point(
                        Math.Round((Margin.Left + Width / 2.0)/_canvasItem.ActualWidth,2), 
                        Math.Round((Margin.Top + Height / 2.0)/_canvasItem.ActualHeight,2));

        }


PM MAIL   Вверх
math64
Дата 2.10.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Код

        void CenterThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            Point dragPoint = new Point(e.HorizontalChange, e.VerticalChange);
            var rotate = _canvasItem.RenderTransform as RotateTransform;
            if (rotate != null) dragPoint = rotate.Transform(dragPoint);
            ...
        }


Добавлено через 10 минут и 38 секунд
Когда объект повернут, его адорнер тоже поворачивается. Координаты в Drag_Delta задаются в повёрнутой системе координат.
Это не всегда удобно. Вместо этого можно поворачивать шаблоны объекта и адорнера на один и тот же угол - но тогда биндить напрямую RotateTransform.Angle не получается.
( http://forum.vingrad.ru/forum/topic-274351...oltemplate.html )

Это сообщение отредактировал(а) math64 - 2.10.2009, 09:04
PM   Вверх
Anyone
Дата 2.10.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я пытался так сделать:
 dragPoint = rotate.Transform(dragPoint);
но это не помогает, поскольку это всего лишь смещение центра задается с помощью координат этой точки...

А пример я не совсем понял.

Цитата(math64 @  2.10.2009,  09:03 Найти цитируемый пост)
Координаты в Drag_Delta задаются в повёрнутой системе координат

Если я правильно понял, это и нужно - задавать центр относительно повернутого объекта.

Может здесь нужно поиграться с TranslateTransform, чтоб вернуть объект на место?
PM MAIL   Вверх
math64
Дата 2.10.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Возможно, нужно поворачивать в обратную сторону
Код

            var rotate = _canvasItem.RenderTransform as RotateTransform;
            if (rotate != null) dragPoint = new RotateTransform(){Angle=-rotate.Angle}.Transform(dragPoint);

или делать ещё более сложные преобразования
PM   Вверх
Anyone
Дата 8.10.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Проблему решил:
Код

        void CenterThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            if (_canvasItem==null) return;

            Point dragPoint = new Point(e.HorizontalChange, e.VerticalChange);

            Margin = new System.Windows.Thickness(
                Margin.Left + dragPoint.X, Margin.Top + dragPoint.Y, 
                Margin.Right - dragPoint.X, Margin.Bottom - dragPoint.Y);
            
            Point pointTopLeftCorner = _canvasItem.GetRealPoint(
                new Point((double)_canvasItem.GetValue(Canvas.LeftProperty),
                    (double)_canvasItem.GetValue(Canvas.TopProperty)));

            _canvasItem.RenderTransformOrigin = new Point(
                    (Margin.Left + Width / 2.0)/_canvasItem.ActualWidth, 
                    (Margin.Top + Height / 2.0)/_canvasItem.ActualHeight);

            _canvasItem.SetTopLeftCorner(pointTopLeftCorner);

В переменной pointTopLeftCorner сохраняю реальные координаты верхнего левого угла объект учитывая угол поворота, а с помощью функции SetTopLeftCorner возвращаю объект на место.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.