我有以下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;
}
我要做的是绘制25条从顶部到底部延伸的线,并且间距相等,以适应ClientSize
区域。我遇到的问题是绘制的最后一行似乎总是比其余的更小或更大。我的数学必定在某处失败。任何帮助将不胜感激。
这是一个截图:
答案 0 :(得分: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);
}
答案 1 :(得分:0)
使cellHeight和yStart加倍,并在调用DrawRectangle时将它们转换为int。您可能需要执行Math.Round()而不是仅仅转换为int。
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;
}