0

私は、ユーザーが指で線を描くことができる iPad アプリケーションに取り組んでおり、その線の始点と終点を使用して、iPad の x/y 平面に対する線の角度を計算します。

私の問題は、描画された線の角度を使用して、現在のコンテキストに描画している画像の傾斜を設定したいということです。

これは、私の 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();

touchEnded メソッドで線の角度を計算します。描画された線のポイント値は、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];
       }
   }

よろしくお願いします。

4

1 に答える 1

1

せん断マッピングに関するウィキペディアの記事をご覧ください。勾配を取得し、値を歪めるときに 1.0 / m を使用する方がよいようです。

于 2012-07-26T20:16:11.057 に答える