閉じていない図形のマウスヒットテスト
2010.8.26

Language

トピックス

閉じた図形のマウスヒットテスト
2010.08.26


閉じていない図形のマウスヒットテスト
2010.08.26


任意2曲線の交点計算
2010.09.01


点から曲線への垂線の計算
2010.09.01


2曲線への共通垂線の計算
2016.10.20


Input Method Frameworkによる
テキストエディター
2010.12.01


部品ライブラリ
2012.09.16


専用カラーチューザー
2012.9.23



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)。



Copyright (c) 2009-2013
All other trademarks are property of their respective owners.