C# で HSL と RGB カラーをクラスとして表現するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/4770921

質問

C# で HSL カラーと RGB カラーを表すクラスを作成するにはどうすればよいでしょうか?

それを取得したら、各クラス属性を出力するメソッドを追加することはできますか?について聞いたことがあります ToString(), でも使い方がよくわかりません。

私は学生で C# の使用方法を学ぼうとしているので、いくつかのサンプル コードは非常に役立ちます。ありがとう!

役に立ちましたか?

解決

他の人にコードを書くように求める「質問」を投稿すると、人々はイライラします。新規ユーザーからの質問が多い 思われる これを要求し、あなたもそうします 明示的に. 。これで、反対票を投じたり、終了に投票したり、質問を削除したりするなど、他のユーザーから受けた否定的な反応の一部が説明できたと思います。ここであなたが追い出されるようなネガティブな経験をしていないことを願っています。将来的には、まず自分自身を助けようとしたという証拠を示せば、人々はあなたをもっと喜んで助けてくれるようになるでしょう。あなたが書いた(しかし動作しない)コードをいくつか見せてください。あるいは、自分で問題を解決しようとした考えられる方法をいくつか提案してください。ほとんどの質問は「些細すぎる」ものではなく、むしろ本当の質問ではありません。私たちはコード作成サービスではありませんが、喜んでお手伝いさせていただきます。

そうは言っても、コメントで行ったように、実際に質問に答え続けてみます。色と色空間の変換を扱うコーディングの問題が大好きだからです。色空間間で変換する方法に関する質問は、SO ですでに何度か質問され、回答されています。たとえば、私 (および他の数人) は (いくつかの異なる言語で) アルゴリズムを提供しました。 ここ. 。どちらも、選択した言語に簡単に変換できるはずです。

「これらの色空間の値を表すクラスをどのように記述するか」に関しては、それは非常に簡単です。Google で検索すると、すでに同じことをした人の検索結果がいくつか出てくるはずです。個人的には、作成することをお勧めします 構造, これは非常に軽量なオブジェクトであり、色の値は不変 (つまり、変化しない) であるため、クラスではありません。これは構造に完全に適合します。違いについて詳しく説明したい場合は、次のリンクを参照してください。 それ 質問 もっている すでに質問されています そして ここでも答えました.

しかし、どちらを選択しても、最終的な結果は非常に似ています。これがプログラミング クラスの場合は、自分でこれを実行できるようになるために知っておく必要があることはすべてすでに教えられていると思います。つまり、プライベート フィールド (メンバー変数)、パブリック プロパティ、メソッドについてはすでに学習しているはずです。まず、各色の値を表す 3 つのプライベート フィールドを含む構造体を作成します。色相 (H)、彩度 (S)、明度 (L)。おそらくそれぞれ次のタイプであるはずです Integer, 個々の色の値は 0 ~ 100、または 0 ~ 360 の整数であるためです。最大の精度を重視する場合は、それらを type として保存できます。 Decimal そしてへの変換を処理します Integer しかし、それがここで必要であるとは思えません。どちらの場合でも、次に、プライベート フィールドを世界に公開するパブリック プロパティを作成する必要があります。これはオブジェクト指向プログラミングの基本概念であり、新しい概念ではありません。(そうであれば、今すぐ立ち止まって、OOP について説明した本を手に入れる必要があります。Go を渡さないでください。200 ドルを集めないでください。) これらのパブリック プロパティは次のタイプである必要があります。 Integer, 、個々の色コンポーネント値ごとに 3 つ存在する必要があり、(少なくとも不変の構造体を作成している場合は) 読み取り専用である必要があります (セッターではなくゲッターのみを含めます)。このようなもの:

/// <summary>
/// Represents an HSL color, composed of individual
/// Hue, Saturation, and Lightness attributes.
/// </summary>
public struct HSLColor
{
    private int _hue;
    private int _saturation;
    private int _lightness;

    /// <summary>
    /// The hue attribute of the color.
    /// (This is a value, in degrees, from 0 to 360.)
    /// </summary>
    public int Hue
    {
        get { return _hue; }
    }

    /// <summary>
    /// The saturation attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Saturation
    {
        get { return _saturation; }
    }

    /// <summary>
    /// The lightness attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Lightness
    {
        get { return _lightness; }
    }
}

最後に、オーバーライドする必要があると言います。 ToString 方法。すでに学習したはずですが、このメソッドはベースから継承されるため、.NET Framework のすべてのクラスによって提供されます。 Object. 。もちろん、マークされています virtual, これにより、これをオーバーライドして独自の実装を提供できます。最も難しい部分は、戻り値がどのようなものであるべきかを理解することです。色を 3 つの個別の成分値を示すトライアドとして表すことを選択することもできます。いずれにせよ、次のものを利用する必要があります。 String.Format 方法, を使用すると、対応するオブジェクトの値に置き換えられる「フォーマット項目」を含む文字列を作成できます。たとえば、私のやり方は次のとおりです。

/// <summary>
/// Returns the "(HH, SS, LL)" representation of this HSLColor structure.
/// </summary>
public override string ToString()
{
    return string.Format("({0}, {1}, {2})",
                         this.Hue,
                         this.Saturation,
                         this.Lightness);
}

始めるにはこれで十分です。私 非常に ここで提供されているコードを単にコピーして課題として貼り付けないことをお勧めします。このままでは何も学べません。IDE を起動し、自分でコードを作成し、いくつかの異なるバリエーションを試してください。それがどのように機能するか、私がやったこと、そして自分で再度実行する方法を必ず理解してください。幸運を祈ります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top