zy81_C#中在窗体中实现坐标变换
文章目录
- 1.坐标变换
- 2.完整程序
- 3. 代码解释
- button1_Click
- button2_Click
- button3_Click
1.坐标变换
-
平移
private void button1_Click(object sender, EventArgs e) { Rectangle redRectangle = new Rectangle(new Point(0, 0), new Size(120, 180)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Red, redRectangle); g.TranslateTransform(150, 120); Pen pen = new Pen(Color.Red, 3); g.DrawRectangle(pen, redRectangle); g.ResetTransform();//回到原来的坐标原点 }
-
旋转
private void button2_Click(object sender, EventArgs e) { Rectangle blueRectangle = new Rectangle(new Point(200, 0), new Size(120, 80)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Blue, blueRectangle); g.RotateTransform(45);//顺时针旋转45° g.FillRectangle(Brushes.Blue, blueRectangle); g.Dispose(); }
-
伸缩
private void button3_Click(object sender, EventArgs e) { Rectangle greenRectangle = new Rectangle(new Point(30, 100), new Size(120, 80)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Blue, greenRectangle); g.ScaleTransform(3f,0.5f);//单精度浮点型float g.FillRectangle(Brushes.Blue, greenRectangle); g.Dispose(); }
2.完整程序
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Rectangle redRectangle = new Rectangle(new Point(0, 0), new Size(120, 180)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Red, redRectangle); g.TranslateTransform(150, 120); Pen pen = new Pen(Color.Red, 3); g.DrawRectangle(pen, redRectangle); g.ResetTransform();//回到原来的坐标原点 } private void button2_Click(object sender, EventArgs e) { Rectangle blueRectangle = new Rectangle(new Point(200, 0), new Size(120, 80)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Blue, blueRectangle); g.RotateTransform(45);//顺时针旋转45° g.FillRectangle(Brushes.Blue, blueRectangle); g.Dispose(); } private void button3_Click(object sender, EventArgs e) { Rectangle greenRectangle = new Rectangle(new Point(30, 100), new Size(120, 80)); Graphics g = CreateGraphics(); g.FillRectangle(Brushes.Blue, greenRectangle); g.ScaleTransform(3f,0.5f);//单精度浮点型float g.FillRectangle(Brushes.Blue, greenRectangle); g.Dispose(); } }
3. 代码解释
button1_Click
-
创建矩形:首先,创建一个红色的矩形
redRectangle
,其位置在(0, 0)
,大小为120x180
。 -
获取Graphics对象:通过调用
CreateGraphics()
方法获取当前窗体的Graphics
对象,该对象用于在窗体上进行绘制。 -
填充矩形:使用
FillRectangle
方法和Brushes.Red
填充前面创建的红色矩形。 -
平移变换:通过
TranslateTransform(150, 120)
将绘图原点移动到(150, 120)
。这意味着接下来绘制的所有内容都会相对于这个新的原点进行绘制。 -
绘制矩形边框:使用
DrawRectangle
方法和一个红色的、宽度为3的Pen
对象来绘制红色矩形的边框。但是,由于已经对绘图原点进行了平移,且没有重新定位矩形的位置,因此这个边框可能看起来与预期的红色填充矩形不重合,而是基于新的原点绘制。 -
重置变换:通过
ResetTransform()
方法将绘图变换重置为默认状态,即回到原始的坐标原点(0, 0)
。
button2_Click
-
创建矩形:创建一个蓝色的矩形
blueRectangle
,其位置在(200, 0)
,大小为120x80
。 -
获取Graphics对象:与
button1_Click
相同。 -
填充矩形:首先,使用
FillRectangle
方法和Brushes.Blue
填充蓝色矩形。 -
旋转变换:通过
RotateTransform(45)
将绘图上下文顺时针旋转45度。注意,这会影响之后所有绘制的图形。 -
再次填充矩形:尽管矩形的坐标没有改变,但由于绘图上下文已经旋转,所以再次使用
FillRectangle
填充时,填充的形状将基于旋转后的坐标系统。这可能会导致填充效果看起来像是两个矩形重叠在一起,但实际上是一个矩形旋转后的填充效果。 -
释放Graphics对象:通过
Dispose()
方法释放Graphics
对象占用的资源。这是一个好习惯,特别是在你不再需要绘图对象时。
button3_Click
-
创建矩形:创建一个绿色的矩形
greenRectangle
(尽管变量名为greenRectangle
,但这里实际使用的是蓝色填充),其位置在(30, 100)
,大小为120x80
。 -
获取Graphics对象:与前面相同。
-
填充矩形:首先,使用
FillRectangle
方法和Brushes.Blue
(注意这里的颜色与变量名不匹配)填充绿色矩形。 -
缩放变换:通过
ScaleTransform(3f, 0.5f)
对绘图上下文进行缩放变换,水平方向放大3倍,垂直方向缩小到原来的0.5倍。 -
再次填充矩形:再次使用
FillRectangle
填充时,由于缩放变换,填充的矩形将基于新的缩放比例显示。这将导致一个水平拉伸且垂直压缩的矩形。 -
释放Graphics对象:同样,释放
Graphics
对象以释放资源。
-