0

考えられることはすべて試しましたが、どれもうまくいきませんでした。iOS UIView drawRect で、画像、画像上のポイント、スケール、および角度を取得し、ビューの中心で指定されたポイントを中心に回転した画像を描画する関数が必要です。したがって、原点 (0,0) を中心に回転したい場合、画像の端がビューの中央に表示されます。

コードの最初のバージョンは次のとおりです。

-(void)drawImage:(UIImage*)image atAngle:(float)theta atScale:(float)scale whereCenter:(JBPoint*)center inContext:(CGContextRef)context
{
    UIGraphicsPushContext(context);

    //Rotate
    CGContextTranslateCTM (context, -center.x, -center.y);
    CGContextRotateCTM (context, theta);
    CGContextTranslateCTM (context, center.x, center.y);

    //Scale
    CGContextScaleCTM(context, scale, scale);

    //Draw
    GContextDrawImage(context, self.frame, image.CGImage);

    UIGraphicsPopContext();

}

ただし、これにより、アフィン変換のみを実行したにもかかわらず、アフィン変換ではないように画像が歪んでしまいました。

しばらくいじった後、私は手でそれを行うことに決め、4 つのコーナー ポイントの位置を計算して描画します。

-(void)drawImage:(UIImage*)image atAngle:(float)theta atScale:(float)scale whereCenter:(JBPoint*)center inContext:(CGContextRef)context
{
    UIGraphicsPushContext(context);

    CGContextRotateCTM (context, theta);

    float ux = cos(theta);
    float uy = sin(theta);
    float vx = sin(theta);
    float vy = -cos(theta);

    CGPoint p1 = CGPointMake(self.frame.size.width/2.0f-ux*scale*center.x-vx*scale*(image.size.height - center.y), self.frame.size.height/2.0f-uy*scale*center.x-vy*scale*(image.size.height - center.y));
    CGPoint p2 = CGPointMake(p1.x+ux*image.size.width*scale, p1.y+uy*image.size.width*scale);
    CGPoint p3 = CGPointMake(p2.x+vx*image.size.height*scale, p2.y+vy*image.size.height*scale);
    CGPoint p4 = CGPointMake(p1.x+vx*image.size.height*scale, p1.y+vy*image.size.height*scale);

    //Sanity check. These all should be the same since I want to center at the center of the frame
    NSLog(@"Center: %f, %f", (p1.x+p3.x)/2.0f, (p1.y+p3.y)/2.0f);
    NSLog(@"Center: %f, %f", (p2.x+p4.x)/2.0f, (p2.y+p4.y)/2.0f);
    NSLog(@"Center: %f, %f", self.frame.size.width/2.0f, self.frame.size.height/2.0f);

    float minX = MIN(MIN(p1.x, p2.x), MIN(p3.x, p4.x));
    float minY = MIN(MIN(p1.y, p2.y), MIN(p3.y, p4.y));

    float maxX = MAX(MAX(p1.x, p2.x), MAX(p3.x, p4.x));
    float maxY = MAX(MAX(p1.y, p2.y), MAX(p3.y, p4.y));

    CGContextSetAlpha(context, alpha);
    CGContextScaleCTM(context, 1, -1);

    CGContextDrawImage(context, CGRectMake(minX, -minY, (maxX-minX), -(maxY-minY)), image.CGImage);
    UIGraphicsPopContext();
}

これは角度が 0 の場合に機能しますが、角度が 90 度 (pi/2) になるとすぐに画像が極端に歪んでしまい、意味がありません。

これはとても単純な問題のようです。なぜそんなに難しいのですか?誰かが私が間違っていることを見ていますか?

4

0 に答える 0