zy81_C#中在窗体中实现坐标变换

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

    1. 创建矩形:首先,创建一个红色的矩形redRectangle,其位置在(0, 0),大小为120x180

    2. 获取Graphics对象:通过调用CreateGraphics()方法获取当前窗体的Graphics对象,该对象用于在窗体上进行绘制。

    3. 填充矩形:使用FillRectangle方法和Brushes.Red填充前面创建的红色矩形。

    4. 平移变换:通过TranslateTransform(150, 120)将绘图原点移动到(150, 120)。这意味着接下来绘制的所有内容都会相对于这个新的原点进行绘制。

    5. 绘制矩形边框:使用DrawRectangle方法和一个红色的、宽度为3的Pen对象来绘制红色矩形的边框。但是,由于已经对绘图原点进行了平移,且没有重新定位矩形的位置,因此这个边框可能看起来与预期的红色填充矩形不重合,而是基于新的原点绘制。

    6. 重置变换:通过ResetTransform()方法将绘图变换重置为默认状态,即回到原始的坐标原点(0, 0)

    button2_Click

    1. 创建矩形:创建一个蓝色的矩形blueRectangle,其位置在(200, 0),大小为120x80

    2. 获取Graphics对象:与button1_Click相同。

    3. 填充矩形:首先,使用FillRectangle方法和Brushes.Blue填充蓝色矩形。

    4. 旋转变换:通过RotateTransform(45)将绘图上下文顺时针旋转45度。注意,这会影响之后所有绘制的图形。

    5. 再次填充矩形:尽管矩形的坐标没有改变,但由于绘图上下文已经旋转,所以再次使用FillRectangle填充时,填充的形状将基于旋转后的坐标系统。这可能会导致填充效果看起来像是两个矩形重叠在一起,但实际上是一个矩形旋转后的填充效果。

    6. 释放Graphics对象:通过Dispose()方法释放Graphics对象占用的资源。这是一个好习惯,特别是在你不再需要绘图对象时。

    button3_Click

    1. 创建矩形:创建一个绿色的矩形greenRectangle(尽管变量名为greenRectangle,但这里实际使用的是蓝色填充),其位置在(30, 100),大小为120x80

    2. 获取Graphics对象:与前面相同。

    3. 填充矩形:首先,使用FillRectangle方法和Brushes.Blue(注意这里的颜色与变量名不匹配)填充绿色矩形。

    4. 缩放变换:通过ScaleTransform(3f, 0.5f)对绘图上下文进行缩放变换,水平方向放大3倍,垂直方向缩小到原来的0.5倍。

    5. 再次填充矩形:再次使用FillRectangle填充时,由于缩放变换,填充的矩形将基于新的缩放比例显示。这将导致一个水平拉伸且垂直压缩的矩形。

    6. 释放Graphics对象:同样,释放Graphics对象以释放资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值