配列、座標変換その2 |
配列とは英語の "array" の訳語であり、array は「ずらりと並んだもの」という意味の語である。ほとんどすべてのプログラミング言語は配列を使えるような言語仕様になっており、その名の通り、添字(そえじ)を付けた変数を「ずらりと並べたもの」である。
int[] a = new int[10]; // この場合、添字の上限は 10-1=9 になる。のように書く。a は配列の名前である。
a[添字を表す式]、 例えば a[5] とか a[2n+1]のように書く。これを添字付き変数 という。
a[0], a[1], a[2], ・・・, a[上限値](これらは、その配列の配列要素ともいう)は、コンピュータ内部のメモリ上でも連続した領域に割り当てられる。
メソッドの概略については前回学んだ。普通数学では、x,y をパラメータとする関数 f を定義するときには f(x,y) のように書くが、関数に相当するものであるメソッドを定義するときに Java ではどのように書くのであろうか? 今回は、その書き方と、そうして定義されたメソッドを使う(呼び出す)ときの書き方について学ぶ。
● メソッドについての詳細は「Javaの基本(8) メソッド(その1)」 を参照のこと。
メソッドを呼び出すとき、呼び出す側と呼ばれる側の間でデータを遣り取りする手段として(たいていのプログラミング言語が持っている)代表的なものは次の2つである(それ以外に、大域的変数(クラスのフィールド)を用いるやり方もある)。
値呼び出しは、
public int something(仮引数の並び)と宣言しておき)、メソッド呼び出しの式
something(実引数の並び)によってその値を参照する。
繰り返すが、配列は参照型変数である。
● 参照型についての詳細は「Javaの基本(12) 参照 を参照のこと。
(例) 配列名は参照型
public static void mult(int[] a, int n) { // @ a は int 型の配列(仮引数が配列の場合はこのように書く) for (int i=0; i<a.length; i++) a[i] *= n; // A } public static void main(String[] args) { // args は String 型の配列 int[] b = {0, 10, 20}; System.out.println(b[0]+b[1]+b[2]); // B 30 が出力される mult(b, b[2]); // C System.out.println(b[0]+b[1]+b[2]); // D 60 が出力される }
メソッドは通常は値(return 文によって返される値)を1つしか返せないが、参照渡しを使うことにより、複数の値を返す手段としても使える。 すなわち、参照渡しにおいては、呼ばれたメソッド内で仮引数の値が変化すると、呼んだ側の対応する実引数の値も変化することを利用するのである。
グラフィックス画面の座標を通常の xy-座標に変換する方法については第3回ですでに述べ、以後、活用している。また、極座標についてもすでに第6回で扱った。
(a) 回転
原点を中心に点 (x, y) を反時計回りにθラジアン回転させると、新しい座標 (x', y') は
(b) 対称変換
点 (x, y) を x 軸 (y 軸) に関して対称移動すると、新しい座標 (x', y') は
(c) 拡大/縮小(スケーリング)
点 (x, y) の x 成分を s 倍、y 成分を t 倍すると、新しい座標 (x', y') は
(a), (b), (c) を一般化し、
(d) 平行移動
点 (x, y) を x 軸の正方向に a、y 軸の正方向に b 移動させると、新しい座標 (x', y') は
(a’) 任意の点を中心とする回転
(a, b) を中心に点 (x, y) を反時計回りにθラジアン回転させると、新しい座標 (x', y') は
(b’) 任意の直線を対称軸とする対称変換
直線 y = ax + b を対称軸として (x, y) を対称移動させると、新しい座標 (x', y') は
(c’) 任意の点を中心とする拡大/縮小(スケーリング)
(a, b) を中心として点 (x, y) を s 倍に拡大/縮小すると、新しい座標 (x', y') は
課題7でやること |
~/public_html/infomath6/
2.ギザギザ葉の花を描く
今回は、このような ギザギザの葉を持つ花 を描いてみよう。これには、元になるギザギザの葉の 上半分 を描き、これに対称変換を施して このような 1枚の葉 とする。さらに、これを拡大/縮小して回転して平行移動したものを3つ描き、それに花と茎をつけると これ が描ける。
final int[] x = {0,12,10,20,18,30,25,40,34,44,41,47,45,50}; final int[] y = {0, 9, 5,10, 7,12, 5,10, 5, 6, 3, 4, 2, 0}; int N = x.length; // 葉の尖端の個数で与えることにする。(x[i], y[i]), 1≦i≦N, が尖端の座標である。これらの配列の長さ N は尖端の個数である。尖端を
(x[0], y[0]), (x[1], y[1]), (x[2], y[2]), ..., (x[n], y[n])の順に線分で結んだものが これ である。
3.プラスα
void rotate(double[] x, double[] y, double theta, double[] xx, double[] yy) { ここを完成させること }