Java Drawing DrawTop

Language

JP  US  UK

 

図形の移動∙ 変換

 H. Jyounishi, Tokyo Japan
 

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

要旨:図形の平行移動∙ 回転移動∙ 鏡映変換。正確に配置するため、移動量∙ 回転量などは数値で指定する。

このページで説明するクラス: Translate, TranslateAction, Rotate, RotateAction, RotateSpinnerListener, Flip, FlipAction

1. 平行移動 戻る=>page top
ダイアログで移動量を設定しGoボタンを押すと実行する。
∙ ダイアログ表示前に図形を選択(複数可)しておく。

ダイアログを開いたときに図形が選択されていないと、 "select shapes before this command!" のメッセージが表示される(図1.1)。

∙ 平行移動のx,y成分はスピナーか画面をクリックすることで指定できる。

単位は "pixel"、"mm" (ミリメータ)で選択できる。 また"click two point"を選択すると、2点の差分で平行移動のx,y成分を指定できる (図1.21.3)。

∙ "copy" noボタンを選ぶと、図形のコピーは行わず移動する。
∙ "GO"ボタンを押すたびに図形が移動(コピー)される。

平行移動&コピー



図1.1 Dialog

"click two point"を選択し、キャンバスまたは図形上の点を2点クリックすることで、平行移動のx,y成分を指定できる。 図1.2はキャンバス上の2点を指定した場合、 図1.3は図形上の2点をクリックした場合を示す。
See=> ConnectionLS 概要


図(a)

"click two point"ボックスをチェックし
キャンバス上の2点 (p1, p2) をクリック。
p1, p2が赤マークで表示されれ、移動量が"translate x,y"スピナーに表示される。



図(b)

"GO"ボタンをクリックすると選択されている図形が、 p1->p2 だけ平行移動される。

図1.2 キャンバス上の2点をクリック


図(c)

マウスを矢印線の端点へ移動するとが表示される。
マウスで矢印線の両端点クリックすると平行移動の始点、終点が決定する。
上の例では"translate x,y"スピナーに移動量(x: 16.272, y: -9.26)が表示される。



図(d)

"GO"ボタンをクリックすると選択されている図形が、 "translate x,y"スピナーの値だけ平行移動される。

図1.3 図形上の2点をクリック
; マーク=> 操作説明書 図形上の点の選択


1.1 Translateクラス 戻る=>page top
public class Translate extends JDialog implements SelectionListener, ConnectionListener
フィールド 説明
action TranslateAction action
The TranslateAction object.
messageLabel JLabel messageLabel
ダイアログの一番上のメッセージラベルを設定。showMessageメソッドで書き込む。
pixelButton JRadioButton pixelButton
長さの単位をピクセルに設定するボタン。
mmButton JRadioButton mmButton
長さの単位をミリメータに設定するボタン。
translateSpinners JSpinner[] translateSpinners
x,y方向移動量を設定するスピナー
translateSpinnermodels SpinnerNumberModel[] translateSpinnermodels
x,y方向移動量を設定するスピナーモデル
checkBox JCheckBoxJCheckBox checkBox
"Click two points"のチェックボックス (図1.1)
copyButton JRadioButton copyButton: Copy yesボタンオブジェクトを設定。
goButton JButton goButton:Goボタンオブジェクトを設定。
cancelButton JButton cancelButton:Cancelボタンオブジェクトを設定。
shapesVector

Vector shapesVector
選択された図形を格納する。

translateVec Vector2D translateVec
平行移動ベクター。
twoPointsVector Vector twoPointsVector
クリックされた2点を格納する。

メソッド 説明
コンストラクタ フィールド変数mainにこのオブジェクトを設定。
createDialogを呼んでダイアログオブジェクトを作成。
createDialog public void createDialog()
∙ ダイアログにWindowListenerを設定する。WindowListenerはTranslateAction。
ウインドウが閉じる時に、このダイアログの終了処理を行うようにする。
∙ ダイアログにパネル、ボタン等を設定
上段:メッセージラベルを貼り付けたメッセージパネル、
中段:移動量を指示するスピナーとCopy yes/noのラジオボタンを貼り付けた入力パネル
下段:ボタンを貼り付けたボタンパネル

∙ 下段のボタンにはアクションリスナーを設定。ボタンが押された時に TranslatetAction で受けられるようにする。
showDialog public void showDialog(int commandId)
∙ ダイアログの表示位置:ウィンドウの右上隅に表示する。
∙ pack、setVisibleで表示。
選択されている図形をshapesVectorに登録する。
selected public void selected(SelectionEvent event)
このメソッドはSelectionListenerが定義するメソッド。
このメソッドは現在使われていない。
パラメータ:
event - SelectionEvent object.
処理:
SelectionLSで図形が選択されると、このメソッドが呼ばれる。
受け取った図形をshapeVectorに登録する。
addConnection
Listener
public void addConnectionListener()
このオブジェクトをConnectionLS.addConnectionListenerメソッドで ConnectionLSに登録する。
removeConnection
Listener
public void removeConnectionListener()
このオブジェクトをConnectionLS.removeConnectionListenerメソッドで ConnectionLSから削除する。
connected public void connected(ConnectionEvent event)
このメソッドはConnectionListenerが定義するメソッド。
引数:
event - ConnectionEventオブジェクト
処理:
eventから取得したcurvePTの点を twoPointsVectorに登録する。 もしtwoPointsVector のサイズが2ならば、 twoPointsVector の第2点と第1点の差分を translateVecにセットする。
drawMark public void drawMark(Point2D point, String message)
図1.21.3のp1、p2のように 指定点pointにマークと文字列を表示する。
showMessage protected void showMessage(String message, Color color)
ラベルにメッセージを表示する。
setValuesTo
TranslateSpinners
public void setValuesToTranslateSpinners()
Sets the value of the translateVec to the translateSpinners.
getSelectedContainers public ShapeContainer[] getSelectedContainers()
shapeVectorに登録されている図形を配列で返す。
getTranslateSpinners public JSpinner[] getTranslateSpinners()
平行移動量を設定するスピナーを2個の配列で返す。
getTranslateSpinnerModels public SpinnerNumberModel[] getTranslateSpinnerModels()
平行移動量を設定するスピナーモデルを2個の配列で返す。
getCopyButton public JRadioButton getCopyButton()
Copy yesボタンを返す。
getShapeVector public Vector getShapeVector()
shapeVectorを返す。


1.2 TranslateActionクラス  戻る=>page top
フィールド 説明
dialog
Translate dialog
Translateオブジェクトをセット。

メソッド 説明
actionPerformed public void actionPerformed(ActionEvent e)
ボタンが押されたときに、アクション処理を実行する。
∙ "Click two points"チェックボックス

チェックボックスが選択されていれば addConnectionListenerメソッドを呼ぶ。 選択されていなければ removeConnectionListenerメソッドを呼ぶ。

∙ "pixel" or "mm" ボタン

Calls the setValuesToTranslateSpinners method.

∙ Goボタン:translateContainerメソッドで図形を平行移動する。Copy yesボタンが押されているときはコピーする。
∙ Cancelボタン: closeDialogメソッドを呼んでダイアログを閉じる。
translateContainer private ShapeContainer translateContainer(ShapeContainer container, boolean copy)
図形を平行移動する。copy=trueのときはcontainerのcloneを作成して平行移動する。
closeDialog private void closeDialog()
setVisible(false)でダイアログを閉じる。
SelectionLSのresetreceiverを呼んでSelectionLSから選択図形 を受け取るのをやめる。
windowClosing public void windowClosing(WindowEvent e)
closeDialog メソッドを呼ぶ。


1.3 Class TranslateSpinnerListener 戻る=>page top
class TranslateSpinnerListener implements ChangeListenerr
フィールド 説明
dialog Translate dialog
Translateオブジェクトをセット。

Method Description
stateChanged public void stateChanged(ChangeEvent e)
translateSpinners (translateSpinnerModels)から平行移動の(x,y)成分を取得し、 平行移動ベクターをtranslateVecにセットする。


2. 回転移動 戻る=>page top
ダイアログで回転の中心と回転角を設定しGoボタンを押すと実行する。 ∙ ダイアログ表示前に図形を選択しておく。
ダイアログを開いたときに図形が選択されていないと、"select shapes before this command"のメッセージが表示される (図2.1)。
∙ 図形の選択をすると、図形の中心点を回転の固定点としてダイアログのx:、y:に表示し、 画面には赤いマークを表示する。またx:、y:のスピナーの数値を書き換えると(Enterキーを押すこと)、 回転の中心点を表示しなおす。回転の中心はx,yスピナーに数字を入力するか、 キャンバスまたは図形上をクリックすることで変更できる(図2.2)。


One selcted shape
Two selcted shapes
∙ "copy no"ボタンを選ぶと、図形のコピーは行わず移動する。
∙ "GO"ボタンを押すたびに図形を回転移動(コピー)する。
(注)テキストを持つ図形は回転の対象としない。

60度回転移動&コピー


図2.1


"click the rotation center"ボックスをチェックし、 キャンバス上または図形上でマウスをクリックすることで回転の中心を指定できる。 図1.2は回転の中心を図形上の点をクリックして指定した場合である。
See=> ConnectionLS概要, また 図1.2, 1.3 も参照のこと




図(a)
"click the rotation center"ボックスをチェックし、図形上の点をクリック。


>図(b)

"GO"; ボタンをクリックすると、 選択されている図形が回転&コピーされる。


図2.2 図形上の点をクリックして回転中心を指定


2.1 Rotateクラス 戻る=>page top
public class Rotate extends JDialog
フィールド 説明
action
RotateAction action
RotateActionオブジェクトを設定。
messageLabel JLabel messageLabel
ダイアログの一番上のメッセージラベルを設定。showMessageメソッドで書き込む。
pixelButton JRadioButton pixelButton
長さの単位をピクセルに設定するボタン。
mmButton JRadioButton mmButton
長さの単位をミリメータに設定するボタン。
positionSpinners JSpinner[] positionSpinners
回転の中心(x,y)を設定するスピナーを設定
positionSpinnermodels SpinnerNumberModel[] positionSpinnerModels
回転の中心(x,y)を設定するスピナーモデルを設定
checkBox JCheckBoxJCheckBox checkBox
"Click the rotation center"のチェックボックス (図 2.1)
angleSpinner JSpinner angleSpinner
回転角を設定するスピナー
angleSpinnerModel SpinnerNumberModel angleSpinnerModel
回転角を設定するスピナーモデル
copyButton JRadioButton copyButton
Copy yesボタンオブジェクトを設定。
goButton JButton goButton
Goボタンオブジェクトを設定。
cancelButton JButton cancelButton
Cancelボタンオブジェクトを設定。
shapesVector Vector shapesVector
選択された図形を格納する。
rotationCenterP Point2D rotationCenterP
回転の中心を設定。

メソッド 説明
コンストラクタ 次のメソッドを呼ぶ。

super(ObjectTable.getDrawMain(), "rotate");
this.setName("rotate");
this.action=new RotateAction(this);
createDialog();

createDialog public void createDialog()
∙ ダイアログの表示位置:左上隅に表示する。
∙ ダイアログにWindowListenerを設定する。WindowListenerはRotateAction。
ウインドウが閉じる時に、このダイアログの終了処理を行う。
∙ ダイアログにパネル、ボタン等を設定
上段:メッセージラベルを貼り付けたメッセージパネル
中段:移動量を指示するスピナーとCopy yes/noのラジオボタンを 貼り付けた入力パネル
下段:ボタンを貼り付けたボタンパネル。
∙ positionSpinners[0],[1]にはChangeListenerを設定する。回転の中心が変更されたときに、画面に回転の中心点を表示。
∙ 下段のボタンにはアクションリスナーを設定。ボタンが押された時に RotateActionで受けられるようにする。
showDialog public void showDialog(int commandId)
∙ setVisibleで表示。
選択されている図形をshapesVectorに登録する。
isSuitable private boolean isSuitable(ShapeContainer container)
変換される図形が適切かどうかチェックする。TextBoxを持っている図形は不可。
selected public void selected(SelectionEvent event)
このメソッドはSelectionListenerが定義するメソッド。
このメソッドは現在使われていない。
パラメータ:
event - SelectionEvent object.
処理:
SelectionLSで図形が選択されると、このメソッドが呼ばれる。
受け取った図形をshapeVectorに登録する。
addConnection
Listener
public void addConnectionListener()
このオブジェクトをConnectionLS.addConnectionListenerメソッドで ConnectionLSに登録する。
removeConnectionListener
Listener
public void removeConnectionListener()
このオブジェクトをConnectionLS.removeConnectionListenerメソッドで ConnectionLSから削除する。
connected public void connected(ConnectionEvent event)
このメソッドはConnectionListenerが定義するメソッド。
引数:
event - ConnectionEventオブジェクト
showMessage protected void showMessage(String message)
ラベルにメッセージを表示する。
getSelectedContainers public ShapeContainer[] getSelectedContainers()
shapeVectorに登録されている図形を配列で返す。
setRotationCenterpPoint public void setRotationCenterpPoint()
選択されている図形(複数)の中心点を求め、positionSpinnersに値を設定する。
drawTempShapeメソッドで画面に回転の中心を赤マークで表示する。
これは図形を選択したときのデフォールトの回転中心であり、スピナーに書き込まれた場合は、SpinnerListenerオブジェクトで画面に表示する。
setValuesTo
PositionSpinners
public void setValuesToTPositionSpinners()
rotationCenterPの(x,y)を positionSpinnersに設定する。
getPositionSpinners public JSpinner[] getPositionSpinners()
回転の中心を設定するスピナーを2個の配列で返す。
getPositionSpinnerModels public SpinnerNumberModel[] getPositionSpinnerModels()
回転の中心を設定するスピナーモデルを2個の配列で返す。
getAngleSpinner public JSpinner getAngleSpinner()
回転角を設定するスピナーを返す。
getAngleSpinnerModel public SpinnerNumberModel getAngleSpinnerModel()
回転角を設定するスピナーモデルを返す。
getCopyButton public JRadioButton getCopyButton()
Copy yesボタンを返す。
getShapesVector public Vector getShapesVector()
shapeVectorを返す。


2.2 RotateActionクラス 戻る=>page top
class RotateAction extends AbstractAction implements WindowListener
メソッド 説明
actionPerformed public void actionPerformed(ActionEvent e)
ボタンが押されたときに、アクション処理を実行する。
∙ "Click the rotation center" チェックボックス

チェックボックスが選択されている場合 addConnectionListener メソッドを、そうでない場合は、 removeConnectionListener メソッドを呼ぶ。

∙ "pixel" or "mm" button

setValuesToPositionSpinners メソッドを呼ぶ。

∙ Goボタン:rotateContainerメソッドで図形を回転移動する。Copy yesボタンが押されているときはコピーする。
∙ Cancelボタン: closeDialogメソッドを呼んでダイアログを閉じる。
rotateContainer private ShapeContainer rotateContainer(ShapeContainer container, boolean copy)
図形を回転移動する。copy=trueのときはcontainerのcloneを作成して回転移動する。
回転移動するShapeContainer単一図形の場合、 次の同名メソッドを呼ぶ。
回転移動するShapeContainerがグループ図形の場合、 GroupElement.getGroupedSingleShapeContainersメソッドでグループに属する 単一図形をリストアップし、次の同名メソッドを呼ぶ。
rotate private void rotate(Matrix2D rotationMatrix, ShapeContainer container)
単一図形の回転移動をするメソッド。
containerから図形の輪郭線データを取り出し、それを曲線セグメントに分解し、 Segment2D.transformメソッドで回転変換を実行する。
ShapeElement.getCurve2Dメソッドでパラメトリック曲線を取り出す。
convertToGeneralCurve2DEメソッドでGeneralCurve2DE形式に変換する。
∙ GeneralCurve2DEを構成するSegment2D要素を、 transformメソッドで変換する。
∙ GeneralCurve2DEをGeneralCurveElementに設定、 さらにGeneralCurveElementを引数のcontainerに設定する。
getRotationMatrix private Matrix2D getRotationMatrix()
rotationCenterPとangleSpinnerModelの値から回転マトリックスを作成して返す。
closeDialog private void closeDialog()
setVisible(false)でダイアログを閉じる。
DrawPanelのclearDrawSymbolメソッドで画面に表示した図形を全て消去する。
SelectionLSのresetSelectionReceiverを呼んでSelectionLSから 選択図形を受け取るのをやめる。


2.3 RotateSpinnerListenerクラス  戻る=>page top
class RotateSpinnerListener implements ChangeListener
メソッド 説明
stateChanged public void stateChanged(ChangeEvent e)
スピナーの設定値が変更されたときに呼ばれる。
positionSpinnerModelsの値を取り出し、回転の中心点を画面に表示する。


3. 鏡映変換 戻る=>page top
水平方向、垂直方向の鏡映変換
ダイアログで方向とCopyの可否を設定し"GO"ボタンを押すと実行する。
∙ ダイアログ表示前に図形を選択しておく。

ダイアログを開いたときに図形が選択されていないと、 "select shapes before this command!"のメッセージが表示される(図3.1)。

∙ "copy yes"ボタンを選ぶと、図形のコピーを変換する。
 変換された図形は見易さのため少しずらして配置する。copy noの場合は元の位置に配置する。

   

(a)元の図形         (b) Copy yesで変換



図3.1



3.1 Flipクラス 戻る=>page top
public class Flip extends JDialog
フィールド 説明
action FlipAction action
FlipActionを設定する。
messageLabel JLabel messageLabel
ダイアログの一番上のメッセージラベルを設定。showMessageメソッドで書き込む。
hButton JRadioButton hButton
ダイアログでHorizontallyを指示するボタン
vButton JRadioButton vButton
ダイアログでVerticallyを指示するボタン
copyButton JRadioButton copyButton: Copy yesボタンオブジェクトを設定。
goButton JButton goButton:Goボタンオブジェクトを設定。
cancelButton JButton cancelButton:Cancelボタンオブジェクトを設定。
shapeVector Vector shapeVector
選択された図形を格納する。

メソッド 説明
コンストラクタ public Flip()
フィールド変数mainにこのオブジェクトを設定。
createDialogを呼んでダイアログオブジェクトを作成。
createDialog public void createDialog()
処理:
∙ ダイアログの表示位置:左上隅に表示する。
∙ ダイアログにWindowListenerを設定する。WindowListenerはFlipAction。
ウインドウが閉じる時に、このダイアログの終了処理を行う => closeDialog
∙ ダイアログにパネル、ボタン等を設定
上段にメッセージラベルを貼り付けたメッセージパネル、 Horizontally, VerticallyのボタンとCopy yes/noのラジオボタンを貼り付けた入力パネル、 下段にボタンを貼り付けたボタンパネルを配置する。
∙ 下段のボタンにはアクションリスナーを設定。ボタンが押された時にFlipActionで受けられるようにする。
showDialog public void showDialog(int commandId)
∙ pack、setVisibleで表示。
選択されている図形 をshapesVectorに登録する。
selected public void selected(SelectionEvent event)
このメソッドはSelectionListenerが定義するメソッドである。
このメソッドは現在使われていない。
引数:
event - SelectionEvent object.
処理:
SelectionLSで図形が選択されると、このメソッドが呼ばれる。
受け取った図形をshapeVectorに登録する。
showMessage protected void showMessage(String message, Color color)
ラベルにメッセージを表示する。
getSelectedContainers public ShapeContainer[] getSelectedContainers()
shapeVectorに登録されている図形を配列で返す。
getHorizontalButton public JRadioButton getHorizontalButton()
フィールド変数hButtonを返す。
getCopyButton public JRadioButton getCopyButton()
Copy yesボタンを返す。
getShapeVector public Vector getShapeVector()
shapeVectorを返す。


3.2 FlipActionクラス 戻る=>page top
class FlipAction extends AbstractAction implements WindowListener
メソッド 説明
actionPerformed public void actionPerformed(ActionEvent e)
処理:
ボタンが押されたときに、アクション処理を実行する。
∙ Goボタン:this.flipContainerメソッドで図形を鏡映変換する。Copy yesボタンが押されているときはコピーする。
this.rotateContainerで変換を行う。変換マトリックスは Matrix2D.getFlipMatrixで作成する。
Undoの設定を行う。
∙ Cancelボタン: closeDialogメソッドを呼んでダイアログを閉じる。
flipContainer private ShapeContainer flipContainer(Matrix2D flipMatrix, ShapeContainer container, boolean copy)
処理:
図形を鏡映変換する。copy=trueのときはcontainerのcloneを作成して鏡映変換する。
グループ図形の場合の処理を行う。
closeDialog private void closeDialog()
処理:
setVisible(false)でダイアログを閉じる。
SelectionLSのresetSelectionReceiverを呼んでSelectionLSから 選択図形を受け取るのをやめる。
windowClosing public void windowClosing(WindowEvent e)
closeDialogメソッドを呼ぶ。


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