【问题标题】:Flip coordinates when drawing set of rectangles绘制矩形集时翻转坐标
【发布时间】:2016-05-28 10:32:43
【问题描述】:

我正在尝试绘制一组正方形,但正方形的原点(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);
      }
    }

【问题讨论】:

  • a) 不知道为什么在转换图形对象时会变得如此复杂(并且可能同样错误),而您也可以调整绘图代码。b) DrawSquare 将所有内容绘制在 ( 0,0),不管你以前做什么,所有的方块都在彼此的顶部。c) 10 像素的总高度,真的吗?
  • 实际上这是我在绘制形状方面的第一个任务。最初所有的正方形都是从左上角渲染的,我希望它们从左下角渲染。我遇到了link) 这将帮助我渲染正方形从左下角开始。但什么都没有出现。我想知道为什么在绘制一组二维正方形时需要高度
  • 高度不是 3d 高度。它是您要绘制的目标控件的总高度。从左上角向上翻转一张纸的成像。现在您需要将其向下移动。但距离是多少?答:纸张大小..

标签: c# winforms shapes


【解决方案1】:

在进行矩阵运算(如变换)时,顺序通常很重要。

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

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

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

您的代码有一个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 个像素。

【讨论】:

  • 正如你所说,边在 x 轴上的矩形(面板的底部和顶部)不会被渲染,即只有矩形的 3 个边被绘制,其中一个边在 x-轴....并且当 x 轴上没有边时,矩形的所有四个边都会被渲染。我该如何解决这个问题?
  • 没有办法。要么使它们小 1 个像素,要么将它们画离边缘更远的 1 个像素。使用 Height +- 1 是实现此目的的一种廉价且透明的方式..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多