2007年3月11日作成

Help

目次
  1. 図形の描写(直線・曲線)
    1. 直線
    2. ベクトル
    3. 長方形
    4. 楕円
    5. 折れ線
    6. 多角形
    7. 正多角形
    8. 落書き曲線
    9. 2次ベジエ曲線
    10. 3次ベジエ曲線
    11. 連続2次ベジエ曲線
    12. 連続3次ベジエ曲線
  2. 図形の描写 (塗りつぶし図形)
    1. 楕円
    2. 長方形
    3. 多角形
    4. 正多角形
  3. 図形の描写 (グラフ・イメージ)
    1. 消しゴム
    2. 文字入力
    3. グラフ入力
    4. イメージ(jpeg)選択
  4. 図形の描写 (プロパティ)
    1. スムージング有り⇔無し
    2. 色の選択
    3. 線種・太さ
    4. 塗りつぶしの種類
    5. 座標系の間隔
  5. 図形の描写 (編集)
    1. やり直し
    2. やり直しのやり直し
    3. 全図形・履歴消去
    4. 図形選択編集
      1. 移動
      2. 複製
      3. 消去        
      4. 色の変更
      5. 線種・太さの変更
      6. 塗りつぶしの変更
      7. テキストの変更
  6. 一次変換
    1. 数字の入力
    2. アニメーション
    3. コントロールパネル
    4. 発展的な設定
  7. その他
    1. このプログラムの目的
    2. JAVAな話
    3. 今後の発展
    4. 連絡先

1.図形の描写(曲線)

図形の種類 その描き方
直線 マウスを押して始点を定め、次にドラッグします. マウスを離すと直線が定まります.
ベクトル マウスを押して始点を定め、次にドラッグします. マウスを離すとベクトルが定まります.
長方形 マウスを押して始点を定め、次にドラッグします. マウスを離すと長方形が定まります.
マウスを押して始点を定め、次にドラッグします. マウスを離すと円が定まります.
楕円 マウスを押して始点を定め、次にドラッグします. マウスを離すと楕円が定まります
折れ線 マウスを押して始点Aを定め、次にドラッグします. マウスを離すと新しい頂点Bが一個定まります. つぎにマウスをドラッグすると、ドラッグしている点と点A,点Bで折れ線が定まります. マウスを離すと新しい頂点Cが定まります. これを繰り返して頂点の数を増やし折れ線を描いていきます. 最後にクリックして図形を確定させます.
多角形 マウスを押して始点Aを定め、次にドラッグします. マウスを離すと新しい頂点Bが一個定まります. つぎにマウスをドラッグすると、ドラッグしている点と点A,点Bで三角形が定まります. マウスを離すと新しい頂点Cが定まります. これを繰り返して頂点の数を増やし多角形を描いていきます. 最後にクリックして図形を確定させます.
正多角形 メニューをクリックすると小さなDialogが現われます. ここに頂点の数nを 3≦n≦24で入力します. あとは直線のときと同様です. マウスを押して始点を定め、次にドラッグします. マウスを離すと正多角形が定まります. (頂点の数を24以下にしたのは特に理由はありません.)
落書き曲線 マウスを押して始点を定め、次にドラッグします. マウスの動きにつれて曲線が描かれます. これは単にマウスの通った点を記憶して短い直線で継げているだけです. マウスを離すと曲線が定まります.
2次ベジエ曲線 マウスを押して始点Aを定め、次にドラッグします. マウスを離すと終点Bが定まり, 同時に緑の四角が1個現われます.この四角の点Cはコントロール点と呼ばれます.このコントロール点をドラッグすると図形が変わります. 最後にクリックして図形を確定させます. ちなみに 「2次ベジエ曲線」とはx成分,y成分がパラメータtの2次式になっていて,かつ始点、終点における接線が, 常にコントロール点を通る曲線です.
3次ベジエ曲線 マウスを押して始点Aを定め、次にドラッグします. マウスを離すと終点Bが定まり, 同時に緑の四角が2個現われます.この四角の点C1,C2はコントロール点と呼ばれます.このコントロール点をドラッグすると図形が変わります. 最後にクリックして図形を確定させます. ちなみに 「3次ベジエ曲線」とはx成分,y成分がパラメータtの3次式になっていて,かつ始点、終点における接線が, それぞれ点C1,C2を通る曲線です.
連続2次ベジエ曲線 最初は「折れ線」を描くのと同様です. ドラッグしてマウスを離す毎に新しく頂点を加えていきます. 1回だけクリックすると赤い頂点と緑の四角が数個現われます.今度はコントロール点だけでなく頂点もドラッグできます. 最後にダブルクリックして図形を確定させます. すなわち最初に決めた頂点の位置はまったくどうでもよく、頂点の数だけが問題です. ちなみに 「連続2次ベジエ曲線」と言う用語はありません.なぜなら2次のベジエ曲線は一つ一つのブロックが独立なので数学的には区別する必要が無いからです. しかし「ベジエ曲線を継げることで、円がどのくらい近似できるか?」という個人的興味から作成してみました.
連続3次ベジエ曲線 最初は「折れ線」を描くのと同様です. ドラッグしてマウスを離す毎に新しく頂点を加えていきます. 1回だけクリックすると赤い頂点と緑の四角が数個現われます.今度はコントロール点だけでなく頂点もドラッグできます. 最後にダブルクリックして図形を確定させます. すなわち最初に決めた頂点の位置はまったくどうでもよく、頂点の数だけが問題です. ちなみに 「連続3次ベジエ曲線」と言う用語はありません.なぜなら3次のベジエ曲線は一つ一つのブロックが独立なので数学的には区別する必要が無いからです. しかし「ベジエ曲線を継げることで、円がどのくらい近似できるか?」という個人的興味から作成してみました.

曲線の「色」、「線種・太さ」、「塗りつぶしの有無」などは、あとで「編集」から変更できます. (つまり最初に形だけ書いておいて後で塗りつぶすことが可能です.) さらにプロパティであらかじめ「色」、「線種・太さ」などを決めておくこともできます.

2.図形の描写(塗りつぶし)

図形の種類 その描き方
マウスを押して始点を定め、次にドラッグします. マウスを離すと円(塗りつぶし)が定まります.
楕円 マウスを押して始点を定め、次にドラッグします. マウスを離すと楕円(塗りつぶし)が定まります
長方形 マウスを押して始点を定め、次にドラッグします. マウスを離すと長方形(塗りつぶし)が定まります
多角形 マウスを押して始点Aを定め、次にドラッグします. マウスを離すと新しい頂点Bが一個定まります. つぎにマウスをドラッグすると、ドラッグしている点と点A,点Bで三角形が定まります. マウスを離すと新しい頂点Cが定まります. これを繰り返して頂点の数を増やし多角形(塗りつぶし)を描いていきます. 最後にクリックして図形を確定させます.
正多角形 メニューをクリックすると小さなDialogが現われます. ここに頂点の数nを 3≦n≦24で入力します. あとは直線のときと同様です. マウスを押して始点を定め、次にドラッグします. マウスを離すと正多角形(塗りつぶし)が定まります. (頂点の数を24以下にしたのは特に理由はありません.)

塗りつぶしの「色」、「デザイン」、「塗りつぶしの有無」は、あとで「編集」から変更できます. (つまりこのメニュー全体が実は不要かも?) さらにプロパティであらかじめ「色」、「デザイン」などを決めておくこともできます. なお曲線の「線種・太さ」は塗りつぶしにはまったく関係しません.

3.図形の描写(その他)

図形の種類 その描き方
マウスを押して離します. 点のサイズを後で変更することはできません.
消しゴム マウスを押してゴシゴシこすります. これは「背景色による塗りつぶし」です. したがって「編集」で図形を移動しても、消した領域は移動しません.
文字 マウスをクリックすると, Dialogと入力場所を表す四角の枠が現われます. Dialogの中のTextFieldに文字を入力してください. 「フォント選択」のボタンを押すとまたまたDialogが開きます. 適当なフォントとサイズ,色を選択してください. なお2文字以上の場合と、フォントのサイズが大きい場合は, フォント自体を「図形」とみて一次変換します. また文字、フォントは再編集できます.
グラフ Menuをクリックすると, Dialogが開きます. DialogのTextFieldに数式を直接入力するか, Paletteを開いてそこから入力します. グラフは「落書き曲線」と同様 短い線分を繰り返すことで描いています. また関数の一覧表は下の表になります.
イメージ Menuをクリックすると, Dialogが開きます. Dialogのサムネイル(小さな写真の表)をクリックすると画像が表示されます. スクロールバーを動かしてサイズを選び、さらにマウスでドラッグすることにより位置を決めます.「決定」 ボタンを押すまではまだ確定ではないので注意してください. すなわち「確定」ボタンを押さずにDialogを閉じると写真は消えてしまいます. なお写真の位置はあとで「編集」から変更できます.


<関数リスト>

三角関数(単位ラジアン) sin( ), cos( ), tan( )
三角関数(単位 度) Sin( ), Cos( ) ,Tan( )
逆三角関数(ラジアン) asin( ), acos( ), atan( )
指数・対数関数(底は e ) exp( ), log( )
指数・対数関数(底は a ) pow(a, ), log(a, )
最大値・最小値 ( 2つの量の) max(x,y), min(x,y)
正の平方根 sqrt( )
絶対値 abs( )
xをyで割った時の剰余 remainder(x,y)
切捨て・切り上げ・四捨五入 floor( ),ceil( ),round( )
乱数(0以上1以下の乱数を発生) random( )
加減乗除, 累乗 + , - , * , / ,^
円周率 pi
自然対数の底 e

イメージは残念ながらアプレットの制限(アプレットはローカルファイルを読めない)により、Dialogのファイルの中から選んでいただくしかありません.
文字入力を除いて, 再編集を不可能にしているのもアプレットの制限のためです. (∵アプレットではRobotClassを使えないので マウスが終点に移動できない! )

4.図形の描写(プロパティ)

種類 その特徴
スムージング スムージングとは曲線のすぐ外のドットを中間色で埋めることにより,曲線を滑らかに見せる技術です. Default(初期設定)ではOnにしています.
色の選択 Swing の JColorChooser を利用しています. 好きな色をクリックして選択、RGBを指定, HSBを指定 の3つの方法で色が選択できます. 後から編集できます.
線種・太さ 「線種」は実線、点線、破線の3種類が、「太さ」は5種類の太さが選べます. これは「塗りつぶし」には無関係です.後から編集できます.
塗りつぶしの種類 カスケードメニューになっています. お好きな塗りつぶしのパターンを選んでください. このパターン自体は一次変換されません. 「編集」して、後から変更することもできます.
座標系の罫線間隔 スクロールバーを動かして罫線の間隔を選択してください. 変換してもすでに書かれた図形の描写は変わりません. しかしグラフを新しく描写する時は、変換した罫線に従います. おそらく罫線の間隔を変更したくなるのは 「図形をつぶす」ような一次変換をする時です. このようなとき罫線があると罫線のために図形がよく見えないことがあります. その際は罫線の間隔を大きく取り直すか、または罫線を表示しない(一次変換のDialogから)ことが有効です.

「色の選択」は Swingを使っているので 多少じれったくなる時があるかもしれません.

5.図形の描写(編集)

種類 その特徴
やり直し 一つ前の履歴を表示します.履歴を取るタイミングは (@)図形を描くモードでは, マウスを離したとき. (A)個別編集モードでは, 一つ一つの編集が実行されたとき です.
やり直しのやり直し 「やり直し」と逆に、一つ先の履歴を表示します. 「やり直し」を始めた時点より進むことはできません. また「やり直し」で過去に戻ったときに新しい操作をすると、その時点から以降の履歴は削除されます。すなわち新しい履歴で上書きすることになります。(いわゆる線形Undo機構)
全画面・履歴消去 全画面と全部の履歴を消去します.
個別編集 赤い点線の枠で囲まれた図形を個別に編集することができます. クリック個別編集時には画面上で右クリックするとポップアップメニューが現われます. メニューの内容は下の表を参照してください. また個別編集中は新しい図形の描写はできません。個別編集を終わらせるにはメニューとポップアップメニューのどちらかを利用してください. さらに「個別編集開始」を選択しても 赤い枠で囲まれた図形が見えないときがありますが、よく見ると小さな赤い四角が見えるはずです。これは図形描写モードで意図せずに描いてしまった非常に小さな図形の選択です。次の図形を選択してください。次の図形を選択するには (@)選択したい図形の上でシングルクリックする. (A)ポップアップメニューから「次の図形を選択する」を選ぶ. (B)画面上で適当にダブルクリックして,次の図形を選択する. の3つの方法があります。

<個別編集メニュー(ポップアップメニュ-)>
個別編集メニューを表示するには、メニューから「編集」→「個別編集開始」と選んで画面上で右クリックしてください.

種類 その特徴
移動 すべての図形で選択できます。マウスでドラッグして離します。
消去 すべての図形で選択できます。選択図形が消えます。
複製 すべての図形で選択できます。選択図形が複製されます。複製された直後は図形が重なって見えません。「移動」すると見えるようになります。
色の変更 イメージ,文字,消しゴム以外で選択できます。ColorChooserDialogが開きます.
線種・太さの変更 イメージ,文字,消しゴム、点以外で選択できます。線種・太さの変更は塗りつぶしでは有効でありません。つぎの「塗りつぶしの変更」で「塗りつぶし無し」に変更してから有効になります。
塗りつぶしの変更 イメージ,文字,消しゴム、点以外で選択できます。「塗りつぶしの柄」と「塗りつぶしの有無」を変更できます。
テキストの変更 文字でのみ選択できます。文字の内容、フォント、色などを変更できます。最初に書くときと違い「決定」ボタンを押してもDialogは閉じません。これはtry&errorをするためです。
次の図形の選択 次の図形を選択します。最後に描かれた図形から逆の順序で選択されます。最初に描いた図形まで戻ったら、最後に描かれた図形を選択します。画面上で適当にダブルクリックしても同じ働きです。選択したい図形が決まっているときは、その図形の上でシングルクリックすると すぐ選択することができます。
個別編集終了 個別編集を終了させます。個別編集中は新しい図形の描写はできません。

6.一次変換

高校で習う一次変換(2次元)とは, a,b,c,dを実数の定数とするとき

で表される変換です。平行移動は一次変換ではありません。この一次変換のイメージを掴んで欲しいと言うのがこのプログラムの主要目標です。

<式の入力>
DialogのTextFieldに直接、数字や数式を入力するか、「Palette」をクリックして入力パレットを開きそこからTextFieldに入力します。入力が済んだら「Transform」ボタンをクリックして実際に変換します。

a.テキストフィールドへの直接入力:
数字や関数を直接入力します. 回転変換では三角関数を使うと思いますが、角度の単位がラジアンのときは、小文字のsin,cos,tanを、角度の単位が度(°)のときは、先頭のみ大文字のSin,Cos,Tanを 使用してください。また掛け算は * 記号で、割り算は / 記号(どちらも半角)で表します.さらに円周率はpi(PI,Piでも可)です。よって は sin(1/3*pi) に, sin60°は Sin(60) となります。他の関数に関しては関数表をご覧ください.
b.パレットを使用しての入力:
ここでは、5種類の特別な一次変換の入力がマウスだけでできます。特別な変換とは以下の変換です。このうちshear変換は教科書には載っていませんが、一次変換の様子が良くわかるので、敢えて設定してあります。
(@)原点中心のk倍の拡大・縮小
(A)原点中心のθの回転
(B)原点を通る直線 (y=tanθ) に関する対称変換
(C)x軸に平行な方向へのつぶし(shear変換)
(D)y軸に平行な方向へのつぶし(shear変換)
まずマウスでチェックボックスをクリックして選択します。その後 Scrollbarの目盛りを動かして、パラメータkとθの値を設定します。「入力」ボタンを押すとTextFieldに数式が入力されます。その後,「変換」ボタンをクリックしてください。

<アニメーション>
今回のヴァージョンではアニメーションを使えるようにしました.これは私が入っている数学ソフト研究会(Cabri研究会) の方々の作られたソフトに啓発されたためです.アニメーションの切り替えは右上のチョイスか 行列の操作ダイアログから出来ます.モードは4つあります.

(a)アニメーション無し
アニメーションはありません.
(b)(c)回転その1,回転その2
一次変換が回転行列や,回転と拡大の合成の時は このモードを選ぶと良いです.大雑把に言うと,回転角の少ない方向に回転と拡大をしながらアニメーションしていくのが 「回転その1」で,反時計回りに回転と拡大をしながらアニメーションしていくのが「回転その2」です.ただしこれらは基底ベクトルが(1,0)と(0,1)のときで, それ以外の時は多少異なります.
細かく言うと変換が で アニメーションのフレイム数が n とすると, (1,0)ベクトルと(a,c)ベクトルの間に(n-1) 個のベクトル(k=1,2,...,n-1)を, 長さ=||が等比数列になりかつ 偏角=arg() が等差数列になるように とります.同様に(n-1) 個のベクトル(k=1,2,...,n-1)を (0,1)ベクトルと(b,d)ベクトルの間に作成します.そして2つのベクトルを並べて 作った行列が  Ak=(,) ですが,この行列Akによって変換したものが k番目のフレームになります.このフレームを順に表示してアニメーションを作っています.「その1」と「その2」の違いは偏角を図るときに 「絶対値が最小になるように計るか」か「反時計回りにとるか」のちがいです.なお, 一次変換が回転行列や,回転と拡大の合成の時は 各Akも回転行列や 回転と拡大の合成となります.
(d)固有ベクトルの利用
実固有ベクトルが1つ以上有るときは このモードを選ぶと良いです.従って 原点を通る直線に関する対称移動の時も このモードを選ぶと良いです.そしてこのモードを使うときは 合わせて 基底ベクトル ,を固有ベクトルに取るとさらによく分かります.固有ベクトルを知るには <発展的な設定>の<固有値と固有ベクトル>において求めることも出来ます.ここで求めた固有ベクトルを<左側窓の設定>において 基底ベクトルに取ることが出来ます. 
細かい話をすると 独立な固有ベクトルが ,の二つあり その固有値がそれぞれ α,βであるとします.この一次変換は 基底を ,とすると B=  で表されます. そこで (1,0)ベクトルと (α,0)ベクトルの間を等分して (n-1) 個のベクトル(k=1,2,...,n-1)を作ります.同様に (0,1)ベクトルと (0,β)ベクトルの間も等分して (n-1) 個のベクトル(k=1,2,...,n-1)もとります.そしてBk=(,)とすると, Bkは 基底が ,のときに k番目のフレームに移る変換を表す行列になります.このBkを基底が(1,0)と(0,1)のときの行列Akに変換して います.すなわち P=(,)としたとき Ak=PBkP-1です.
実固有ベクトルが の一個しかないときも 2×2行列の時は と独立な任意のベクトルを   と取ったときに B=  と表すことができます.そこで (1,0)ベクトルと (α,0)ベクトルの間を等分して (n-1) 個のベクトル(k=1,2,...,n-1)を作ります.同様に (0,1)ベクトルと (k,α)ベクトルの間も等分して (n-1) 個のベクトル(k=1,2,...,n-1)もとります.そしてBk=(,)とすると, Bkは 基底が ,のときに k番目のフレームに移る変換を表す行列になります.このBkを基底が(1,0)と(0,1)のときの行列Akに変換して います.すなわち P=(,)としたとき Ak=PBkP-1です.このプログラムでは簡単のために と直交するベクトルにとっています.


<コントロールパネル>
アニメーションのコントロールは 右側窓の上部のコントロールパネルから行うか,または 行列ダイアログの「発展的な設定」で「右側窓(変換画面)の設定」を選んで より細かく調整することも出来ます.下の画面は「固有値アニメーション」の時です.左から順に「モード」,「現在の変換行列」,「巻戻し」,「プレイ」,「ポーズ」,「スライダー」,「早送り」,「スピード」を表します.「現在の変換行列」は アニメーションの時の各フレイムに対応する変換です.従って時々刻々変わっていきます.「スライダー」はプレイ時には働きませんが,止まっている時やポーズの時は自由に動かすことが出来ます.このパネルでは「フレイム数」のみがコントロールできません.それには「発展的な設定」の方をお使いください.

 

<発展的な設定>
行列の操作窓の下側にあるチョイスから選択することが出来ます.4種類あります.

(a).右側窓(変換画面)の設定
-右側(変換窓)のプロパティを設定します.設定項目は「アニメーション」,「基底ベクトル(e1,e2)の像」と「その他」です.「アニメーション」は アニメーションを有効にすると 右側窓の上部に コントロールパネルが現れるので ここで操作することも出来ます.フレイム数はアニメーションのフレイムの数です.「その他」の項目にある「対称軸の表示」というのは 一次変換が原点を通る直線に関する対称移動のときに,対称軸を紺色で表示します.
(b).左側窓(オリジナル画面)の設定
-左側窓(オリジナル図形)のプロパティを設定します.設定項目は「基底ベクトル(e1,e2)の設定」と「その他」です.ここで基底ベクトルを設定して網の目を描くことが出来ます.とくに一次変換が2つの独立な実固有ベクトルを持っているときに e1,e2を固有ベクトルに設定し,「固有値」でアニメーションすると一次変換の意味が良く分かります.実固有ベクトルを一つしか持たないときはそれと独立な「任意の」ベクトルを組み合わせて基底を作ってみてください.そしてやはり「固有値」でアニメーションをしてみてください.今度はずらし変換(shear)と拡大の合成になっていることが分かると思います.さらに 下のボタンをクリックすると.P-1APの値を知ることも出来ます.
(c).固有値と固有ベクトル
-固有値と固有ベクトルを計算します.ここで求めた固有ベクトルを基底ベクトルに取ることが出来ます.この計算には自作のクラスを作ったので 実は 変な行列の時は答えがおかしくなります.変な答えが出てきたときは bug だと疑ってみてください.(このようなことが起こるのはコンピュータの計算誤差の所為です.これを修正するのは超大変なので勘弁してください)
(d).P-1APの計算.
-Dialog (b)で設定した基底ベクトル e1,e2 を並べて作った行列を P=(e1,e2)とし,Aを与えられた一次変換を表す行列としたとき,P-1APを計算します.e1,e2ベクトルが固有ベクトルの時は P-1AP は対角行列 (1-2成分と2-1成分がともに0の行列) となり, その成分は固有値です.固有ベクトルが一組しかないときは P-1AP は三角行列 (1-2成分か2-1成分が0の行列)となります.

7.その他

a.このプログラムの目的
このプログラムは高校生の皆さんに一次変換のイメージを持ってもらうために作成しました。数学でもっとも大切なことの一つは「イメージを持つこと」です。「イメージ」を持っていないとむやみに解法や公式を丸暗記することになってしまうし、大学でも使い物になりません。何よりも「数」が「数が(く)」になってしまいます。(^_^;) いろいろな絵を描いて変換しまくって欲しいと思います。
b.Javaな話
このプログラムはJavaで書かれています。Javaにはいろいろなヴァージョンがありますが,ここで使用したのは SDK1.41(Java2)です.(古い?) これと秀丸、および秀丸のマクロ(Java2MAC)を使って作成しました。ちなみにOSはWindowsXP,CPUはAthron2.19GHzです. 以前のヴァージョンを作ったときはSwingは本当に重く,ほとんど使用しませんでしたが,マシンを買い換えたのと Javaの動画機能が良くなったためにSwing もずいぶん速くなった気がします.従って今回は色々チョコマカと使わしてもらいました.主に使ったのは 「ColorChooser」 と 「グラフ入力パレット」と「スライダー」ですが,その他に JLabel, JCheckBox,JRadioButton も数箇所使いました.これらは htmlを使って「P-1AP」 などの文を表示させるための他に, 日本語とアルファベット混在の文をきれいに表示するため使用しました.実際 Swing のこの機能は余り知りませんでした.日本語とアルファベット混在の文は AWTのLabel ではうまく表示されないのですが, Label を JLabel に換えるだけで きれいに表示されます. html を使う必要はありません.なお JButton は全く使っていません. どうも JButtonは コンテナーが Swing でないとうまく行かないみたいです. そもそも「 Swing の部品を使う場合は そのコンテナもSwing でないといけない」と本に書いてあったのですが,今回は無謀にも フレームは普通のAWTのFrameのままで そこに直接 JスライダーやJラベルを埋め込んでいます.一応 私の環境ではこれで問題なく動いたのですが, 保障された使い方では無い ので環境によってはうまく動かないかもしれません.その場合はそっくり全体をSwing にしますので ご連絡ください.私が今回全体を Swing にしなかったのは Swing がかなり速くなったとはいえやはり 普通のAWTの方が軽いと思った所為です.それともちろん「面倒くさかった」のも大きな理由です.Swing にすれば速くなるならいざ知らず,ただ見栄えを良くするために 速度を犠牲にし かつまた 膨大な時間(多分2〜3日)を掛けるのは納得いかなかったのです. 今回は「見栄えが悪すぎる部分を直す」ために主に 使用しました.ご了承ください.
Graphicsでは Graphics2DとGeneralPathをたくさん使っています。左側の画面では XORモードを利用して描きました.一次変換は Java2DのAffineTransform class を使用していますが、画面全体を一度に変換すると(これなら楽なのですが) ad-bc≒0のとき画面が霞んでしまうので図形ごとに変換しています.アニメーションは 最初はやはり XORモードを利用したのですが,ちらつきが抑えられないので Bufferd strategy を使いダブルバッファリングしています.最初はVolatileImageを使って自作してみたのですが,マニュアルどうりにやってもどうしても時々画面が黒くなってしまうので 色々試してこれに行き着きました.アニメーションの「固有値を使った変換」では 自分で固有ベクトルを求めるクラス(myEigenVectors)を作成したのですが,CASまで自作することは出来なかったので どうしても計算誤差が消せず 変態行列に対してはうまく求まりません.どなたかうまいクラスを作ってくださいませ.fieldが double[] vector1,vector2とdouble eigenvalue1,2 と int rank(=固有ベクトルの個数) を持ち コンストラクタが myEigenVectors(double a,double b,double c,double d)のクラスです.メソッドはありません. なお a,b,c,dは行列の成分です.
c.今後の発展
まずバグを減らすことです.(~_~;) 次にグラフを描写するときにString型をdouble型に変換していますが、これは私が4年以上も前に書いたプログラムを多少改良して利用しています。しかしこれには実は いろいろ不完全な点があります。一番の欠点はString型を多用している点です。これをStringBuffer型を使うように組み替えて、実行速度を上げ、さらにいろいろな例外を適切に投げるようにしたいと思います。時間が有れば 次は3次元で類似のソフトを作ってみたいと思います. さらに将来の話としては、JavaでなくC++を使って書き直してみたいです。しかし、私はプログラミング言語は Java,Perl,Basic(VisualでないBasic),TeX しか知らないので、これはいつの話になることやら…( C++は,サンデープログラマーには難しいらしいですね。一方Pascalはマイナーで本を探すのにも苦労します。したがってDelphiはちょっと使う気になれません。)
d.連絡先
Version window に email アドレスが載っています.