目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド

第 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.FloatArc2D.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.FloatEllipse2D.Double は、単精度と倍精度で楕円を指定するために実装されています。
FlatteningPathIterator
PathIterator オブジェクトを平滑化した図形を返します。
それ自体では補間計算を行わない Shape に対する平滑化処理に使うことができます。
GeneralPath
インタフェース: Shape
直線、2 次曲線、および 3 次曲線から構成される幾何学的パスを表します。
Line2D
Line2D.Double
Line2D.Float
インタフェース: Shape
(x, y) 座標空間内の直線セグメントを表します。Line2D.FloatLine2D.Double は、単精度と倍精度で直線を指定するために実装されています。
Point2D
Point2D.Double
Point2D.Float
(x, y) 座標空間内の位置を表す点です。Point2D.FloatPoint2D.Double は、単精度と倍精度で点を指定するために実装されています。
QuadCurve2D
QuadCurve2D.Double
QuadCurve2D.Float
インタフェース: Shape
(x, y) 座標空間内の 2 次媒介変数曲線のセグメントを表します。QuadCurve2D.FloatQuadCurve2D.Double は、単精度と倍精度で 2 次曲線を指定するために実装されています。
Rectangle2D
Rectangle2D.Double
Rectangle2D.Float
スーパークラス: RectangularShape
位置 (x, y) と寸法 (w x h) で定義される矩形を表します。Rectangle2D.FloatRectangle2D.Double は、単精度と倍精度で矩形を指定するために実装されています。
RectangularShape
インタフェース: Shape
矩形の範囲で規定される図形を操作するための共通処理ルーチンを提供しています。
RoundRectangle2D
RoundRectangle2D.Double
RoundRectangle2D.Float
スーパークラス: RectangularShape
位置 (x, y)、寸法 (w x h)、隅の弧の幅と高さで定義される丸い角を持つ矩形を表します。RoundRectangle2D.FloatRoundRectangle2D.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 を構成できます。

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

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

論理和、論理積、論理差、排他的論理和操作の図示

図 3-1 ブール演算

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

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

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

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

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

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

  1. Shape を使って、結合する Area を作成する
  2. ブール演算子 addsubtractintersectexclusiveOr から適切なものを呼び出す

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

次の文で、このグラフィックスを説明します。

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

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

3.4 独自の Shape の作成

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

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

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

 


目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド
JavaTM 2 SDK, Standard Edition, 1.4 Version