Java 2D Graphics Reading Notes [3]

第三章 Geometry 几何图形

 

这一章主要讲述的内容

  • 表示点的类
  • 两个用于描述几何图形的重要接口:Shape和PathIterator
  • java.awt.geom包里面各种表示不同几何图形的类
  • 多个图形组合后的新图形

 

点(Points)

 

在Java 2D中,几何图形都有类似的类阶层模式,一个抽象类代表一个二维平面的一个几何图形,它的若干内部类派生自这个抽象类,分别提供不同的坐标精度(整数,单精度浮点数,双精度浮点数)。

 

image

代表一个2D平面上的点的类阶层结构

 

图形和路径(Shapes and Paths)

 

回顾第二章的内容,Java 2D的图形渲染引擎Graphics2D的两种最基本的操作是图形填充和图形轮廓的绘制,对于Graphics2D而言,所有图形都是一个Shape(java.awt.Shape),一个Shape可能包括轮廓和内部区域,Graphics2D的draw方法用于绘制Shape的轮廓,fill方法用于填充Shape的内部区域。

 

Shape的getBounds和getBounds2D方法可以返回一个矩形,它是图形的外廓矩形,刚好能够包裹Shape。

 

image

不同Shape的Bounds

 

Shape还有一系统方法用于判断包括,相交等状况,不过它最重要的方法还是getPathIterator,用于返回一个描述图形轮廓的路径(PathIterator)。

 

image

Java 2D 内置提供的所有的Shape

 

Shape的边界被称为路径(Path)。路径是由一系列基本指令组成,用于从一个点移动到另外一个点。比如下面的指令描述了一个正方形的轮廓。

  1. 移动到0,0
  2. 画一条线到72,0
  3. 画一条线到72,72
  4. 画一条线到0,72
  5. 画一条线回0,0

 

在Java 2D中,PathIterator封装了一个路径的全部片段(segments),用来描述图形的轮廓。Shape的getPathIterator方法用来返回该Shape的PathIterator,PathIterator跟Enumeration类似,程序可以从开始逐个访问每一个片段直到路径的结束。

 

Java 2D定义了5种可能的片段类型:

  1. SEG_MOVETO 用于移动当前的位置,不进行任何绘制操作
  2. SEG_LINETO 绘制一条直线
  3. SEG_QUADTO 绘制二次曲线
  4. SEG_CUBICTO 绘制三次曲线
  5. SEG_CLOSE 绘制一条直线回最后SEG_MOVETO的位置,用于结束当前的子路径

 

image

二次曲线包含一个控制点

 

 

image

三次曲线包含两个控制点

 

PathIterator的currentSegment方法可以用来查询当前的路径片段,next方法可以用来移动到下一个片段,isDone用于查询是否到了路径的终点。

 

image

用于打印一个图形的轮廓路径的示例代码

 

如果图形是一个比较复杂的轮廓路径相互缠绕的图形,如何对重叠区域进行判断是否属于图形的内部区域,Java 2D定义了两种缠绕规则(winding rules),WIND_EVEN_ODD和WIND_NON_ZERO用于图形内部区域的判断。PathIterator的getWindingRule方法可以用于返回该路径使用的缠绕规则。

 

image

WIND_EVEN_ODD规则

 

WIND_EVEN_ODD规则定义了:画一条直线穿越整个图形,每次跟图形的边界相交,则计数器加1(从1开始计数),当交点的计数器是奇数的时候,以它为起点到下一个交点的线段处于图形的内部。

 

image

WIND_NON_ZERO规则

 

WIND_NON_ZERO规则定义了:画一条直线穿越整个图形,每次跟图形的边界相交时,如果相交的边是从左向右的,则计数器加1(从0开始计数),如果相交的边是从右向左的,则计数器减1。当交点的计数器为0时,以它为起点到下一个交点的线段处于图形的内部。在这种规则下,图形反过来画,结果也是一样的。

 

Java 2D除了提供一系列内置的图形外,GeneralPath可以用于产生自定义的图形的轮廓(GeneralPath派生自Shape)。

 

image

通过程序创建一个自定义图形的示例代码

 

直线和曲线(Lines and Curves)

 

Java 2D里面已经包括了一组表示直线和曲线的类,并且都实现了Shape接口,虽然程序可以使用GeneralPath来创建,不过直接使用现成的类会更方便。

 

image

Line2D的类阶层

 

QuardCurve2D和CubicCurve2D可以用来构造二次曲线和三次曲线。

 

矩状图形(Rectangles)

 

RectangularShape是一个抽象类,用来表示那些被矩形包裹的图形,包括矩形,圆角矩形,椭圆形,弧形等。

 

image

圆角矩形

 

 

image

弧形

 

构造性区域图形(Constructive Area Geomerey)

 

在Java 2D中,我们可以把多个图形用不同的方式组合形成一个新的图形,新的图形类型为Area,它用来表示多个图形的组合。

 

image

不同的图形组合方式

Advertisements