我正在尝试绘制一组正方形,但是正方形的原点(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);
}
}
答案 0 :(得分:2)
当进行像变换这样的矩阵运算时,顺序确实很重要。
在您的情况下,您需要先翻译,然后缩放/翻转或反转翻译的方向。你的代码似乎做对了。
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个像素。