绘制矩形集时翻转坐标
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 个像素..
我正在尝试绘制一组正方形,但正方形的原点 (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 个像素..