0

Je travaille sur une application iPad qui permet à l'utilisateur de tracer une ligne avec son doigt, puis en utilisant les points de début et de fin de cette ligne je calcule l'angle de la ligne par rapport à la plan x/y de l'iPad.Relation entre biais et angle - CGAffineTransform

Mon problème est que je veux utiliser l'angle de la ligne tracée pour définir l'inclinaison d'une image que je dessine dans le contexte actuel.

Ceci est le code relavent de ma méthode drawRect:

  CGSize size = CGSizeMake(1024, 768); 
     UIGraphicsBeginImageContext(size); 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGAffineTransform skewIt = CGAffineTransformMake(1, 0, skewValue, 1, 0, 0); 
     CGContextConcatCTM(ctx, skewIt); 

     CGContextDrawImage(UIGraphicsGetCurrentContext(), 
          CGRectMake(0,0,size.width, size.height), 
          theImage.CGImage); 

     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

Je calcule l'angle de la ligne dans mon procédé touchEnded, les valeurs des points de la ligne tracée sont stockés dans un tableau nommé skewArray:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    if (stepThree){ 
     CGContextClearRect(skewContext, CGRectMake(0, 0, 1024, 668)); 

     CGPoint pt1 = CGPointMake([[skewArray objectAtIndex:1]point3].x, [[skewArray objectAtIndex:1]point3].y); 
     CGPoint pt2 = CGPointMake([[skewArray objectAtIndex:[skewArray count]-1]point3].x, [[skewArray objectAtIndex:[skewArray count]-1]point3].y); 
     CGPoint pt3 = CGPointMake([[skewArray objectAtIndex:[skewArray count]-1]point3].x, [[skewArray objectAtIndex:1]point3].y); 

     CGFloat dis1 = sqrt((pow((pt2.x - pt1.x), 2) + pow((pt2.y - pt1.y), 2))); 
     CGFloat dis2 = sqrt((pow((pt3.x - pt2.x), 2) + pow((pt3.y - pt2.y), 2))); 
     CGFloat dis3 = sqrt((pow((pt1.x - pt3.x), 2) + pow((pt1.y - pt3.y), 2))); 

     angle = acos(((-1*pow(dis2, 2))+pow(dis1, 2)+pow(dis3, 2))/(2*dis1*dis3)) * 180/3.14; 

     //Do something with the angle to produce the appropriate skew value 

     [self setNeedsDisplay]; 
     } 
    } 

Merci d'avance pour votre aide!

+0

Quelle est votre question? Qu'est-ce qui ne fonctionne pas? Quels résultats obtenez-vous qui sont différents de ce que vous attendez? Votre description mentionne 2 points, mais votre code manipule 3 points. Que représentent les points? – user1118321

+0

Les trois points sont le premier point de la ligne, le dernier point de la ligne et un troisième point dérivé des deux premiers points pour créer un triangle rectangle. À partir des trois points, je calcule les longueurs de chaque côté. J'utilise ensuite les longueurs des côtés pour calculer l'angle de la ligne tracée. Ma question est comment puis-je traduire l'angle en degrés (ou radians) à une valeur qui peut être utilisée pour biaiser un contexte via un CGAffineTransform, de sorte que l'angle de l'asymétrie corresponde à l'angle de la ligne dessinée par l'utilisateur. – kevinstueber

+0

Consultez cet article [Wikipedia] (http://en.wikipedia.org/wiki/Shear_mapping) sur la cartographie de cisaillement. Il semble que vous feriez mieux d'obtenir la pente et d'utiliser 1,0/m comme valeur de biais. – user1118321

Répondre

1

Consultez cette Wikipedia article sur le mappage de cisaillement. Il semble que vous feriez mieux d'obtenir la pente et d'utiliser 1,0/m comme valeur de biais.

Questions connexes