0

私はいくつかのプロジェクトを勉強していて、The ColorPicker Project を始めました。私は LongToRgb 関数を理解できませんでした >>> 次のように:

**

Private Function LongToRGB(lColor As Long) As String
    Dim iRed As Long, iGreen As Long, iBlue As Long
    iRed = lColor Mod 256
    iGreen = ((lColor And &HFF00) / 256&) Mod 256&
    iBlue = (lColor And &HFF0000) / 65536
    LongToRGB = Format$(iRed, "000") & ", " & Format$(iGreen, "000") & ", " & Format$(iBlue, "000")
End Function

**

誰かにわかりやすい英語で説明してもらいたい...

4

2 に答える 2

3

Mod Operator (% in C#)

基本的に、除算の余りを返します。たとえば、13 Mod 4 = 1、つまり13/4 = 3、余りは1です。関数が何をするのかを理解するには、long値がどのように作成されるかを理解することが重要です。


すべての色(赤、緑、青)は0〜255の量で表されます。たとえば、次の値を想像してください:R(8)、G(3)、B(1)。

関数がその機能を実行する理由を理解するために、数値の範囲が0〜255(256値)ではなく0〜9(10値)のシナリオを見てみましょう。値をリバースエンジニアリングできる単一の値をどのように表現しますか?元の値をリバースエンジニアリングすることは不可能であるため、値を単純に合計することはできません(8 + 3 + 1 = 12)。代わりに、値に底を掛ける必要があります。ベースは値の範囲によって異なります...この例では、10個の値があるため10です。位置はゼロベースのインデックスです。赤の位置は0、緑の位置は1、青の位置は2です。

  • Value * (Base^Position))
  • 赤(8)=(8 * 10 ^ 0)= 8 * 1 = 8
  • 緑(3)=(3 * 10 ^ 1)= 3 * 10 = 30
  • 青(1)=(1 * 10 ^ 2)= 1 * 100 = 100

8 + 30 + 100 =138。そして、138は簡単にリバースエンジニアリングできます(実際、それを見るだけで!)。数学的にリバースエンジニアリングは次のように行われます。

  • (CombinedValue / (Base^Position)) % Base = OriginalValue
  • (138 /(10 ^ 0))%10 =(138/1)%10 = 138%10 = 8(赤)
  • (138 /(10 ^ 1))%10 =(138/10)%10 = 13(10進数は切り捨てられます)%10 = 3(緑)
  • (138 /(10 ^ 2))%10 =(138/100)%10 = 1(10進数は切り捨てられます)%10 = 1(青)

この関数はいくつかのことを行います。

  • なんらかの理由で、ビット演算子を無駄に実行し(lColor And &HFF00)ます。(lColor And &HFF0000)
  • それは数学を単純化します。赤(256 ^ 0 = 1)の場合は1で割っても意味がなく、X <256のすべてのXでX%256 = Xであるため、モジュロ演算子を使用して緑を取得する意味はありません。また、256 ^ 2 65536に等しい。
  • 色の値を表すことができる実際の範囲(0〜255、256の値)を使用します。

代わりに、関数の簡略化されたバージョンを実際に使用できます。

Private Function LongToRGB(lColor As Long) As String
    Dim iRed As Long, iGreen As Long, iBlue As Long

    iRed = lColor Mod 256
    iGreen = (lColor / 256) Mod 256
    iBlue = lColor / 65536

    LongToRGB = Format$(iRed, "000") & ", " & Format$(iGreen, "000") & ", " & Format$(iBlue, "000")
End Function

最後の方法は単なる文字列フォーマット関数であり、数学とは関係がないことに注意してください。

于 2012-04-10T18:56:24.353 に答える
3

Mod はモジュロ演算であり、よく言及され%ます。

2 つの値の間の整数除算の余りを取ります。あなたの状況では、コンポーネントの色 (赤、緑、青) の意味のある部分を、それらすべてがパックされた long から取得すると便利です。

例えば:

1234 Mod 100 = 34
于 2012-04-10T17:23:02.363 に答える