目次||

第3章

幾何学的図形

Java 2D APIでは、点、直線、曲線、矩形など、基本的な幾何学オブジェクトを定義するクラスがいくつか提供されています。これらの新しい幾何学クラスは、java.awt.geomパッケージに含まれています。下位互換のため、RectanglePointPolygonなど、旧バージョンのJDKに存在していた幾何学クラスも、java.awtパッケージに残っています。

GeneralPathArc2DRectangle2DなどJava 2D APIの幾何学的図形は、java.awtで定義されているShapeインタフェースを実装しています。Shapeでは、幾何学的なパスを持つオブジェクトを記述したり検査したりするための、共通のプロトコルが提供されています。新しいインタフェースのPathIteratorは、幾何学的図形から要素を抽出するためのメソッドを定義しています。

幾何学クラスを使うと、ほとんどすべての2次元オブジェクトを、簡単に定義して操作できます。

3.1 インタフェースとクラス

次の表は、主要な幾何学インタフェースとクラスの一覧です。これらのインタフェースとクラスのほとんどは、java.awt.geomパッケージに含まれています。Shapeなどjava.awtパッケージに含まれているものもありますが、これは主に、旧バージョンのJDKとの下位互換を維持するためです。

インタフェース 説明
PathIterator パスから要素を取得するためのメソッドを定義しています。
Shape (java.awt) 幾何学的なパスを持つオブジェクトを記述および検査するための共通メソッド群を提供しています。GeneralPathクラスおよびほかの幾何学クラスで実装されています。

クラス 説明
Arc2D
Arc2D.Double
Arc2D.Float
スーパー・クラス: RectangularShape
外接する矩形、開始位置の角度、中心角の角度、および閉鎖の種類で定義される円弧を表します。Arc2D.FloatおよびArc2D.Doubleは、単精度と倍精度で円弧を指定するために実装されています。
Area インタフェース: Shape, Cloneable
ブール演算をサポートする領域の幾何学的図形を表します。
CubicCurve2D
CubicCurve2D.Double
CubicCurve2D.Float  
インタフェース: Shape
(w)座標空間内の3次パラメトリック曲線セグメントを表します。CubicCurve2D.Floatおよび CubicCurve2D.Doubleは、単精度と倍精度で3次曲線を指定するために実装されています。
Dimension2D 幅と高さの寸法をカプセル化しています。2次元の寸法を格納するすべてのオブジェクトの抽象スーパー・クラスです。
Ellipse2D
Ellipse2D.Double
Ellipse2D.Float
スーパー・クラス: RectangularShape
外接する長方形で定義される楕円を表します。Ellipse2D.FloatおよびEllipse2D.Doubleは、単精度と倍精度で楕円を指定するために実装されています。
FlatteningPathIterator PathIteratorオブジェクトの平坦化されたビューを返します。
それ自体では補間計算を行わないShapesに対する平坦化動作を実現するために使用できます。
GeneralPath インタフェース: Shape
直線、2次曲線、および3次曲線から構成される幾何学的パスを表します。
Line2D
Line2D.Double
Line2D.Float
インタフェース: Shape
(x, y)座標空間内の直線セグメントを表します。Line2D.FloatおよびLine2D.Doubleは、単精度と倍精度で直線を指定するために実装されています。
Point2D
Point2D.Double
Point2D.Float
(x, y)座標空間内の位置を表す点です。Point2D.FloatおよびPoint2D.Doubleは、単精度と倍精度で点を指定するために実装されています。
QuadCurve2D
QuadCurve2D.Double
QuadCurve2D.Float
インタフェース: Shape
(x, y)座標空間内の2次パラメトリック曲線セグメントを表します。QuadCurve2D.FloatおよびQuadCurve2D.Doubleは、単精度と倍精度で2次曲線を指定するために実装されています。
Rectangle2D
Rectangle2D.Double
Rectangle2D.Float
スーパー・クラス: RectangularShape
位置(x, y)と寸法(w x h)で定義される矩形を表します。Rectangle2D.FloatおよびRectangle2D.Doubleは、単精度と倍精度で矩形を指定するために実装されています。
RectangularShape インタフェース: Shape
矩形の範囲で規定される図形を操作するための共通処理ルーチンを提供しています。
RoundRectangle2D
RoundRectangle2D.Double
RoundRectangle2D.Float
スーパー・クラス: RectangularShape
位置(x, y)、寸法(w x h)、隅の弧の幅と高さで定義される丸い角を持つ矩形を表します。RoundRectangle2D.FloatおよびRoundRectangle2D.Doubleは、単精度と倍精度で角の丸い矩形を指定するために実装されています。

3.2 幾何学的図形のコンセプト

Shapeは、GeneralPathRectangle2D.Floatなど、Shapeインタフェースを実装するすべてのクラスのインスタンスです。Shapeの外形(輪郭)をパスと呼びます。

Shapeを描画する場合は、Graphics2DコンテキストのStrokeオブジェクトで定義されているペンのスタイルが、Shapeのパスに適用されます。Shapeを塗りつぶす場合は、Graphics2DコンテキストのPaintが、パスの内側の領域に適用されます。詳細については、「Graphics2Dを使ったレンダリング」を参照してください。

Shapeのパスは、クリッピング・パスの定義にも使用できます。クリッピング・パスにより、レンダリングされるピクセルが決まります。クリッピング・パスで定義される領域の内側にあるピクセルだけが、レンダリングされます。クリッピング・パスは、Graphics2Dコンテキストの一部です。詳細については、「クリッピング・パスの設定」を参照してください。

GeneralPathを使うと、直線、2次曲線、および3次曲線を使って構成できる任意の2次元オブジェクトを表すことが可能です。java.awt.geomでは、矩形、楕円、円弧、曲線などの一般的な幾何図形オブジェクトを簡単に表現できるよう、専用のShapeインタフェースの実装が別に提供されています。また、Java 2D APIでは、構成領域ジオメトリをサポートする特別な種類のShapeも提供されています。

3.2.1 構成領域ジオメトリ

構成領域ジオメトリ(CAG)は、既存のオブジェクトにブール演算を行って新しい幾何学オブジェクトを作る処理です。Java 2D APIでは、Areaという名前の特別な型のShapeが、ブール演算をサポートしています。任意のShapeからAreaを構築できます。

Areasでは、次のブール演算を実行できます。

これらの演算を図3-1に示します。

論理和、論理積、論理差、および排他的論理和のブール演算の図示

図3-1 ブール演算

3.2.2 図形の範囲とヒット検査

バウンディング・ボックス」は、Shapeの幾何学的図形を完全に囲む矩形です。バウンディング・ボックスを使って、ユーザーがオブジェクトを選択したかどうか、つまり「ヒット」したかどうかを判定します。

Shapeインタフェースでは、図形のバウンディング・ボックスを取得するメソッドとして、getBoundsgetBounds2Dの2つが定義されています。getBounds2DからはRectangleはなくRectangle2Dが返されるので、図形のバウンディング・ボックスについてさらに高い精度の記述を取得できます。

Shapeでは、次の判定を行うメソッドも提供されています。

3.3 Areaの結合による新しいShapeの作成

Areasを使うと、円や正方形のような単純な図形から複雑なShapesを簡単に作ることができます。Areas結合して新しく複雑なShapeを作る手順を次に示します。

たとえば、CAGを使うと、図 3-2に示すような洋なし型を作ることができます。

次のコンテキストで図を説明する

図3-2 複数の円から作られた洋なし

洋なしの本体は、重なり合う円と楕円の2つのAreasに論理和演算を行って作ります。葉は、重なる2つの円に論理積演算を行って作り、それを論理和演算で1つのShapeに結合しています。茎の部分も、重なり合う円に論理差演算を2回行って作られています。

3.4 独自のShapeの作成

Shapeインタフェースを実装して、新しい種類の形状を定義するクラスを作成できます。Shapeインタフェースのメソッドを実装できるならば、内部的に図形をどのように表現してもかまいません。Shapeでは、輪郭を指定するパスを生成できなければなりません。

たとえば、点の配列としてポリゴンを表すShapeの簡単な実装を作成できます。このようにしてポリゴンを作成してあれば、drawsetClipなど、引数としてShapeオブジェクトを受け取る任意のメソッドにポリゴンを渡すことができます。

PolygonPathクラスでは、次のShapeインタフェース・メソッドを実装する必要があります。

 


目次||

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.