Morphing public class Mix public static void mainString
複雑なプログラム • Morphingのプログラム public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } 2 計算機プログラミングI (増原) 2003年度
クラスメソッドによる整理 // 円と星を描き、その間を補完する public class Mix 4 { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 4; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = create. Turtles(n. Turtles, radius, f); //タートルを作り配置 hm[n. Turtles - 1]. lt(360/star. Edges); //星形の最初の向きを変えておく public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); for (int step = 0; step < steps; step++) { circle. Step(hm[0], radius, steps); //円を描く star. Step(hm[n. Turtles-1], radius, steps, star. Edges, step); //星形を描く } //n匹のタートルの配列を作って返す。 static Turtle[] create. Turtles(int n, interval, Turtle. Frame f){ Turtle[] hm = new Turtle[n]; for (int i = 0; i < n; i++) { hm[i] = new Turtle(2*interval*i, interval, 0); f. add(hm[i]); } return hm; } Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); //タートルmを使って半径radiusの正steps角形の 1辺を描く static void circle. Step(Turtle m, int radius, int steps) { m. fd((int)(Math. PI*2*radius/steps)); m. rt(360/steps); } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } for (int i = 1; i < n. Turtles - 1; i++) { //i: (n. Turtles-1 -i) の内部点にi番目のタートルを移動 move. To. Div. Point(hm[0], hm[n. Turtles-1], i, n. Turtles-1 -i, hm[i]); } //タートルmを使ってn角星形の 1部を描く。辺長は 2*radius。steps回の分割のi回目。 static void star. Step(Turtle m, int radius, int steps, int n, int i) { if (i % (steps/n) == 0) { m. rt(360*2/n); } //(steps/n)回に一度回転 m. fd(2*n*radius/steps); } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } // turtle 0とturtle 1をm: nに内分した位置へturtle 2を移動する static void move. To. Div. Point(Turtle turtle 0, Turtle turtle 1, int m, int n, Turtle turtle 2) { turtle 2. move. To(div. Point(turtle 0. get. X(), turtle 1. get. X(), m, n), div. Point(turtle 0. get. Y(), turtle 1. get. Y(), m, n), 0); } // x 0とx 1をm: nに内分した値を求める static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n+x 1*m)/(m+n); } } 3 計算機プログラミングI (増原) 2003年度
クラスメソッドによる整理 // 円と星を描き、その間を補完する public class Mix 4 { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 4; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = create. Turtles(n. Turtles, radius, f); //タートルを作り配置 hm[n. Turtles - 1]. lt(360/star. Edges); //星形の最初の向きを変えておく public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); for (int step = 0; step < steps; step++) { circle. Step(hm[0], radius, steps); //円を描く star. Step(hm[n. Turtles-1], radius, steps, star. Edges, step); //星形を描く } //n匹のタートルの配列を作って返す。 static Turtle[] create. Turtles(int n, interval, Turtle. Frame f){ Turtle[] hm = new Turtle[n]; for (int i = 0; i < n; i++) { hm[i] = new Turtle(2*interval*i, interval, 0); f. add(hm[i]); } return hm; } Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); //タートルmを使って半径radiusの正steps角形の 1辺を描く static void circle. Step(Turtle m, int radius, int steps) { m. fd((int)(Math. PI*2*radius/steps)); m. rt(360/steps); } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } for (int i = 1; i < n. Turtles - 1; i++) { //i: (n. Turtles-1 -i) の内部点にi番目のタートルを移動 move. To. Div. Point(hm[0], hm[n. Turtles-1], i, n. Turtles-1 -i, hm[i]); } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } //タートルmを使ってn角星形の 1部を描く。辺長は 2*radius。steps回の分割のi回目。 static void star. Step(Turtle m, int radius, int steps, int n, int i) { if (i % (steps/n) == 0) { m. rt(360*2/n); } //(steps/n)回に一度回転 m. fd(2*n*radius/steps); } 新たに 追加された メソッド // turtle 0とturtle 1をm: nに内分した位置へturtle 2を移動する static void move. To. Div. Point(Turtle turtle 0, Turtle turtle 1, int m, int n, Turtle turtle 2) { turtle 2. move. To(div. Point(turtle 0. get. X(), turtle 1. get. X(), m, n), div. Point(turtle 0. get. Y(), turtle 1. get. Y(), m, n), 0); } // x 0とx 1をm: nに内分した値を求める static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n+x 1*m)/(m+n); } } 4 計算機プログラミングI (増原) 2003年度
クラスメソッドによる整理 // 円と星を描き、その間を補完する public class Mix 4 { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 4; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = create. Turtles(n. Turtles, radius, f); //タートルを作り配置 hm[n. Turtles - 1]. lt(360/star. Edges); //星形の最初の向きを変えておく public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); for (int step = 0; step < steps; step++) { circle. Step(hm[0], radius, steps); //円を描く star. Step(hm[n. Turtles-1], radius, steps, star. Edges, step); //星形を描く } //n匹のタートルの配列を作って返す。 static Turtle[] create. Turtles(int n, interval, Turtle. Frame f){ Turtle[] hm = new Turtle[n]; for (int i = 0; i < n; i++) { hm[i] = new Turtle(2*interval*i, interval, 0); f. add(hm[i]); } return hm; } Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); //タートルmを使って半径radiusの正steps角形の 1辺を描く static void circle. Step(Turtle m, int radius, int steps) { m. fd((int)(Math. PI*2*radius/steps)); m. rt(360/steps); } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } for (int i = 1; i < n. Turtles - 1; i++) { //i: (n. Turtles-1 -i) の内部点にi番目のタートルを移動 move. To. Div. Point(hm[0], hm[n. Turtles-1], i, n. Turtles-1 -i, hm[i]); } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } //タートルmを使ってn角星形の 1部を描く。辺長は 2*radius。steps回の分割のi回目。 static void star. Step(Turtle m, int radius, int steps, int n, int i) { if (i % (steps/n) == 0) { m. rt(360*2/n); } //(steps/n)回に一度回転 m. fd(2*n*radius/steps); } 呼び出し と 定義 // turtle 0とturtle 1をm: nに内分した位置へturtle 2を移動する static void move. To. Div. Point(Turtle turtle 0, Turtle turtle 1, int m, int n, Turtle turtle 2) { turtle 2. move. To(div. Point(turtle 0. get. X(), turtle 1. get. X(), m, n), div. Point(turtle 0. get. Y(), turtle 1. get. Y(), m, n), 0); } // x 0とx 1をm: nに内分した値を求める static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n+x 1*m)/(m+n); } } 5 計算機プログラミングI (増原) 2003年度
クラスメソッドによる整理 // 円と星を描き、その間を補完する public class Mix 4 { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 4; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = create. Turtles(n. Turtles, radius, f); //タートルを作り配置 hm[n. Turtles - 1]. lt(360/star. Edges); //星形の最初の向きを変えておく public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); for (int step = 0; step < steps; step++) { circle. Step(hm[0], radius, steps); //円を描く star. Step(hm[n. Turtles-1], radius, steps, star. Edges, step); //星形を描く Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); } //n匹のタートルの配列を作って返す。 static Turtle[] create. Turtles(int n, interval, Turtle. Frame f){ Turtle[] hm = new Turtle[n]; for (int i = 0; i < n; i++) { hm[i] = new Turtle(2*interval*i, interval, 0); f. add(hm[i]); } return hm; } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } } for (int i = 1; i < n. Turtles - 1; i++) { //i: (n. Turtles-1 -i) の内部点にi番目のタートルを移動 move. To. Div. Point(hm[0], hm[n. Turtles-1], i, n. Turtles-1 -i, hm[i]); } //タートルmを使って半径radiusの正steps角形の 1辺を描く static void circle. Step(Turtle m, int radius, int steps) { m. fd((int)(Math. PI*2*radius/steps)); m. rt(360/steps); } 1つ 1つは 短くなる → バラバラに 理解できる //タートルmを使ってn角星形の 1部を描く。辺長は 2*radius。steps回の分割のi回目。 static void star. Step(Turtle m, int radius, int steps, int n, int i) { if (i % (steps/n) == 0) { m. rt(360*2/n); } //(steps/n)回に一度回転 m. fd(2*n*radius/steps); } // turtle 0とturtle 1をm: nに内分した位置へturtle 2を移動する static void move. To. Div. Point(Turtle turtle 0, Turtle turtle 1, int m, int n, Turtle turtle 2) { turtle 2. move. To(div. Point(turtle 0. get. X(), turtle 1. get. X(), m, n), div. Point(turtle 0. get. Y(), turtle 1. get. Y(), m, n), 0); } // x 0とx 1をm: nに内分した値を求める static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n+x 1*m)/(m+n); } } 6 計算機プログラミングI (増原) 2003年度
クラスメソッドの利用―具体例 • Morphingのプログラム public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; // 分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); // フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); } } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); for (int i = 1; i < n. Turtles - 1; i++) { //i 番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i* hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } } 7 計算機プログラミングI (増原) 2003年度
クラスメソッドの利用―具体例 //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 • Morphingのプログラム hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; // 分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); // フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); } } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); for (int i = 1; i < n. Turtles - 1; i++) { //i 番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i* hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } } 0 番目と (n. Turtles-1)番目の タートルの X 座標を i: (n. Turtles-1 -i)に内分する座標 => これをメソッドにする 8 計算機プログラミングI (増原) 2003年度
クラスメソッドの利用―呼び出し hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); 使用前 hm[i]. move. To(div. Point(hm[0]. get. X(), hm[n. Turtles-1]. get. X(), i, (n. Turtrles-1 -i), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n + x 1*m)/(m+n); クラスメソッド } 定義 呼び出し 使用後 11 計算機プログラミングI (増原) 2003年度
クラスメソッドの利用―呼び出し hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), 本当はMix. div. Point( hm[0]. get. X(), hm[n. Turtles-1]. get. X(), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) i, (n. Turtrles-1 -i) だが、同じクララスの場合は省略可 + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); 使用前 hm[i]. move. To(div. Point(hm[0]. get. X(), hm[n. Turtles-1]. get. X(), i, (n. Turtrles-1 -i), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n + x 1*m)/(m+n); クラスメソッド } 定義 呼び出し 使用後 12 計算機プログラミングI (増原) 2003年度
クラスメソッドによる整理 まとめ // 円と星を描き、その間を補完する public class Mix 4 { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 4; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); Turtle[] hm = create. Turtles(n. Turtles, radius, f); //タートルを作り配置 hm[n. Turtles - 1]. lt(360/star. Edges); //星形の最初の向きを変えておく public class Mix { public static void main(String[] args) { int radius = 100; //円の半径 int n. Turtles = 5; //図形の数(含円と星) int star. Edges = 5; //星の角数 int steps = 30; //分割数 //タートルを表示するフレームを作る Turtle. Frame f = new Turtle. Frame(radius*2*n. Turtles, radius*2); for (int step = 0; step < steps; step++) { circle. Step(hm[0], radius, steps); //円を描く star. Step(hm[n. Turtles-1], radius, steps, star. Edges, step); //星形を描く Turtle[] hm = new Turtle[n. Turtles]; for (int i = 0; i < n. Turtles; i++) { hm[i] = new Turtle(2*radius*i, radius, 0); f. add(hm[i]); //フレームに表示する } hm[n. Turtles - 1]. lt(360/star. Edges); } //n匹のタートルの配列を作って返す。 static Turtle[] create. Turtles(int n, interval, Turtle. Frame f){ Turtle[] hm = new Turtle[n]; for (int i = 0; i < n; i++) { hm[i] = new Turtle(2*interval*i, interval, 0); f. add(hm[i]); } return hm; } for (int step = 0; step < steps; step++) { hm[0]. fd((int)(Math. PI*2*radius/steps)); hm[0]. rt(360/steps); if (step % (steps/star. Edges) == 0) hm[n. Turtles - 1]. rt(360*2/star. Edges); hm[n. Turtles - 1]. fd(10*radius/steps); } } for (int i = 1; i < n. Turtles - 1; i++) { //i: (n. Turtles-1 -i) の内部点にi番目のタートルを移動 move. To. Div. Point(hm[0], hm[n. Turtles-1], i, n. Turtles-1 -i, hm[i]); } //タートルmを使って半径radiusの正steps角形の 1辺を描く static void circle. Step(Turtle m, int radius, int steps) { m. fd((int)(Math. PI*2*radius/steps)); m. rt(360/steps); } for (int i = 1; i < n. Turtles - 1; i++) { //i番目のタートルを i: (n. Turtles-1 -i) の内分点に移動 hm[i]. move. To(i*hm[n. Turtles - 1]. get. X() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. X() / (n. Turtles-1), i*hm[n. Turtles - 1]. get. Y() / (n. Turtles-1) + (n. Turtles-1 -i)*hm[0]. get. Y() / (n. Turtles-1), 0); } 1つ 1つは 短くなる → バラバラに 理解できる 計算機プログラミングI (増原) 2003年度 //タートルmを使ってn角星形の 1部を描く。辺長は 2*radius。steps回の分割のi回目。 static void star. Step(Turtle m, int radius, int steps, int n, int i) { if (i % (steps/n) == 0) { m. rt(360*2/n); } //(steps/n)回に一度回転 m. fd(2*n*radius/steps); } // turtle 0とturtle 1をm: nに内分した位置へturtle 2を移動する static void move. To. Div. Point(Turtle turtle 0, Turtle turtle 1, int m, int n, Turtle turtle 2) { turtle 2. move. To(div. Point(turtle 0. get. X(), turtle 1. get. X(), m, n), div. Point(turtle 0. get. Y(), turtle 1. get. Y(), m, n), 0); } // x 0とx 1をm: nに内分した値を求める static int div. Point(int x 0, int x 1, int m, int n) { return (x 0*n+x 1*m)/(m+n); } } 13
問題解決の方法 問題 問題の分割・・・ 問題 問題 アルゴリズムの 考案・当てはめ アルゴ リズム 問題 問題 アルゴ リズム /** 2002年 10月31日の曜日を計算する */ public class Weekday. Methods { public static void main(String[] args) { // 1900年 1月1日から目的の日までの日数を計算し、daysに代入 int days = count. Days(); int day. Of. Week = days%7; // 0: 日曜日. . 6: 土曜日 System. out. println("曜日は"+day. Of. Week); } プログラム /** 1900年 1月1日から目的の日までの日数 */ public static int count. Days() { int d = 0; loop: for (int year = 1900; year <= 2002; year++) { for (int month = 1; month <= 12; month++) { // year年month月の日数を計算しdays. Of. Monthに代入 int days. Of. Month = days. Of. Month(year, month); for (int date = 1; date <= days. Of. Month; date++) { d++; // 目的の日になったら繰返し全体を終了する if (year==2002 && month==10 && date == 31) break loop; // 4. 5節参照 } } return d; //数えた日数を返す /** y年m月の日数 */ public static int days. Of. Month(int y, int m) { int days; if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) days = 31; //大の月 else if (m==4 || m==6 || m==9 || m==11) days = 30; //小の月 else if (is. Leap. Year(y)) days = 29; //閏年の 2月 else 計算機プログラミングI (増原) 2003年度 15
アルゴリズム 1のプログラム public class GCD { public static void main(String[] args){ int a = 12, b = 21; int last. Common. Divisor = 0; // 一番最近に見つかった公約数 for (int i = 1; i <= a; i++) { if (iはa, bの公約数? ) { last. Common. Divisor = i; // iは公約数なので覚える } } System. out. println(last. Common. Divisor); } } 18 計算機プログラミングI (増原) 2003年度
アルゴリズム 1のプログラム public class GCD { public static void main(String[] args){ int a = 12, b = 21; int last. Common. Divisor = 0; // 一番最近に見つかった公約数 iはaの約数 && iはbの約数 for (int i = 1; i <= a; i++) { if (iはa, bの公約数? ) { last. Common. Divisor = i; // iは公約数なので覚える } } System. out. println(last. Common. Divisor); } } 19 計算機プログラミングI (増原) 2003年度
アルゴリズム 1のプログラム public class GCD { public static void main(String[] args){ int a = 12, b = 21; int last. Common. Divisor = 0; // 一番最近に見つかった公約数 iはaの約数 && iはbの約数 for (int i = 1; i <= a; i++) { a%i == 0 if (iはa, bの公約数? ) { last. Common. Divisor = i; // iは公約数なので覚える } } System. out. println(last. Common. Divisor); } } 20 計算機プログラミングI (増原) 2003年度
アルゴリズム 2のプログラム public class GCD 2 { public static void main(String[] args){ int a = 12, b = 21; int i = a; while (! iはa, bの公約数) i--; System. out. println("最大公約数は" + i); } } 22 計算機プログラミングI (増原) 2003年度
- Slides: 29