C# GDI+绘图高级编程(三)
2011-02-01 09:50
162 查看
测量坐标和区域
GDI+使用几个类似的结构来表示坐标或区域。下面介绍几个结构,他们都是在System.Drawing命名空间中定义的。
结构 | 主 要 公 共 属 性|
| Point | X,Y |
| PointF | |
| Size | Width,Height |
| SizeF | |
| Rectangle | Left,Right,Top,Bottom,Width,Height|
| RectangleF | ,X,Y,Location,Size |
(1) Point、PointrF结构
从概念上讲,Point在这个结构中是最简单的,在数学上,它完全等价于一个二维矢量,包含两个公共整形属性,表示它与某个特定位置的水平和垂直距离(在屏幕上),如下图。
为了从点A到点B,需要水平移动20个单位,并向下垂直移动10个单位,在图中标为x和y,这就是他们的一般含义。创建一个Point结构,表示他们:
X 和 Y都是读写属性,也可以在Point中设置这些值:
注意:按照惯例,水平和垂直坐标表示为x和y(小写),但对应的Point属性是X和Y(大写),因为在C#中,公共属性的一般约定是名称以大写字母开头。
PointF与Point完全相同,但X和Y属性的类型是float,而不是int。PointF属性用于坐标不是整数值得情况。已经为这些结构定义了数据类型转换,这样就可以把Point隐式转换为PointF(这个转换是结构之间的)。但没有相应的逆过程,要把Point转换为Point,必须显示的复制值或使用下面的3个转换方法:Round(),Truncate(),Ceiling()。
在默认情况下,GDI+把单位看作是屏幕(或打印机,无论图形设备是什么,都可以这样认为)的像素,这就是Graphics对象方法把它们接受到的坐标看作其参数的方式。例如:点 new Point(20,10)表示在屏幕上水平移动20个像素,向下垂直移动10个像素。通常这些像素从窗体客户区域的左上角开始测量,如上图。但是,情况并不是如此。在某些情况下,需要以窗口的左上角(包括其边框)为原点来绘图,甚至以屏幕的左上角为原点。除特殊说明,大多数可以假定像素是相对于客户区域的左上角。
(2) Size、SizeF结构
Size结构用于int类型,SizeF用于float类型。
在许多情况下Size结构与Point结构是相同的。有两个整形属性,表示水平和垂直距离----区别是两个属性的名称是:Width和Heihgt。
严格的讲,Size在数学上与Point表示的含义相同;但在概念上它使用的方式略有不同。Point用于说明实体在什么地方,而Size用于说明实体有多大。但是Size和 Piont是紧密相关的,目前甚至支持他们之间的显示转换:
例如:前面绘制的矩形,其左上角的坐标是(0,0),大小是(50,50)。这个矩形的大小是(50,50),可以用一个Size实例来表示。其右下角的坐标也是(50,50),但它由一个Point来表示。
Point和Size结构的相加运算符都已经重载了,所以可以把一个Size加到Point结构上,得到另一个Point结构:
运行结果:
这个结果说明Point和Size的ToString()方法已被重写并以{X,Y}的格式显示。
还可以进行Point和Size之间的显示数据类型转换:
说明:s1.Width被赋予topLeft.X,s1.Height被赋予topLeft.Y的值。最后p1与topLeft的值相同。
<注:>本文参考文献
《C#高级编程》第4版 清华大学出版社
GDI+使用几个类似的结构来表示坐标或区域。下面介绍几个结构,他们都是在System.Drawing命名空间中定义的。
结构 | 主 要 公 共 属 性|
| Point | X,Y |
| PointF | |
| Size | Width,Height |
| SizeF | |
| Rectangle | Left,Right,Top,Bottom,Width,Height|
| RectangleF | ,X,Y,Location,Size |
(1) Point、PointrF结构
从概念上讲,Point在这个结构中是最简单的,在数学上,它完全等价于一个二维矢量,包含两个公共整形属性,表示它与某个特定位置的水平和垂直距离(在屏幕上),如下图。
为了从点A到点B,需要水平移动20个单位,并向下垂直移动10个单位,在图中标为x和y,这就是他们的一般含义。创建一个Point结构,表示他们:
Point ab = new Point(20,10); Console.WriteLine("Moved{0} across,{1} down",ab.x,ab.y);
X 和 Y都是读写属性,也可以在Point中设置这些值:
Point ab = new Point(); ab.X = 20; ab.Y = 10; Console.WirteLine("Moved{0} across,{1} down",ab.X,ab.Y);
注意:按照惯例,水平和垂直坐标表示为x和y(小写),但对应的Point属性是X和Y(大写),因为在C#中,公共属性的一般约定是名称以大写字母开头。
PointF与Point完全相同,但X和Y属性的类型是float,而不是int。PointF属性用于坐标不是整数值得情况。已经为这些结构定义了数据类型转换,这样就可以把Point隐式转换为PointF(这个转换是结构之间的)。但没有相应的逆过程,要把Point转换为Point,必须显示的复制值或使用下面的3个转换方法:Round(),Truncate(),Ceiling()。
PointF abFloat = new PointF(25.5F,10.9F); // converting to Point Point ab = new Point(); ab.X = (int)abFloat.X; ab.Y = (int)abFloat.Y; Point ab1 = Point.Round(abFloat); Point ab2 = Point.Truncate(abFloat); point ab3 = Point.Ceiling(abFloat); // but conversion back to PointF is implicit PointF abFloat2 = ab;
在默认情况下,GDI+把单位看作是屏幕(或打印机,无论图形设备是什么,都可以这样认为)的像素,这就是Graphics对象方法把它们接受到的坐标看作其参数的方式。例如:点 new Point(20,10)表示在屏幕上水平移动20个像素,向下垂直移动10个像素。通常这些像素从窗体客户区域的左上角开始测量,如上图。但是,情况并不是如此。在某些情况下,需要以窗口的左上角(包括其边框)为原点来绘图,甚至以屏幕的左上角为原点。除特殊说明,大多数可以假定像素是相对于客户区域的左上角。
(2) Size、SizeF结构
Size结构用于int类型,SizeF用于float类型。
在许多情况下Size结构与Point结构是相同的。有两个整形属性,表示水平和垂直距离----区别是两个属性的名称是:Width和Heihgt。
Size ab = new Size(20,10); Console.WriteLine("Moved {0} across,{1} down",ab.Width,ab.Height);
严格的讲,Size在数学上与Point表示的含义相同;但在概念上它使用的方式略有不同。Point用于说明实体在什么地方,而Size用于说明实体有多大。但是Size和 Piont是紧密相关的,目前甚至支持他们之间的显示转换:
Point point = new Point(); Size size = (Size)point; Point anotherPoint = (Point)size;
例如:前面绘制的矩形,其左上角的坐标是(0,0),大小是(50,50)。这个矩形的大小是(50,50),可以用一个Size实例来表示。其右下角的坐标也是(50,50),但它由一个Point来表示。
Point和Size结构的相加运算符都已经重载了,所以可以把一个Size加到Point结构上,得到另一个Point结构:
static void Main(string[] args) { Point topLeft = new Point(10,10); Size rectangleSize = new Size(50,50); Point bottomRight = topLeft + rectangleSize; Console.WriteLine("topLeft = " + topLeft); Console.WriteLine("bottomRight = " + bottomRight); Console.WirteLine("Size = " + rectangleSize); }
运行结果:
topLeft = {X=10,Y=10} bottomRight = {X=60,Y=60} Size = {Width=50,Height=50}
这个结果说明Point和Size的ToString()方法已被重写并以{X,Y}的格式显示。
还可以进行Point和Size之间的显示数据类型转换:
Point topLeft = new Point(10,10); Size s1 = (Size)topLeft; Point p1 = (Point)s1;
说明:s1.Width被赋予topLeft.X,s1.Height被赋予topLeft.Y的值。最后p1与topLeft的值相同。
<注:>本文参考文献
《C#高级编程》第4版 清华大学出版社
相关文章推荐
- C# GDI+绘图高级编程(一)
- C#学习笔记:GDI图形高级编程(2)——关于Brush类
- C#学习笔记:GDI图形高级编程(1)——如何将图形画到控件上
- C# GDI+绘图高级编程
- C#_06_高级编程
- c# GDI+简单绘图(一)
- C# GDI+ 简单绘图 (三)
- C#2005 .NET3.0高级编程学习笔记————类和结构,类的数据成员,类的函数成员(方法、属性)
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)
- C# 6 与 .NET Core 1.0 高级编程_0
- C# 6 与 .NET Core 1.0 高级编程
- C#高级编程 学习总结
- C# 6 与 .NET Core 1.0 高级编程
- C#高级编程七十二天----DynamicObject和ExpandoObject
- 3_C# 高级编程(第六版)学习笔记——第3章 对象和类型
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
- C# 高级编程 - .NET结构
- 学友来函003:我该如何选择C#高级编程图书?
- 【读书笔记】C#高级编程 第一章
- c# GDI+简单绘图(四)