2011-01-24 9 views
0

(C#で) 'カラー'データ構造を実装するための最良のデザインパターンは何でしょうか? RGB、HSV、XYZ、Yxy、Luv、Lab、HSLなどの色空間のいずれかで色を表現したいと考えています。あるフォーマットから別のフォーマットに変換したいと考えています。私は一定数の色空間をサポートしたいと思います。'カラー'構造に最適なデザインパターンは何ですか?

+1

アプリケーション領域とは何ですか?スクリーン/プリントのような単純な違いでさえ、その2つの共通の答えがないほど大きくなります。 「すべての領域」と言えば、視覚的な光/人間の視界を超えなければなりません。 – MSalters

+1

おなじみです:http://stackoverflow.com/questions/4770921/how-would-i-represent-an-hsl-and-an-rgb-color-as-a-class-in-c/4778968#4778968 –

答えて

1

1つのクラスから別のクラスに変換できるヘルパークラスを作成すると、Vector3のような単純なクラスを使用したり、データを保持することができます。

RGB、HSV、およびすべてが3つの値であるため、すべてのデータにVector3を使用できます。しかし、誤った値を間違った方法で取得しないようにするのはプログラマの責任です。

正しい値のタイプを保証する。 Vector3を基本クラスとして使用し、すべての型(RGBなど)に基本クラスを継承させることができます。

Colorと呼ばれる「インタークラス」を作成することもできます。抽象クラスです。 RGBクラスは、すべての抽象定義メソッドを実装できます。

だからあなたが得る:

  • Vector3を(ほとんどの言語は、このようなクラスのいくつかの並べ替えを持っている)
  • abstract Color extends Vector3(抽象メソッドを持っている)
  • RGB extends Color(他のクラスへの変換のためのすべてのメソッドを実装します)。

変換するColorの抽象メソッドは、Color自体を返します。したがって、そのようなメソッドをオーバーライドすることができます。

+0

ええ、色空間をまっすぐに保つためにプログラマに任せないでください。それは途方もない*簡単な方法です。使用可能な場合は型の安全性を利用してください。 –

+1

IMHOクラス階層が壊れています。 Vector3から継承すると、内部データストレージが公開されます。 Vector3はRGBでのみ動作します(スペースとパフォーマンス上の理由から、単一の整数とビットシフトが望ましい)、RGBA(アルファコンポーネントのRGB)をサポートしたい場合は既に動作していません。私はコンストラクションを継承よりも優先し、単一の型と変換コンストラクタと色空間の間で変換するメソッドを使用します。例えば、 QtのQColor:http://doc.qt.nokia.com/latest/qcolor.html –

+0

@Frank確かにいいアイデアのようだ。それは私が思うものに依存します。実際、 'Vector3'を拡張するのはそれほど素晴らしいことではありませんが、その周りにラッパークラスを構築することはうまくいくと思います。 – Marnix