高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1332
Shearing a Coordinate Space with NSAffineTransform


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 日]