0

私は次のC#コードを持っています:

int cellHeight = (int)Math.Floor((ClientSize.Height - controlsSpacing) / 25f);

int yStart = MarginSize + controlsSpacing;
for (int i = 0; i < 25; i++)
{
    g.DrawRectangle(Pens.Black, 0 + MarginSize, yStart, ClientSize.Width - MarginSize - 1,
                    cellHeight);
    yStart += cellHeight;
}

私がやろうとしているのは、上から下に伸び、そのClientSize領域に合うように等間隔に配置された25本の線を引くことです。私が抱えている問題は、最後に描かれた線が常に他の線よりも小さいか大きいように見えることです。私の数学はどこかで失敗しているに違いありません。どんな助けでもいただければ幸いです。

スクリーンショットは次のとおりです。

ここに画像の説明を入力してください

4

2 に答える 2

1

問題は

int cellHeight = (int)Math.Floor(..)
yStart += cellHeight;

を使用して削除した分数Math.Floorは、各反復で欠落し、表示されたギャップに蓄積されます。

yStart各反復で計算します。

int cellHeight = (int);

for (int i = 0; i < 24; i++)
{
    float yStart = MarginSize + controlsSpacing +
                 (ClientSize.Height - controlsSpacing) * i / 25f;

    g.DrawRectangle(Pens.Black,
                    MarginSize,
                    yStart,
                    ClientSize.Width - MarginSize - 1,
                    cellHeight);
}
于 2012-05-01T15:43:23.307 に答える
0

cellHeightとyStartをdoubleにし、DrawRectangleの呼び出しでそれらをintに変換します。単にintにキャストするのではなく、Math.Round()を実行する必要がある場合があります。

double cellHeight = (ClientSize.Height - controlsSpacing) / 25.0;

double yStart = MarginSize + controlsSpacing;

for (int i = 0; i < 24; i++)
{
    g.DrawRectangle(Pens.Black, 0 + MarginSize, (int)yStart, ClientSize.Width - MarginSize - 1,
                    (int)cellHeight);
    yStart += cellHeight;
}
于 2012-05-01T15:15:17.437 に答える