将单位球投影到平面上时,我还想绘制原始坐标和投影坐标。由于我从未停止使用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 +会抛出异常。
我应该使用自定义坐标转换而不是内置坐标转换吗?或者我应该切换到不同的图形库?哪一个?
答案 0 :(得分:0)
是的,您可以绘制文本,只转换位置,而不是大小。不要使用ScaleTransform。而是将文本点坐标乘以缩放因子。或者创建一个矩阵并使用它来乘以。您描述的例外可能是尝试将字体大小设置为0。