Преобразовать вращение и перевод вопроса
У меня следующая ситуация, я пытаюсь сделать редактор фотографий, и мне нужно делать операции масштабирования, перевода и поворота для изображения с центром вокруг
проблема в том, что если я применяю перевод после 90-градусного перевода влево, это перевод сверху и точка привязки не является центром представления после перевода
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// ImageView
v = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
[v setBackgroundColor:[UIColor redColor]];
// ImageView's Image
UIImage *img = [UIImage imageNamed:@"_my.jpg"];
[v setImage:img];
v.contentMode = UIViewContentModeScaleAspectFit;
v.layer.anchorPoint = CGPointMake(0.5, 0.5);
[self.view setBackgroundColor:[UIColor clearColor]];
// UiView containing ImageView
vc = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
[vc addSubview:v];
[self.view addSubview:vc];
}
- (IBAction)Click:(id)sender {
// Translate
if ([sender tag] == 1) {
CGAffineTransform t0 = v.transform;
CGAffineTransform t1 = CGAffineTransformTranslate(t0, 10.0, 0.0);
v.transform = t1;
}
// Rotate
if ([sender tag] == 2) {
CGAffineTransform t0 = v.transform;
CGAffineTransform t1 = CGAffineTransformRotate(t0, DEGREES_TO_RADIANS(10));
v.transform = t1;
}
}
Кто-нибудь знает, как я могу держать центр зрения в качестве точки привязки и перевести после поворота для правильной работы?
Техас
1 ответ
Преобразования с Происхождением
Однако, особенно в 2D, вам часто нужно добавлять смещение начала координат в ваше преобразование. Это обычно добавляется к началу, и тоже должно быть отрицано, поэтому:
// Мировая Матрица с Происхождением
-OriginTranslation * Scale * Rotation * PositionTranslation
То же самое можно сделать и с матрицей представления, но вы добавляете ее в конец, и на этот раз вы не отрицаете ее:
// Просмотр матрицы с происхождением
-PositionTranslation * -Rotation * Zoom * OriginTranslation
Преобразования с Избирательным Происхождением
Также есть случаи, когда вы хотите иметь смещение начала координат, но вы хотите, чтобы оно влияло только на ваш масштаб и поворот, но не на ваш перевод. Способ справиться с этим - отменить трансформацию источника до достижения компонента перевода. Например, с матрицей мира:
Я точно не помню, как преобразование применяется для представления, одно из них должно работать.
// Мировая матрица с происхождением для масштаба и вращения
-OriginTranslation * Scale * Rotation * OriginTranslation * PositionTranslation
И матрица вида:
// Просмотр матрицы с происхождением
-PositionTranslation * -OriginTranslation * -Rotation * Zoom * OriginTranslation
Пример трансформации без происхождения, порядок: масштаб * вращение * перевод