绘制矩形集时翻转坐标

时间:2016-05-28 10:32:43

标签: c# winforms shapes

我正在尝试绘制一组正方形,但是正方形的原点(0,0)最初位于左上角,我希望从右下角渲染正方形, 我找到了这个代码来翻转坐标,但没有任何东西在winform上呈现。

我知道我在TranslateTransform的Height属性中出错了。我不知道为什么需要高度,因为我试图绘制一组2D广场。

我试过硬编码高度属性仍然没有用。

public void ScaleTransformFloat(PaintEventArgs e,List<Square> lstSquare)
    {
        int Height = 10;
        // Begin graphics container
        GraphicsContainer containerState = e.Graphics.BeginContainer();

        // Flip the Y-Axis
        e.Graphics.ScaleTransform(1.0F, -1.0F);

        // Translate the drawing area accordingly
        //
        e.Graphics.TranslateTransform(0.0F, -(float)Height);

        // Whatever you draw now (using this graphics context) will appear        as
        // though (0,0) were at the bottom left corner

    //User-defined function to draw a square    
        DrawSquare(e,lstSquare);
        // End graphics container
        e.Graphics.EndContainer(containerState);


    }

绘制正方形组的方法

  public void DrawSquare(PaintEventArgs e,List<Square> lstSquare)
    {
      foreach(Square s in lstSquare){
        e.Graphics.DrawRectangle(Pens.Black, 0,0 ,s.m_Side, s.m_Side);
      }
    }

1 个答案:

答案 0 :(得分:2)

当进行像变换这样的矩阵运算时,顺序确实很重要。

在您的情况下,您需要先翻译,然后缩放/翻转或反转翻译的方向。你的代码似乎做对了。

Height不是3d高度。它是您想要绘制的目标控件的总Height

想象一下,在你的控制器上放一张纸;控件是您的视口。现在想象一下在左上边缘翻转纸张。它离开了视口。现在你需要将其向下移动。但到了什么距离?答:纸张的高度..

您的代码的像素为Height = 10。这肯定不是你控制的大小,对吧?也许它来自你复制的代码;它可能意味着Form's Height。如果你想在表格上绘图(通常不是一个好主意),只需删除行int Height = 10;

我们举一个简单的例子:我们在Panel上绘制几个矩形:

enter image description here

private void panel1_Paint(object sender, PaintEventArgs e)
{
    if (checkBox1.Checked)
    {
        e.Graphics.ScaleTransform(1, -1);
        e.Graphics.TranslateTransform(0, -panel1.Height);
    }
    e.Graphics.DrawRectangle(Pens.Violet, 1, 1, 33, 33);
    e.Graphics.DrawRectangle(Pens.OrangeRed, 11, 11, 133, 55);
    e.Graphics.DrawRectangle(Pens.Magenta, 44, 11, 233, 77);
    e.Graphics.DrawRectangle(Pens.Olive, 55, 44, 33, 99);
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    panel1.Invalidate();
}

检查CheckBox后,结果被翻转:

enter image description here

另请注意,您的DrawSquare会在同一位置(0,0)绘制所有正方形。不确定这是不是你想要的......

最后的注意事项:DrawRectangle有一个讨厌的习惯,就是将一个像素的底边和右边过度拉长。将第一个部落从(1,1)更改为(0,0)后,(然后)底部将被切断。您可以考虑将图形坐标转换为1个像素。