import java.applet.*; import java.awt.*; import java.awt.event.*; /* */ public class M0103225_4 extends Applet { static int WIDTH, HEIGHT; // 画面サイズ Point point[][]; // 制御点 int point_num = 0; // 制御点の番号 boolean capture_mode_FLG; // 線を制御できるかを表すフラグ static final int point_data[][][] = { //制御点 { {0, 0}, {-14, -16}, {-32, -20}, {-6, -2}, {-6, +2}, {-40, 20}, {-20, 24}, {0, 0} }, { {-12, 11}, {-26, 30}, {-8, 20}, {-14, 44}, {0, 0} } }; Graphics offg, backg; Image offi, backi; public void initialize()// 制御点の設定 { int i; point = new Point[point_data.length][]; for(i = 0; i < point.length; i++) { point[i] = new Point[point_data[i].length]; for(int j = 0; j < point_data[i].length; j++) point[i][j] = new Point(point_data[i][j][0], point_data[i][j][1]); } } public void init() { WIDTH = 800; HEIGHT = 600; initialize();//制御点の設定 offi = createImage(WIDTH, HEIGHT); offg = offi.getGraphics(); backi = createImage(WIDTH, HEIGHT); backg = backi.getGraphics(); setBackImage(backg); // テスト addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent ke) { int c = ke.getKeyCode(); if(c == 'P'){ System.out.println("{"); for(int i = 0; i < point[point_num].length; i++) System.out.println(""+point[point_num][i].x +", "+point[point_num][i].y); System.out.println("},"); } else if(c == 'B'){ repaint(); } } }); } public void setBackImage(Graphics g) // 背景の用意 { g.setColor(Color.white); g.fillRect(0, 0, WIDTH, HEIGHT); g.setColor(Color.black); g.drawRect(0, 0, WIDTH-1, HEIGHT-1); // 枠描画 } public int kaijyo(int num) // 階乗を計算 { int total = 1; if(num == 0) return 1; for(; num > 1; num--) total *= num; return total; } public void BezierCurve(Graphics g, Color color, Point point[]) // 曲線計算 { int i, j; double x1, x2, y1, y2, x3, x4, y3, y4 =0; double xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4 = 0; double bernstein[] = new double[point.length]; x1 = point[0].x; y1 = point[0].y; g.setColor(color); for(double t = 0; t <= 1; t += 0.01) { for(i = 0; i < point.length; i++) // bernstein関数を計算 { bernstein[i] = (double)kaijyo(point.length-1) / (kaijyo(i)*kaijyo(point.length-1-i)); for(j = 1; j <= i; j++) bernstein[i] *= t; for(j = 1; j <= point.length-1-i; j++) bernstein[i] *= (1-t); } x2 = y2 = 0; for(i = 0; i < point.length; i++) { x2 += point[i].x * bernstein[i]; y2 += point[i].y * bernstein[i]; } x3 = -1 * x1; x4 = -1 * x2; y3 = -1 * y1 + 44; y4 = -1 * y2 + 44; for(int k = 0; k < 21; k++){ for(int l = 0; l < 13; l++){ xx1 = x1 + 40*k; yy1 = y1 + 50*l; xx2 = x2 + 40*k; yy2 = y2 + 50*l; xx3 = x3 + 40*k; yy3 = y3 + 50*l; xx4 = x4 + 40*k; yy4 = y4 + 50*l; g.drawLine((int)xx1, (int)yy1, (int)xx2, (int)yy2); g.drawLine((int)xx3, (int)yy1, (int)xx4, (int)yy2); g.drawLine((int)xx1, (int)yy3, (int)xx2, (int)yy4); g.drawLine((int)xx3, (int)yy3, (int)xx4, (int)yy4); } } x1 = x2; y1 = y2; } } public void paint(Graphics g) { requestFocus(); offg.drawImage(backi, 0, 0, this); // 背景の描画 if(capture_mode_FLG) // 制御点の描画 { offg.setColor(Color.red); for(int i = 0; i < point[point_num].length; i++) { offg.fillRect(point[point_num][i].x-3, point[point_num][i].y-3, 7, 7); offg.drawString(Integer.toString(i+1), point[point_num][i].x-3, point[point_num][i].y-6); } } for(int i = 0; i < point.length; i++) // 曲線描画 { if(capture_mode_FLG && point_num == i) BezierCurve(offg, Color.blue, point[i]); else BezierCurve(offg, Color.black, point[i]); } g.drawImage(offi, 0, 0, this); } public void update(Graphics g) { paint(g); } }