[C#绘图]全局变换和局部变换

全局变换是应用于由给定的 Graphics 对象绘制的每个项目的变换。 与此相反,局部变换则是应用于要绘制的特定项目的变换。


全局变换

若要创建全局变换,请构造 Graphics 对象,再操作其 Transform 属性。 Transform 属性是 Matrix 对象,因此,它能够保存仿射变换的任何序列。 存储在 Transform 属性中的变换被称为世界变换。 Graphics 类提供了几个构建复合世界变换的方法:MultiplyTransform、RotateTransform、ScaleTransform 和 TranslateTransform。 下面的示例绘制了两次椭圆:一次在创建世界变换之前,一次在创建世界变换之后。 变换首先在 y 方向上缩放 0.5 倍,再在 x 方向平移 50 个单位,然后旋转 30 度。

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);

下图显示了变换中涉及的矩阵:

注意:在前面的示例中,椭圆围绕坐标系的原点旋转。原点位于工作区的左上角。 与椭圆围绕其自身中心旋转相比,这样会产生不同的结果。


局部变换

局部变换应用于要绘制的特定项目。 例如,GraphicsPath 对象具有 Transform 方法,可用来对该路径的数据点进行变换。 下面的示例绘制了一个没有变换的矩形以及一个有旋转变换的路径。 (假定没有世界变换)。

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);

局部变换和全局变换

世界变换可与局部变换合并,以得到多种结果。 例如,世界变换可用于修正坐标系统,而局部变换可用于旋转和缩放在新坐标系统上绘制的对象

假定您需要原点距工作区左边缘 200 像素、距工作区顶部 150 像素的坐标系统。 此外,假定您需要的度量单位是像素,且 x 轴指向右方,y 轴指向上方。 默认的坐标系统是 y 轴指向下方,因此您需要执行绕水平坐标轴的反射。 下图显示了这样的矩阵反射。

下一步,假定您需要执行一个向右 200 个单位、向下 150 个单位的平移。

下面的示例通过设置 Graphics 对象的世界变换,建立前面刚刚描述过的坐标系统。

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);

下面的代码(置于前面示例的结尾处)创建了由一个单独矩形组成的路径,该矩形的左下角在新坐标系统的原点。 矩形经过两次填充:一次不使用局部变换,一次使用局部变换。 局部变换包括在水平方向上缩放 2 倍,然后再旋转 30 度。

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);

下图显示了新的坐标系统和两个矩形:

时间: 2024-10-08 15:22:29

[C#绘图]全局变换和局部变换的相关文章

vue的全局组件和局部组件

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>全局组件.局部组件</title> <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script></head><body><div id="a

为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! 一.傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,最近,我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅

UIBarButtonItem关于全局修改,局部修改

全局修改:把所有UIBarButtonItem(或者一个控件)设为同一风格. 局部修改:根据一定条件把一部分UIBarButtonItem(或者一个控件)设为同一风格 有时侯你想把导航条左侧的所有按钮的外观,字体设置为同一风格,但你并不想把导航条左侧按钮外观字体或背景全部用以下代码来更改,如果这样改,有两个UIBarButtonItem,你就要写两次,这样写代码过于赘余,苹果提供了更好的方法统一设置. UIBarButtonItem *rightItem = [YBarButtonItem ba

sas宏(3)宏,调试宏,创建带参数的宏,理解符号表(全局宏与局部宏解析),宏条件运算符,在宏中进行运算

宏类似于c中的函数,传入指定参数后执行,并且宏内部可以包含data步程序和条件运算符号. 宏变量只是小小的变量....(by the way作用也很大) 1:宏的基本语法 如何创建一个简单的宏并使用? %macro prtlast; proc print data=&syslast (obs=5); title "Listing of &syslast data set"; run; %mend; %prtlast /*不要加分号,加了有可能出错*/ 宏创建过程中做了什

时域和频域变换之---傅立叶变换的意义

真是惭愧,学<数字信号处理>好长时间了,也记住了傅里叶变换的公式,也会做FFT程序了,但是居然不知道傅里叶变换的意义何在!真是该!! 还好,算是搞明白了.抛开数学上的意义不说,单说一下实际的一些意义吧.傅里叶变换是将信号从时域转换到频域,这样在时域上一些交叉在一起的.看不出来的信号的特性,在频域上就很明显的能看出来了.比如下图: Figure1,是a=0.4*sin(4*w*(x))的图形,Figure2,是b=1.6*cos(12*w*(x))的图形.这两个图形,在时间轴上,很容易看出来.但

vue 组件 全局注册与局部注册的方法

全局注册 html部分 <div id="e1"><name1></name1></div> script部分 <script type="text/javascript"> Vue.component('name1', { template: '<div>我是效果</div>'})   //定义全局模板        例如 Vue.component(tagName, option

vue.js 组件-全局组件和局部组件

这两天学习了Vue.js 感觉组件这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 首先Vue组件的使用有3个步骤,创建组件构造器,注册组件,使用组件3个方面. 代码演示如下: <!DOCTYPE html> <html> <body> <div id="app"> <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使用组件--> <my-component></my-compo

vue.js中的全局组件和局部组件

组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三个步骤: 1.创建组件构造器 2.注册组件 3.使用组件 先来看一段代码: <!DOCTYPE html> <html> <body> <div id="app"> <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使

傅立叶变换、拉普拉斯变换、Z变换之间 &lt;篇一&gt;

傅立叶变换.拉普拉斯变换.Z变换之间最本质的区别是什么? 简单的说:傅立叶变换就是将任一个函数展开成一系列正弦函数的形式,从而能够在频域进行频谱分析.而拉普拉斯变换是复频域,它的的引进主要是对微分方程起到了简便的变换作用,试想2阶的微分方程就够麻烦的了,高阶就别指望手动解了,数学系的牛人别见怪.所以拉式变换就将时域的微分方程变换成代数方程.而到了离散系统中,又出现了差分方程,因此人们就想既然连续系统中有拉式变换,那么是不是离散系统中也会有一个方法能够起到相同的简化作用呢?于是Z变化就提了出来.