您的位置:首页 > 编程语言 > C#

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

2013-10-16 14:55 531 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐