-3

私が取り組んでいるプロジェクトの単純なヒストグラムを描く必要があり、これを見る必要があります...

ヒストグラム

各グレースケール値に属するピクセル数で構成される H[] 配列で実行するには、いくつかの単純な for ループが必要であることを知っています...したがって、H[] では、「グレースケール値で 10 ピクセル」と言います。 1」なので、1 の場合、画像の横に垂直に伸びる長さ 10 の線があります...

誰かが彼らの助けを提供できるなら、私はそれを大いに感謝します!

ありがとう。

これを書きましたが、大きすぎて逆さまで、何らかの理由で角度がついています。

         if (H != null) {
                    int width = getWidth();
                    int height = getHeight();           
                    int HhPos = (width - (width/2));
                    int HvPos = (height - (height));
                  for(int i = 0 ; i <255 ; i++){
                     g.drawRect(i+HhPos, i+HvPos, 1, H[i]);


                   }
4

2 に答える 2

0

x と y の値を持つ点をプロットしています。幅と高さがピクセル単位のヒストグラムを描画しています。

たとえば、ヒストグラムが幅 500 ピクセル、高さ 300 ピクセルであるとします。

データ ポイントを 1 回調べて、最小 x、最小 y、最大 x、最大 y を探します。

Y ポイント (X 軸は幅) をプロットすると仮定すると、最大 x から最小 x を減算します。500 ピクセル (幅) を差で割ると、x 値あたりのピクセル数が得られます。この数は 1 より大きい場合があるため、x 値ごとに複数のピクセルがあります。この数は 1 未満になる可能性があるため、ピクセルよりも多くのデータ値があります。

width pixels per value = width of histogram in pixels / difference in X points

Y 軸についても同じことを行います。y 値ごとのピクセルを計算します。

height pixels per value = height of histogram in pixels / difference in y points

ここで、データ ポイントをもう一度調べます。データ ポイントごとに、データ ポイントの x 値と y 値から幅と高さをピクセル単位で計算します。幅と高さの両方の値ごとのピクセル数を使用して変換を行います。

width = x value * width pixels per value

height = y value * height pixels per value

JavaGraphics drawLineまたはdrawRectメソッドを使用して、ヒストグラムに線または棒を描画します。Java グラフィックスの Y 次元は、ヒストグラフのように上昇するのではなく、下降することを覚えておいてください。描画するときは、これを考慮する必要があります。

于 2012-09-21T18:33:49.330 に答える
0

ギルバートが言ったように、最大​​範囲または上限を決定するには、値を正規化する必要があります。

これから、最大値と比較した特定の値のパーセンテージを決定し、使用可能な高さに基づいてグラフにプロットできます。

この質問に対する以前の回答から取得)

// Determine the maximum vertical value...
int maxValue = 0;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    maxValue = Math.max(maxValue, value);
}

int xPos = xOffset;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    // Calculate the percentage that the given value uses compared to that of the
    // maximum value
    float percentage = (float)value / (float)maxValue;
    // Calculate the line height based on the available vertical space...
    int barHeight = Math.round(percentage * height);
    g2d.setColor(new Color(key, key, key));

    int yPos = height + yOffset - barHeight;
    Rectangle2D bar = new Rectangle2D.Float(xPos, yPos, barWidth, barHeight);

    g2d.fill(bar);
    g2d.setColor(Color.DARK_GRAY);
    g2d.draw(bar);

    xPos += barWidth;
}

前の例では、Mapto を使用して値を格納しましたが、それをデータ配列に置き換えるのは比較的簡単なはずです...

for (Integer key : mapHistory.keySet())になるだろうfor (int key : H)

また、 ではGraphics.drawLine、ある点から幅/高さの値ではなく、ある点から別の点に線を引いています (たとえばGraphics.drawRectangle)

于 2012-09-21T21:51:06.970 に答える