2012-01-24 8 views
0

私は繰り返し、RotateFlipTypeをよりモジュラー的に扱いたいと思っています。RotateFlipTypeヘルパー関数?

たとえば、ある時点で、RotateFlipType列挙型を1つ保存し、ユーザーがボタンを1回クリックするだけで反転させたり回転させたりすることができます。私は、データにRotateFlipTypeを適用する必要があるときに、後でこれを保存する必要があります。

基本的に、私は複数の変数にすべてを別々に保存する必要があります。あるいは、私は次のような論理を持つ必要があります:

private RotateFlipType ApplyHorizontalFlip(RotateFlipType oldFlip) 
{ 
    switch (oldFlip) 
    { 
     case RotateFlipType.Rotate180FlipNone: 
      return RotateFlipType.RotateNoneFlipNone; 

     case RotateFlipType.Rotate180FlipX: 
      return RotateFlipType.RotateNoneFlipX; 

     case RotateFlipType.Rotate180FlipXY: 
      return RotateFlipType.RotateNoneFlipXY; 

     case RotateFlipType.Rotate180FlipY: 
      return RotateFlipType.RotateNoneFlipY; 

     case RotateFlipType.Rotate270FlipNone: 
      return RotateFlipType.Rotate90FlipNone; 

     // etc... 
    } 
} 

フレームワークを構築するヘルパーメソッドはありますか?基本的には、既存のRotateFlipTypeを取得し、回転または反転させて新しい値を与えることによって変更します。

+0

重複した値が多数ありますが、RotateNoneFlipNoneはRotate180FlipXYとまったく同じものです。わずか8つの異なる値があります。 Reflectorのようなツールを使用して値を表示します。 8要素の配列から小さなルックアップテーブルを作成することができます。 –

+0

Visual Studioで[定義に移動]をクリックすると、8つの異なる値が表示されます。私はまだ彼らと一緒に働くのは痛いと感じています。それぞれの値を別々に保存しても(rotation、flipX、flipY)、列挙型に変換するのは苦痛です。それは一見、ページとswitch文のページです。 –

+0

Google検索で「ルックアップテーブル」と入力し、最初のヒットを取得します。 –

答えて

0

私のアプローチは、レンダリングの瞬間まで、フリップと回転を別々に保存することです。フリップ値にはRotateFlipTypeを使用し、次数にはNumberを使用します。これらのメソッドを使用して、それらを適切なRotateFlipType値に結合します。

ここで行ったように、特に外部APIとして公開されている場合は、独自の列挙型をRotateFlipTypeの代わりに使用することをおすすめします。

private double normalizeTo90Intervals(double d){ 
     d = d % 360; //Coalesce multiples 
     if (d < 0) d += 360; //Force positive 
     //Use manual rounding 
     if (d >= 315 && d < 360) return 0; 
     if (d >= 0 && d < 45) return 0; 
     if (d >=45 && d < 135) return 90; 
     if (d >= 135 && d < 225) return 180; 
     if (d >= 225 && d < 315) return 270; 
     return 0; //to make compiler happy 
    } 

    private RotateFlipType combineFlipAndRotate(RotateFlipType flip, double angle) { 
     angle = normalizeTo90Intervals(angle); 
     if (flip == 0) return (RotateFlipType)(int)(angle/90); 
     else if (flip == (RotateFlipType)4) return (RotateFlipType)(int)(4 + (angle/90)); 
     else if (flip == (RotateFlipType)6) { 
      if (angle == 0) return (RotateFlipType)6; 
      if (angle == 90) return (RotateFlipType)7; 
      if (angle == 180) return (RotateFlipType)4; 
      if (angle == 270) return (RotateFlipType)5; 
     } else if (flip == (RotateFlipType)2) { 
      if (angle == 0) return (RotateFlipType)2; 
      if (angle == 90) return (RotateFlipType)3; 
      if (angle == 180) return (RotateFlipType)0; 
      if (angle == 270) return (RotateFlipType)1; 
     } 

     throw new ArgumentException("Valid flip values are RotateNoneFlipNone, RotateNoneFlipX, RotateNoneFlipY, and RotateNoneFlipXY. Rotation must be specified with Rotate or srcRotate instead. Received: " + flip.ToString()); 
    } 

参考までに、http://imageresizing.net/について聞いたことがありますか?

関連する問題