C# 在我的热图绘图组件中,y轴时间文本没有完全对齐

C# 在我的热图绘图组件中,y轴时间文本没有完全对齐,c#,bitmap,C#,Bitmap,我有一个方法,它接收位图、宽度、高度和字符串列表,将其覆盖在黑色背景上,并在其上添加y轴文本(如下图所示) 在我尝试对齐文本以使其占据图形的确切垂直空间时,我取了高度并将其除以列表中的值数: float verticalDistance=高度/次数。计数 但是,可能是由于对齐问题,y轴上每个时间值之间的间距没有精确固定到原始位图的高度,该高度是变量height 我认为这是int的问题,它会向上或向下舍入数字,但将verticalDistance更改为float并不能改善问题 privat

我有一个方法,它接收位图、宽度、高度和字符串列表,将其覆盖在黑色背景上,并在其上添加y轴文本(如下图所示)

在我尝试对齐文本以使其占据图形的确切垂直空间时,我取了高度并将其除以列表中的值数:

float verticalDistance=高度/次数。计数

但是,可能是由于对齐问题,y轴上每个时间值之间的间距没有精确固定到原始位图的高度,该高度是变量
height

我认为这是
int
的问题,它会向上或向下舍入数字,但将
verticalDistance
更改为float并不能改善问题

    private Bitmap overlayBitmap(Bitmap sourceBMP, int width, int height, List<String> times) {
        int newWidth = width + (width / 3);
        int newHeight = height + (height / 3);
        Bitmap result = new Bitmap(newWidth, newHeight);
        using (Graphics g = Graphics.FromImage(result)) {
            g.FillRectangle(Brushes.Black, 0, 0, newWidth, newHeight);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;

            StringFormat stringFormatX = new StringFormat();
            stringFormatX.LineAlignment = StringAlignment.Center;

            Font drawFontX = new Font("Whitney", 10);

            float verticalDistance = height / times.Count;
            for (int i = 0; i < times.Count; i++) {
                if (i % 5 == 0) {
                    g.DrawString(times[i], drawFontX, Brushes.White, 5, ((newHeight - height)/2) + (verticalDistance * i), stringFormatX);
                }
            }
            g.DrawImage(sourceBMP, width / 6, height / 6, width, height);
        }
        return result;
    }
private Bitmap overlybitmap(位图源bmp、int-width、int-height、列表时间){
int newWidth=宽度+(宽度/3);
int newHeight=高度+(高度/3);
位图结果=新位图(新宽度、新高度);
使用(Graphics g=Graphics.FromImage(结果)){
g、 FillRectangle(画笔:黑色、0、0、新宽度、新高度);
g、 插值模式=System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
StringFormat stringFormatX=新的StringFormat();
stringFormatX.LineAlignment=StringAlignment.Center;
Font drawFontX=新字体(“惠特尼”,10);
浮动垂直距离=高度/次数。计数;
for(int i=0;i


这里可能有什么问题?

将问题简化为最简单的情况:如果Y轴上只显示两个值,该怎么办?垂直距离就是轴的长度。在这种情况下,垂直距离公式不起作用。所以

float verticalDistance = height / (times.Count - 1.0);

您的解决方案,再加上我的浮点数除以int的事实,意味着精度的损失。当我把我所有的兴趣都投入到花车上时,它就完美地工作了。然而,这是一种良好的做法吗?图表:我的意思是:“事实上,我的浮点数除以int,这意味着精度下降。你的解决方案,加上我把所有的int都转换成float,意味着它工作得非常完美。然而,这是一个好的实践吗?我在上面的回答中将1改为1.0,以强制正确地转换计算条件。这是好的做法吗?这是确保垂直距离正确的唯一方法。如果要避免零除错误,必须确保times.Count始终大于1。我相信您必须使用
1.0f
作为浮点数,但无论如何,这是一个聪明的选择。下次我必须记住这个技巧。任何带有小数点的数字都会被编译器视为浮点,但1.0可能被解释为1.0f或1.0d(浮点或双精度),具体取决于您的环境。实际上,我发现这并不重要,所以我总是省略f或d后缀。