绘制矩形集时翻转坐标

Flip coordinates when drawing set of rectangles

我正在尝试绘制一组正方形,但正方形的原点 (0,0) 最初位于左上角,我希望正方形从右下角呈现, 我发现这段代码可以翻转坐标,但在 winform 上没有渲染。

我知道我在 TranslateTransform 的 Height 属性上出错了。我不明白为什么需要高度,因为我正在尝试绘制一组二维正方形。

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

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);
      }
    }

在进行像变换这样的矩阵运算时,通常 order 很重要。

在您的情况下,您需要先 翻译,然后 scale/flip 或反转翻译方向。您的代码似乎是正确的。

Height 不是 3d 高度。就是你要绘制的目标控件的总数Height

想象一下,在您的控件上放一张 sheet 纸;控件是您的视口。现在想象从左上边缘向上翻转纸张。它已经离开了视口。现在您需要将其向下移动。但是距离多远?答:纸的高度..

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

我们来做一个简单的例子:我们在 Panel:

上画几个矩形

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后结果翻转:

另请注意,您的 DrawSquare 在同一位置 (0,0) 绘制了所有方块。不知道是不是你想要的..

最后说明:DrawRectangle 有一个坏习惯,就是将底部和右侧过度绘制一个像素。将第一个位置从 (1,1) 更改为 (0,0) 后,(然后)底部将被切断。您可能会考虑将图形坐标平移 1 个像素..