C#Windows窗体界面设计_03_坐标系平移 旋转 镜像

来源:互联网 发布:淘宝达人管理中心登陆 编辑:程序博客网 时间:2024/05/16 23:33

binzhouweichao@163.com

2013-10-16

正如前篇所说,Windows窗体默认的坐标系为:左上角为原点,右向为x正向,下方为y正向。

将坐标系转换成常见的平面直角坐标系,即:原点为左下角(或左下方),右侧为x正向,上方为y正向。

用到的坐标系转换方式有:镜像旋转,平移。


首先说一下Drawing库中的坐标系转换方法

参考:http://msdn.microsoft.com/zh-cn/library/System.Drawing.Graphics_methods.aspx


1 平移

TranslateTransform(Single, Single):通过使此 Graphics 的变换矩阵左乘指定的平移来更改坐标系统的原点。

例如:TranslateTransform(a, b),将原点向x方向平移a,向y方向平移b。此处入口参数a和b均为float类型。

重载:TranslateTransform(Single, Single, MatrixOrder):通过以指定顺序将指定平移应用于此 Graphics 的变换矩阵来更改坐标系统的原点。一般用不到此方法。


2 旋转

RotateTransform(Single):将指定旋转应用于此 Graphics 的变换矩阵。

例如:RotateTransform(45),将平面旋转45°。入口参数为角度,(应该是逆时针方向吧),是float类型。

重载:RotateTransform(Single, MatrixOrder):以指定顺序将指定旋转应用到此 Graphics 的变换矩阵。应该也是用不到。


3 缩放(特殊的缩放为镜像)

ScaleTransform(Single, Single):将指定的缩放操作应用于此 Graphics 的变换矩阵,方法是将该对象的变换矩阵左乘该缩放矩阵。

例如:ScaleTransform(a, b),将原平面x缩放a倍,y缩放b倍,入口参数a和b为float类型。

重载:ScaleTransform(Single, Single, MatrixOrder):以指定顺序将指定的缩放操作应用到此 Graphics 的变换矩阵。一般也用不到。。

特殊的缩放:

ScaleTransform(-1, 1):x轴缩放-1倍,y轴缩放1倍。即,原先的x变为-x,y不变,也就是平面关于y轴镜像旋转。

ScaleTransform(1, -1):同上,平面关于x轴镜像旋转。

ScaleTransform(-1, -1):平面关于原点对称旋转。

ScaleTransform(1, 1):平面不变。


通过上述介绍,可以得出,若想要坐标系原点为左下角,上方为y正向,则需要:

原点向下平移至左下角(附近),然后关于x轴镜像旋转。


以上篇02绘图为例,窗体大小为300*300,在去掉上方的标题栏和外围边框后,有大约250左右。则在建立画板后,绘图之前,将画板原点向下(y正向)平移250,再把y缩放-1倍即可。

在TriPaint.cs代码的绘图之前,添加:

            //坐标系平移镜像            g.TranslateTransform(0, 250);//向y正向平移300            g.ScaleTransform(1, -1);//关于x轴镜像

绘图完成后,需要释放绘图所占用资源,可以添加代码:

            //释放绘图所占用资源            p.Dispose();            g.Dispose();

这样,修改后的TriPaint.cs代码如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace TriPaint_20131013{    public partial class TriPaint : Form    {        public TriPaint()        {            InitializeComponent();            //在这里添加代码            //对数据进行处理            for (int i = 0; i < GlobalVars.POINTCNT; i++)            {                GlobalVars.Data[i].X = (int)(i * GlobalVars.xInterval);//i对应的data.X                GlobalVars.Data[i].Y = (int)(GlobalVars.times * Math.Sin(GlobalVars.Data[i].X / GlobalVars.times));//sin函数求值                GlobalVars.Data[i].Y = (int)(GlobalVars.Data[i].Y + GlobalVars.times * 1);//Y轴向正向平移1,即1*times,令最高点(也就是3π/2对应的-1点)的值为0            }        }        private void TriPaint_Load(object sender, EventArgs e)        {            Graphics g = this.CreateGraphics();//画板            this.Show();//显示            //坐标系平移镜像            g.TranslateTransform(0, 250);//向y正向平移300            g.ScaleTransform(1, -1);//关于x轴镜像            Pen p = new Pen(Color.Blue, 1);//画笔            g.DrawLines(p, GlobalVars.Data);//多点绘图,直线连接            //释放绘图所占用资源            p.Dispose();            g.Dispose();        }    }}

前后结果图对比:



参考:http://www.csharpwin.com/csharpspace/9501r5384.shtml



原创粉丝点击