scaletransfrom后的实际坐标

时间:2013-12-17 08:09:49

标签: c# scaletransform

我在C#中的WinForms应用程序中绘制一个矩形,我希望在应用ScaleTransform后得到矩形的实际坐标。

Graphics g = e.Graphics;
g.ScaleTransform(2.0F,2.0F,System.Drawing.Drawing2D.MatrixOrder.Append);
g.DrawRectangle(pen, 20, 40, 100,100)

1 个答案:

答案 0 :(得分:2)

ScaleTransform对象(或任何变换)中设置Graphics后,您可以使用它来变换矩形(或任何其他点)的点。

例如:

// your existing code
Graphics g = e.Graphics;
g.ScaleTransform(2.0F,2.0F,System.Drawing.Drawing2D.MatrixOrder.Append);

// say we have some rectangle ...
Rectangle rcRect = new Rectangle(20, 40, 100, 100);

// make an array of points
Point[] pPoints =
{
    new Point(rcRect.Left, rcRect.Top),      // top left
    new Point(rcRect.Right, rcRect.Top),     // top right
    new Point(rcRect.Left, rcRect.Bottom),   // bottom left
    new Point(rcRect.Right, rcRect.Bottom),  // bottom right
};

// get a copy of the transformation matrix
using (Matrix mat = g.Transform)
{
    // use it to transform the points
    mat.TransformPoints(pPoints);
}

请注意上面的using语法 - 这是因为,正如MSDN所说:

  

因为返回的矩阵和Transform属性是一个副本   你不应该在几何变换时处理矩阵   更需要它。

作为一个稍微不那么冗长的替代方案,你可以使用TransformPoints类(MSDN here)的Graphics方法做同样的事情 - 所以如上所述构建你的点数组,然后这样做:

g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, pPoints);

MSDN描述了上述函数中使用的相关坐标空间:

  

GDI +使用三个坐标空间:世界,页面和设备。世界   坐标是用于建模特定图形的坐标   world,是您传递给.NET中方法的坐标   框架。页面坐标是指a使用的坐标系   绘图表面,例如表格或控件。设备坐标是   被绘制的物理设备使用的坐标,例如a   屏幕或打印机。 Transform属性代表世界   转换,将世界坐标映射到页面坐标。