|
Chapter: 1. ソースコードダウンロード,
2. テスト結果, 3. テスト項目・方法,
4. テスト結果についてのコメント,
5. Test code
1. ソースコードダウンロード
=>
CurveHitTest.zip
2. テスト結果戻る=>page top
|
図1 テストされる図形 |
|
図2 テスト結果
格子点ごとにヒットテストを行い結果を色で表示 - 赤色: 図形境界上にある、灰色: 図形境界上にない |
3. テスト項目・方法戻る=>page top
基本的にはマウスカーソルの点から直線または曲線までの最短点を計算し、その距離が小さければマウスカーソルの点は図形にヒットしていると見なす。最短点の計算はDrawTop Curve2DUtil.getShortestLineで行う(下の図3およびビデオ参照)。また上記図2では曲線までに距離が3ピクセル以下だとヒットしていると見なしている。
|
|
|
ビデオ: 幾何計算テスト
|
図3 マウスカーソルから5本の曲線への最短点 |
同様なテスト |
4. テスト結果についてのコメント戻る=>page top
図2からわかるように、本テストは閉じていない図形 (Ex1, Ex5, Ex6, Ex9) に対しても有効である。
本テストの表示画面(図1、図2)はスクロールに時間がかかるが、グリッド点1個あたりの処理時間はわずか0.1 milisecond程度である。
5. Test code戻る=>page top
5.1 クラス一覧
クラス
|
説明
|
HitTest
|
public class HitTest extends JFrame
Jframe, JScrollPane, JViewport, Panelオブジェクトを作成し組み立てる。
|
HitTestPanel |
public class HitTestPanel extends JPanel
このオブジェクトの上に図1、図2のような図形を描画する。
|
TestCase |
public class TestCase
=> TestCase of the RegionHitTest.
|
TestCurve |
public class TestCurve
=> TestCurve of the RegionHitTest.
|
パラメトリック曲線 |
Segment2D,
Curve2D,
Rectangle2DE,
RoundRectangle2DE,
Ellipse2DE,
Line2DE,
Polyline2DE,
CubicCurve2DE, GeneralCurve2DE, FergusonCurve2D |
幾何計算ライブラリ |
Curve2DUtil.getNormalLines,
CurvePT,
Matrix,
Matrix2D
|
5.2 クラス仕様
5.2.1 public class CurveHitTestPanel extends JPanel
メソッド
|
説明
|
createTestCase |
public void createTestCase()
9個のTestCaseオブジェクトを作成する。
|
getEnlargedBoundingBox |
public Rectangle2D getEnlargedBoundingBox(Rectangle2D boundingBox, double wideEx, double heightEx)
引数:
box - Rectangle2D オブジェクト
wideEx - 水平方法の延長量
heightEx - 垂直方法の延長量.
戻り値:
拡大したRectangle2D オブジェクトを返す
処理:
引数で指定したRectangle2D オブジェクトを拡大して返す。
|
getGridPoints |
public Point2D[] getGridPoints(Rectangle2D box)
引数:
box - Rectangle2D オブジェクト。
戻り値:
box内部に生成した格子点。
処理:
引数で指定したRectangle2D オブジェクトの内部に格子点を生成して返す。
=>図2の各表示図形内の格子点。
|
ptOnCurve |
private int ptOnCurve(Curve2D curve, Point2D point)
引数:
curve - 曲線(直線、折れ線を含む)
point - テストされる点(マウスの位置)
戻り値:
0 - curve外
1 - curve上
処理:
つぎのptOnSegments、ptOnBoxを呼んで処理する。
|
ptOnSegments |
private int ptOnSegments(Curve2D curve, Point2D point, double tol)
引数:
curve - 曲線(直線、折れ線を含む)
point - テストされる点(マウスの位置)
tol - 許容誤差
戻り値:
0 - curve外
1 - curve上
処理:
curveを構成する曲線セグメント(Segment2Dオブジェクト)ごとに判定処理を行う。曲線セグメントは分割して矩形(box)覆い、point とboxの判定処理をつぎのptOnBoxで行う。
|
ptOnBox |
private int ptOnBox(Rectangle2D box, Point2D point, double tol)
引数:
box - 矩形
point - テストされる点(マウスの位置)
tol - 許容誤差
戻り値:
0 - box外
1 - box内
処理:
点pointが boxに誤差tolで乗っているか否かを判定する。boxを外側にtolだけ拡大した矩形内にpointがあれば戻り値1を返す。
|
paint |
public void paint(Graphics g)
処理:
このクラス(Panel)のオブジェクトに描画する。
paintShapesメソッドでTestCaseオブジェクトの図形を描画(図1)、paintOnCurveメソッドでマウスヒットテストの結果(図2)を描画する。
|
paintShape |
public void paintShape(Graphics g)
処理:
TestCaseオブジェクトの図形を描画(図1)する。
|
paintOnCurve |
public void paintOnCurve(Graphics g)
処理:
マウスヒットテストの結果(図2)を描画する(図2)。
|
|