当把一个单位球投射到平面上时,我也想画出原始的和投影的坐标。由于我从未停止使用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+会抛出一个异常。
我应该使用自定义坐标转换而不是内置坐标转换吗?或者我应该切换到另一个图形库?哪个?
发布于 2014-09-10 23:18:31
是的,您可以绘制文本,以便只转换位置,而不是大小。不要使用ScaleTransform。相反,将文本点坐标乘以缩放因子。或者创建一个矩阵,然后用它进行乘法。您描述的例外情况可能是试图将字体大小设置为0。
https://stackoverflow.com/questions/24475349
复制相似问题