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を変換した結果を返す。
|
|