Java Drawing DrawTop

Language

JP  US  UK

 

図形要素補助

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:図形要素に関連する計算を集めたクラス。

このページで説明するクラス:SegmentModifier, PathConnect, PathSegment, ShapeElementUtil


1. SegmentModifier戻る=>page top
図形をModifyShapeで変形するときの制御用図形を格納するクラス。
端点の移動の時の端点の識別(始点/終点)のためにも使われる。
制御用図形は、曲線セグメント節点、直線要素の場合、セグメントの中間点、三次曲線要素の場合、 節点の両側での接線方向を動かす線分などがある。 このクラスのオブジェクトはDrawShapeUtil.drawSegmentModifiersで表示される。


図1.1 セグメント番号(Seg-0, Seg-1..)、セグメント接続点番号(P-0, P-1,...)
サブパス数=2

図1.2 セグメント番号、セグメント接続点番号のローカル表現
ローカル表現ではサブパスごとに0番から番号を振る。SegmentModifierではこちらの表現を使う。

図1.3 modifyコマンド処理での表示
DrawShapeUtil.drawSegmentModifiersで表示

図1.4 TangentIn, TangentOut

フィールド 説明
type int type
SegmentModifier.LINE/ARC/CUBICのいずれかを設定。
subPathIndex int subPathIndex
サブパス番号。
segmentPid public int segmentPid
サブパスセグメント接続点番号(図1.2 ローカル表現)。
segmentId1 public int segmentId1 segmentPidの手前のサブパスセグメント番号。
閉じていないサブパスの始点では-1で無効を表す。閉じたサブパスの始点では、サブパスの最後のセグメント番号をセット。
segmentId2 public int segmentId2
segmentPidの後のサブパスセグメント番号。
閉じていないサブパスの終点では-1で無効を表す。 閉じたサブパスの終点では、サブパスの最初のセグメント番号をセット。
segmentType1 public String segmentType1
segmentId1のセグメントの種類("LINE"/"ARC"/"CUBIC"/"QUAD")。
閉じていないサブパスの始点では"Null"を設定。
segmentType2 public String segmentType2
segmentId2のセグメントの種類("LINE"/"ARC"/"CUBIC"/"QUAD")。
閉じていないサブパスの終点では"Null"を設定。
p Point2D p:segmentIndex番目の節点座標を設定
tangentIn Segment2D tangentIn=null
segmentId1が示すセグメント終点での接線方向。図1.4参照。segmentId1セグメントが"CUBIC"の時だけ設定する。
閉じていないサブパスの始点ではnullを設定。閉じたサブパスの始点では、サブパス終点の接線ベクトルを設定する。
tangentOut Segment2D tangentOut=null
segmentId2が示すセグメント始点での接線方向。 図1.4参照。segmentId2セグメントが"CUBIC"の時だけ設定する。
閉じていないサブパスの終点ではnullを設定。 閉じたサブパスの終点では、サブパス始点の接線ベクトルを設定する。
jointType int jointType=0
定数Smooth/Cuspを設定。
hitType int hitType=0
staticメソッドgetHitSegmentModifierメソッドで ヒットしたSegmentModifierを選んだとき、このフィールド変数に SegmentP/SegmentMP/TinP1/TinP2/ToutP1/ToutP2のどれかの識別子を設定する。
SegmentP public static final int SegmentP=1;
セグメントの接続点であることを表す。
SegmentMP public static final int SegmentMP=2;
セグメントの中間点であることを表す。この点を動かすとセグメントを平行移動する。
Tangent public static final int Tangent=3;
セグメント接続点での接線であることを表す。
Smooth public static final int Smooth=4;
セグメント接続点で滑らかに接続していることを表す。 
Cusp public static final int Cusp=5;
セグメント接続点で折れ曲がって接続していることを表す。 
TinP1 public static final int TinP1=6;
図1.2のTangentInを表す接線の始点であることを表す(小さな四角マーク)。 この点を動かすことによって接線方向を変えられる。
TinP2 public static final int TinP2=7;
図1.2のTangentInを表す接線の終点であることを表す(小さな四角マーク)。 この点を動かすことによって接線方向を変えられる。
ToutP1 public static final int ToutP1=8;
図1.2のTangentOutを表す接線の始点であることを表す(小さな四角マーク)。 この点を動かすことによって接線方向を変えられる。
ToutP2 public static final int ToutP2=9;
図1.2のTangentOutを表す接線の終点であることを表す(小さな四角マーク)。 この点を動かすことによって接線方向を変えられる。
codeStr public static String[] codeStr
定数の文字列表現。
Mark_NormalSize final static int Mark_NormalSize=6;
マークサイズ。

メソッド 説明
コンストラクタ public SegmentModifier(int type, int subPathIndex, int segmentPid, int segmentId1, int segmentId2, String segmentType1, String segmentType2, Point2D p, int jointType, Segment2D tangentIn, Segment2D tangentOut)
フィールド変数に引数を設定する。
getType public int getType():フィールド変数typeを返す。
getSubPathIndex public int getSubPathIndex():フィールド変数subPathIndexを返す。
getSegmentPid
public int getSegmentPid():フィールド変数segmentPidを返す。
getSegmentId1 public int getSegmentId1():フィールド変数segmentId1を返す。
getSegmentId2 public int getSegmentId2():フィールド変数segmentId2を返す。
getP public Point2D getP():フィールド変数pを返す。
getJointType public int getJointType():フィールド変数jointTypeを返す。
setJointType public void setJointType(int jointType):フィールド変数jointTypeを返す。
getTangentIn public Segment2D getTangentIn():フィールド変数tangentInを返す。
setTangentIn public void setTangentIn(Segment2D tangentIn):フィールド変数tangentInに引数を設定する。
getTangentOut public Segment2D getTangentOut():フィールド変数tangentOutを返す。
setTangentOut public void setTangentOut(Segment2D tangentIn):フィールド変数tangentOutに引数を設定する。
getTinP1 public Point2D getTinP1():フィールド変数tangentInの始点を返す。
getTinP2 public Point2D getTinP2():フィールド変数tangentInの終点を返す。
getToutP1 public Point2D getToutP1():フィールド変数tangentOutの始点を返す。
getToutP2 public Point2D getToutP2():フィールド変数tangentOutの終点を返す。
getHitType public int getHitType():フィールド変数hitTypeを返す。
setHitType protected void setHitType(int type):フィールド変数hitTypeにセットする。
toString public String toString(): このオブジェクトの文字列表現を返す。
clone public Object clone()
クローンを作成して返す。
getSegmentModifiers public static SegmentModifier[] getSegmentModifiers(Curve2D curve2D)
GeneralCurveElementから呼ばれる。GeneralCurveElementの曲線セグメントは Segment2D.LINE、ARC、CUBICの3種類を持つ可能性があるので、各々に対応するSegmentModifierを作成する。 SegmentModifierオブジェクトの作成・登録は次のgetSegmentModifierメソッドで行う。
(1) Sub pathごとにセグメント接続点をSegmentModifier.SegmentPの識別子で登録

これはセグメントのタイプ(Segment2D.LINE、ARC、CUBIC)に無関係に実行する。


(2) Sub pathごとにセグメントの中間点をSegmentModifier.SegmentMPの識別子で登録

この処理はSegment2D.LINE、ARCのセグメントだけ行う。


(3) Sub pathごとにセグメント接続点で、接線方向をSegmentModifier.Tangentの識別子で登録

この処理はセグメント接続点の両側のセグメント(segmentId1, segmentId2)のうち少なくとも一方が、 Segment2D.CUBICの場合に実行する。 例えば、直線と直線セグメント、直線と円弧セグメントの場合には、接線方向のコントロールは実行しないので、 SegmentModifier.Tangentは登録しない。

getSegmentModifier public static SegmentModifier getSegmentModifier(Curve2D curve2D, int type, int subPath, int segmentPtIndex)
引数:

curve2D - 図形要素の形を決めるパラメトリック曲線。
type - SegmentModifierのタイプ。SegmentModifier.P, MP, Tangentの3種。
subPath - サブパス番号
segmentPtIndex - セグメント接続点番号(図1.2)

処理:
(1)セグメント接続点をSegmentModifier.SegmentPの識別子で登録

サブパスが閉曲線の場合、始終点ではsegmentId1, segmentId2を次のように登録することに注意。
• 始点: segmentId1=numseg-1, segmentId2=0 (numsegはサブパスのセグメント数)
• 終点: segmentId1=numseg-1, segmentId2=0

(2)セグメントの中間点をSegmentModifier.SegmentMPの識別子で登録

この処理はSegment2D.LINE、ARCのセグメントだけ行う。

(3)セグメント接続点で、接線方向をSegmentModifier.Tangentの識別子で登録

この処理はセグメント接続点の両側のセグメント(segmentId1, segmentId2)のうち少なくとも一方が、Segment2D.CUBICの場合に実行する。例えば、直線と直線セグメント、直線と円弧セグメントの場合には、接線方向のコントロールは実行しないので、SegmentModifier.Tangentは登録しない。
サブパスが閉曲線の場合、(1)と同様な配慮を行う

getTangentLine private static Segment2D getTangentLine(Point2D point, Vector2D Tvec)
引数:
point - 節点
Tvec - 接線ベクトル
処理:
getSegmentModifiersから呼ばれ接線方向を表す直線要素のSegment2Dオブジェクトを作成する。
getHitSegmentModifier public static SegmentModifier getHitSegmentModifier(SegmentModifier[] modifiers, Point2D point)
引数:
modifiers - getSegmentModifiersで作成した全てのSegmentModifierオブジェクト

このメソッドが呼ばれるときには、全てのSegmentModifierオブジェクトは DrawShapeUtil.drawSegmentModifiers で画面に表示されている。

point - マウスボタンを押したときの点
戻り値:マウスボタンを押したときの点にヒットしたSegmentModifierオブジェクトを返す。
処理:
• ヒットするSegmentModifierオブジェクトのサーチ

マウスボタンを押したときの点(point)とSegmentModifierオブジェクトのSegmentP, SegmentMP, TinP1, TinP2, ToutP1, ToutP2のコードで表される点(図1.3, 図1.4で小さな正方形で表示されている点)のヒットを調べる。 単純に距離計算を行えば済む。

• ヒットするSegmentModifierオブジェクトのhitTypeを設定。
modify public static boolean modify(Curve2D curve2D, SegmentModifier hitSegmentModifier, int ctrl, Point2D startPoint, Point2D oldPoint, Point2D currentPoint)
引数:
curve2D - 図形要素の形を決めるパラメトリック曲線。
hitSegmentModifier - ヒットしたSegmentModifierオブジェクト。
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1または2の値が渡される。
oldPoint - 一回前のドラッグ点。
currentPoint - 現在のドラッグ点。
戻り値:
パス、サブパスの端点移動でパス、サブパスが閉曲線になったり、別のサブパスに接続してトポロジが変化したときにtrueで返す。
一旦trueで返すと、その後のマウスの移動は無視される。
処理:
このメソッドは GeneralCurveElement.modify メソッドから呼ばれ、GeneralCurveElement.modify メソッドは ModifyShapeLS.mouseDraggedから呼ばれる。
マウスで動かす対象は、(a)曲線セグメントの接続点、(b)直線、円弧セグメントの中間点にマウスが位置している場合はそのセグメント自体、 (c)接線方向を示す直線の端点にマウスが位置している場合は接線方向、の3種類である。 どの場合に相当しているかはSegmentModifier.getHitTypeの戻り値で分かる。
(a)SegmentModifier.getHitTypの戻り値がSegmentModifier.Pの場合

Segment2D.moveSegmentEndPTで節点を動かす。

(b)SegmentModifier.getHitTypの戻り値がSegmentModifier.MPの場合

Segment2D.moveSegmentEndPTで両端の節点を動かす。 当然ながら、隣に曲線セグメントがあればその端点も動かす。

(c)SegmentModifier.getHitTypの戻り値がSegmentModifier.TinP1, TinP2, ToutP1, ToutP2のいずれかの場合

CUBICタイプの曲線セグメントである。接線方向を動かす。
引数currentPointと節点を結ぶベクトルを作成し、 Segment2D.moveSegmentTangentで接線方向を指定する。
各曲線セグメントの接線ベクトル長はmoveTangentで最適化するので、ここでは気にしなくて良い。

checkDistance private static int[] checkDistance(Point2D P, Point2D[][] endPs)
引数:
P - 現在のマウス位置
endPs - P0との距離計算を行う点の配列。この配列には別のサブパスの端点をストアする。 endPs[i][0], endPs[i][1]がi番サブパスの始点、終点である。
戻り値:
サブパス番号と、始点、終点の区別(0または1)をintの配列で返す。
処理:
P0とendPs[i][j]の距離が最も近い点の(i,j)を返す。
addPoint public static void addPoint(Curve2D curve2D, SegmentModifier hitSegmentModifier, Point2D point)
引数:
curve2D - 図形要素の形を決めるパラメトリック曲線。
hitSegmentModifier - ヒットしたSegmentModifierオブジェクト。
point - 追加点
処理:
ModifyShapeLS.mouseClickedから呼ばれ、節点を追加する。
引数のpointはクリック点で、ModifyShapeLS.mouseClickedから渡される。
Curve2DUtil.getShortestLineメソッドで引数pointに最も近い曲線上の点を求め、 これを新しい節点(セグメント接続点)としてパス。サブパスに追加する。
元の図形 上辺と底辺に節点を追加

deletePoint public static void deletePoint(Curve2D curve2D, SegmentModifier hitSegmentModifier)
引数:
curve2D - 図形要素の形を決めるパラメトリック曲線。
hitSegmentModifier - ヒットしたSegmentModifierオブジェクト。
処理
ModifyShapeLS.mouseClickedから呼ばれ、 節点(セグメント接続点)を削除する。
• 引数pointに最も近い節点を削除する。

hitSegmentModifierから、削除する節点番号とその両側のセグメント番号を求める。

• connectSegmentsメソッドで削除する節点の両側のセグメントを接続して、一つのセグメントを作る。
元の図形 上の辺の両端の節点を削除

connectSegments private static Segment2D connectSegments(Segment2D segment1, Segment2D segment2)
引数:
segment1, segment2 - 接続するセグメント
戻り値:segment1とsegment2を接続する曲線セグメントを返す。
処理:
segment1の始点と接線ベクトル、segment2の終点と接線ベクトルを使い、 segment1の始点とsegment2の終点をつなぐCubicセグメントを作成して返す。
smoothPoint public static void smoothPoint(Curve2D curve2D, SegmentModifier hitSegmentModifier)
引数:deletePointと同じ
処理
クリックされた接続点はhitSegmentModifierからわかる。 クリックされた接続点でCubicセグメントの接線を滑らかになるように設定する。
元の図形 上の辺の両端の節点をSmooth 接線を動かす

cuspPoint public static void cuspPoint(Curve2D curve2D, SegmentModifier hitSegmentModifier)
引数:deletePointと同じ
処理
クリックされた接続点はhitSegmentModifierからわかる。 クリックされた接続点でCubicセグメントの接線方向を少し変える。
元の図形 底の節点をCusp Cusp点で接線を動かす 通常の表示

divertTangent private static Vector2D divertTangent(Point2D P0, Point2D P1, Point2D P2, Vector2D target, int dir)
引数:
P0 - P1の一つ手前の節点(セグメント接続点)
P1 - クリックされた節点(セグメント接続点)
P2 - P1の一つ後ろのの節点(セグメント接続点)
tangent - P1でのTinまたはTout
dir - 接線方向を動かす方向

P0, P2を結ぶ直線に対してP1のある側に方向を動かす場合1、 その反対側にある側に方向を動かす場合-1を指定する。Tinに対しては1, Toutに対しては-1を指定。 これによりP1で凸になる方向を、P0,P1,P2の凸の方向に一致させることができる。

戻り値:

tangentを上記指定方向に少し方向を変えたベクトルを返す。

disconnectPoint public static void disconnectPoint(Curve2D curve2D, SegmentModifier hitSegmentModifier) 引数:deletePointと同じ処理: 次のようにセット。

int subPath=hitSegmentModifier.getSubPathIndex();
int index=hitSegmentModifier.getSegmentPid();
int index1=hitSegmentModifier.getSegmentId1();
int index2=hitSegmentModifier.getSegmentId2();



閉曲線の場合

開曲線の場合

• index, index1, index2の関係は下表
ケース 閉曲線の場合 開曲線の場合
index index1 index2 index index1 index2
(a)始点(P-0)をクリック 0 3 0 0 -1(無効) 0
(b)終点(P-4)をクリック 4 3 0 4 3 -1(無効)
(c)P-2をクリック 2 1 2 2 1 2

• クリック点の両側のセグメント(index1, index2)を少しトリムしてDisconnectする。

セグメントのトリムは Segment2D.trimSegmentで行う。

• 閉曲線の場合、始終点をクリックしたときindex1>index2になるので注意が必要である。 • 閉曲線の場合に例えばP-1, P-3でDisconnectすると、次のようにサブパスが3本できる。

サブパス0: P-0 - P-1, サブパス1: P-1 - P-3, サブパス2: P-3 - P-4。
しかしこれは気にする必要はない。 GeneralCurve2DE.setSubPathsで呼び出す PathConnectによってサブパス1, サブパス0が接続されるので、 最終的には2本のサブパスが作られる。


元の図形 上辺と底辺の節点でDisconnect 通常の表示



2. PathConnect 戻る=>page top
フィールド 説明
segments PathSegment[] segments
パスセグメントをストア。
jointList JointList jointList=new JointList()
2つのパスセグメントの端点を比較し、一致すればこのリストに登録する。

メソッド

説明

findPaths public PathSegment[][] findPaths(Point2D[][] endPs)
引数:
endPs - パスセグメントの始終点。
endPs[i][j] i=1,npath, j=0,1 iはパスセグメントの番号、nはパスセグメント数、j=0は始点、j=1は終点を指す。
戻り値:接続したパスを返す。
戻り値をpaths[][]とすると次のように解釈する。
path.length - パス数
path[i].length - i番パスを構成するパスセグメント数。

path[i][0], path[i][1], ... path[i][path[i].length-1]がi番パスの構成セグメント

処理:
パスセグメントの種終点を比較して、接続できるパスセグメントを接続してゆきのパスを作成する。


3. PathSegment 戻る=>page top
フィールド 説明
id public int id
startP public Point2D startP
パスの始点
endP public Point2D endP
パスの終点
closed public boolean closed
閉じたパスのときtrue
reversed public boolean reversed
逆方向に接続されたときtrue
id public boolean passed
接続パスに使われたときtrue

メソッド 説明
toString public String toString()
セグメントの文字列表現を返す。


4. ShapeElementUtilクラス戻る=>page top
フィールド 説明
Limit final double Limit
リサイズするときの基本閉図形の高さ、幅の最小値。これ以下のサイズにはならない。現在5を設定。

メソッド 説明
getBoundingBox public static Rectangle2D getBoundingBox(Rectangle2D[] boxes)
全てのboxesを囲むBounding boxを返す。
getBoundingBox public static Rectangle2D getBoundingBox(ShapeContainer[] containers)
containersで指定された全てのShapeContainerを囲むBounding boxを返す。
getEnlargedRectangle public static Rectangle2D getEnlargedRectangle(Rectangle2D box, double wideEx, double heightEx)
矩形boxを横方向にwideEx、縦方向にheightExだけ拡大した矩形を返す。
getShrinkedRectangle public Rectangle2D getShrinkedRectangle(Rectangle2D box, double wideSh, double heightSh)
引数boxの矩形を幅wideShだけ縮小、高さheightShだけ縮小したRectangle2Dを返す。 もし与えられたboxが小さすぎて縮小できないときはnullを返す。
boxIntersectionCheck public static boolean boxIntersectionCheck(Rectangle2D box1, Rectangle2D box2)
box1がbox2と交差すればtrueを返す。
getInscribedBox public static Rectangle2D getInscribedBox(Shape shape, boolean keepAspectRatio)
引数:
shape - Shapeオブジェクト.
keepAspectRatio - trueならば、内接する矩形の縦横比は、Shapeオブジェクトを囲む矩形と相似形にする。falseならはなるべく面積の大きい矩形を返す。
戻り値:
与えられた閉図形に内接する矩形を返す。
処理:
(1) 与えられたShapeオブジェクトを覆う格子を作成する (図(a)).
(2) 格子点が与えられた図形の内部にあるか否かをテストし、ビットマップを作る。

ビットマップ: 各ブーリアンビットは格子点に対応し、 その格子点が与えられた図形内部にあればtrue、図形内部になければfalseの値をもつ。

(3) 内接する矩形の中心点を格子点から選ぶ。

(*) 中心点: 図 (a)では小さな円マークで示す。

(4) もし keepAspectRatio がtrueならば findSquare メソッドを呼ぶ(図(c))。

もし keepAspectRatio が falseならば、 findRectangle メソッドを呼ぶ(図(d))。

(5) 中心点を全格子点で動かし (3), (4) を繰り返して面積が最大となる矩形を求める。

図(a) 与えられた図形を覆う格子 図(b) 作成された内接矩形
(緑色のフレーム内 )

findSquare private static Rectangle findSquare(boolean[][] bitmap, int centerI, int centerJ)
引数:
bitmap - 各ブーリアンビットは格子点に対応し、その格子点が与えられた図形内部にあればtrue、 図形内部になければfalseの値をもつ。
centerI - 中心点のx方向格子点番号.
centerJ - 中心点のy方向格子点番号
戻り値:
内接矩形を返す。例えば 図(c)では薄緑色の矩形。
処理:
ステップ1. 中心点に隣接する外側の格子点がすべて与えられた図形内に含まれるか否かをbitmapを使ってチェック。もしすべて含まれるならば、図形内部の矩形が得られる。
ステップ2. ステップ1.で得た矩形に隣接する外側の格子点について同様なチェックを行う。 それらの格子点がすべて図形内部に含まれるならば、より大きな図形内部の矩形が得られる。 このステップを繰り返すと、与えられた図形に内接し、与えられた図形と相似形の矩形を得ることができる。 図(c)では薄緑色の矩形。

図 (c)

findRectangle private static Rectangle findRectangle(boolean[][] bitmap, int centerI, int centerJ)
引数:
bitmap - 各ブーリアンビットは格子点に対応し、その格子点が与えられた図形内部にあればtrue、図形内部になければfalseの値をもつ。
centerI - 中心点のx方向格子点番号.
centerJ - 中心点のy方向格子点番号 戻り値:
内接矩形を返す。例えば 図(d)では薄緑色の矩形、薄青色の矩形、青色の矩形2個の和領域の矩形を返す。
処理:
ステップ1. findSquareメソッドを実行し、薄緑色の矩形を取得。
ステップ2. 薄緑色の矩形を左側に拡張できるか否かをscamMapメソッドでチェック。図(d)では"No"。
ステップ3. 薄緑色の矩形を右側に拡張できるか否かをscamMapメソッドでチェック。図(d)では"Yes"で薄青色の矩形が拡張部分。
ステップ4. 薄緑色と薄青色の矩形を上下に拡張できるか否かをscamMapメソッドでチェック。これで青色の矩形が上下に見つかる。
以上により、薄緑色、薄青色、青色の矩形の和領域が、図形と中心点が指定されたとき、与えられた図形に内接する代々の矩形である。

図 (d)

scanMap private static boolean scanMap(boolean[][] bitmap, int startI, int endI, int startJ, int endJ)
引数:
bitmap - 各ブーリアンビットは格子点に対応し、その格子点が与えられた図形内部にあればtrue、 図形内部になければfalseの値をもつ。
startI, endI - x方向の開始、終了格子点番号。
startJ, endJ - y方向の開始、終了格子点番号。
戻り値: startI, endI と startJ, endJで決まる矩形領域の格子点がすべてがビットマップ値でrueならば、 このメソッドはtrueを返す。それ以外はfalseを返す。
resizeRectangle
(static)
public static Rectangle2D resizeRectangle(int ctrl, Rectangle2D startBox, Point2D startPoint, Point2D newPoint, int mousePosition)
引数:
ctrl:マウスドラッグ中にShift/Ctrl/Altキーが押されているとき1/2/3。

1または2のとき、戻り値のBoxは正方形を返す。3のとき元の図形と同じ縦横比のBoxを返す。

startBox - リサイズ前の図形を囲む矩形。
startPoint - マウスドラッグの開始点。
newPoint - マウスドラッグの現在点。
int mousePosition - マウス位置コード
戻り値: リサイズ後に図形を囲む矩形。
処理:
mouseDraggedメソッドから呼ばれる。MoveResizeShapeLS以外から呼ばれることもあるので、staticメソッドとする。
・リサイズのためのBoxを作成する。

図形要素(ShapeElement)ではこのBoxにフィットするように 図形を相似的に変形する。

・マウスが対角方向のリサイズハンドル(NW_RESIZE, NE_RESIZE, SE_RESIZE, SW_RESIZE)上にあるとき

下記のresizeDiagonallyメソッドを呼ぶ。マウスが水平・垂直方向のリサイズハンドル(N_RESIZE, E_RESIZE, S_RESIZE, W_RESIZE)上にあるとき下記のresizeOrthogonallyメソッドを呼ぶ。

resizeDiagonally
(static)
private static Rectangle2D resizeDiagonally(int ctrl, Vector2D anchorP, Vector2D movingP, Vector2D draggedVec)
引数:
ctrl - マウスドラッグ中にShift/Ctrl/Altキーが押されていると1/2/3。

1または2のとき、戻り値のboundingBoxは正方形を返す。 3のとき元の図形と同じ縦横比の矩形を返す。

anchorP - リサイズ前の図形を囲む矩形(startBox)の固定点。
指定されたリサイズハンドルの対角にあるstartBoxの頂点。
movingP - リサイズ前の図形を囲む矩形(startBox)の移動点。
指定されたリサイズハンドルに最も近いstartBoxの頂点。
draggedVec - ドラッグ開始点からドラッグ現在点へ向かうベクトル。

resizeOrthogonally
(static)
private static Rectangle2D resizeOrthogonally(int ctrl, int dir, Vector2D anchorP, Vector2D movingP, Vector2D draggedVec, double fixedWorH)
resizeRectangleメソッドから呼ばれる。
引数:
ctrl - マウスドラッグ中にShift/Ctrl/Altキーが押されていると1/2/3。

1または2のとき、戻り値のBoxは正方形を返す。3のとき元の図形と同じ縦横比のBoxを返す。

anchorP - リサイズ前の図形を囲む矩形(startBox)の固定点で、startBoxの辺の中央点。
movingP - リサイズ前の図形を囲む矩形(startBox)の移動点で、startBoxの辺の中央点。

例えばNW_RESIZEのとき、movingPはstartBoxの上の辺の中央点で、anchorPは下の辺の中央点になる。

draggedVec - ドラッグ開始点からドラッグ現在点へ向かうベクトル。
fixedWorH - リサイズで変わらない辺の長さ
reseizeRectangle public static Rectangle2D reseizeRectangle(Rectangle2D rect, Rectangle2D oldBox, Rectangle2D newBox)
引数:
rect - 与えられた矩形
oldBox - 元のBox
newBox - ターゲットBox。
戻り値:
oldBoxをnewBoxに変換する変換を使い、rectを変換した結果を返す。




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