Q:座標空間をシアー変形する NSAffineTransform を行うには、どのようにすればよいでしょうか。 A:アフィン変換を使用して、座標空間に任意の回転、拡大・縮小、シアー変形の組み合わせを適用できます。アフィン変換は数学的には極めて単純で、Quartz 2D のマニュアルのここに説明があります。 NSAffineTransform クラスのマニュアル には、シアー変形は可能だが変換構造の適切な値を直接設定する必要がある、と書かれています。これをより簡単に実現する方法は、Objective-C category を使用し、クラスにメソッドを追加して、シアー変形の値を設定することです。
|
リスト 1.NSAffineTransform_Shearing.h
|
#import <Cocoa/Cocoa.h>
@interface NSAffineTransform (Shearing)
- (void) shearXBy:(float) xShear yBy:(float) yShear;
- (void) shearXBy:(float) xShear;
- (void) shearYBy:(float) yShear;
@end
|
|
リスト 2.NSAffineTransform_Shearing.m
|
@implementation NSAffineTransform (Shearing)
- (void) shearXBy: (float) xShear yBy: (float) yShear;
{
NSAffineTransform
*shearTransform = [[NSAffineTransform alloc] init];
NSAffineTransformStruct
transformStruct = [shearTransform transformStruct];
transformStruct.m21 = xShear;
transformStruct.m12 = yShear;
[shearTransform setTransformStruct:transformStruct];
[self appendTransform:shearTransform];
[shearTransform release];
}
// 同時に 1 つの軸だけをシアー変形したい場合...
- (void) shearXBy:(float) xShear { [self shearXBy:xShear yBy:0.0]; }
- (void) shearYBy:(float) yShear { [self shearXBy:0.0 yBy:yShear]; }
@end
|
この手法を使ったコードの例は、Transformed Image サンプルコードプロジェクトを参照してください。
[2004 年 1 月 29 日]
|