C#Graphics.DrawString和Graphics.ScaleTransform冲突?

时间:2014-06-29 10:47:48

标签: c# gdi+

将单位球投影到平面上时,我还想绘制原始坐标和投影坐标。由于我从未停止使用WinForms,因此我使用GDI +绘制图像:

private void btnRender_Click(object sender, EventArgs e)
{
    tabMain.SelectedTab = tabRender;
    var tangent = new Vector3D(0.0, 0.0, -1.0);
    var xsize = 2048;
    var ysize = 2048;
    var pen = new Pen(Color.Maroon, (float)(1 / xsize));
    var font = new Font("Arial", 10);
    var brush = new SolidBrush(Color.Black);

    var bmp = new Bitmap(xsize, ysize);
    using (var g = Graphics.FromImage(bmp)) {
        g.TranslateTransform(xsize / 2, ysize / 2);
        g.ScaleTransform(xsize, ysize);
        foreach (var v in hull.Vertices) {
            foreach (var f in v.VoronoiFaces) {
                var pts = f.Vertices.Select(v1 => (PointF)Projector.Stereographic(v1, tangent)).ToArray();
                g.DrawPolygon(pen, pts);
            }
            var pt = (PointF)Projector.Stereographic(v.Vertex, tangent);
            var str = String.Format("{0}->{1}", v.Vertex, pt);
            g.DrawString(str, font, brush, pt);
        }
    }
    picRender.Width = xsize;
    picRender.Height = ysize;
    picRender.Image = bmp;
}

当我渲染图像时,g.DrawString(str, font, brush, pt);不会在屏幕上绘制任何内容。似乎g.ScaleTransform(xsize, ysize);是罪魁祸首,因为当我删除它时,所有文本都被绘制出来。我猜它会缩放文本,文本会被推离屏幕。有没有办法绘制文本,使其大小不变,但它的位置是?当我将字体大小除以比例因子时,GDI +会抛出异常。

我应该使用自定义坐标转换而不是内置坐标转换吗?或者我应该切换到不同的图形库?哪一个?

1 个答案:

答案 0 :(得分:0)

是的,您可以绘制文本,只转换位置,而不是大小。不要使用ScaleTransform。而是将文本点坐标乘以缩放因子。或者创建一个矩阵并使用它来乘以。您描述的例外可能是尝试将字体大小设置为0。