解答例 - 実習課題1 - 7.数値処理/数値の表現
(実習課題1)
横軸は角度、縦軸はコサインおよびサインの値であるグラフを表示するGUIアプリケーションを作成しなさい。横軸の角度は、度数表現にする事。
解答例
package com.techscore.utility.chapter7.exercise1;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
/**
* SinCosGraphExample.java
* TECHSCORE Javaユーティリティ7章 実習課題1
*
* Copyright (c) 2004 Four-Dimensional Data, Inc.
*/
public class SinCosGraphExample extends JFrame {
public SinCosGraphExample(String str) {
super(str);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new DrawGraph(), BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {
SinCosGraphExample frame =
new SinCosGraphExample("TECHSCORE UTILITY CHAP.7 exercise1");
frame.setSize(500, 300);
frame.setVisible(true);
}
class DrawGraph extends JComponent {
//原点を X0,Y0とする。
private int X0 = 30;
private int Y0 = 150;
public void paint(Graphics g) {
Dimension dimension = getSize();
g.setColor(Color.BLACK);
g.fillRect(0, 0, dimension.width, dimension.height);
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.ITALIC, 13));
// X軸とY軸の描画
drawAxis(g);
// 関数の描画
drawFunction(g, new DegreeToCosFunction(), 0, 360, Color.RED);
drawFunction(g, new DegreeToSinFunction(), 0, 360, Color.PINK);
}
/**
* X軸とY軸を描画するメソッド
* ここでは、サイズ等は固定とする。
* @param g
*/
private void drawAxis(Graphics g) {
// x 軸の描画
g.drawLine(X0, Y0, 480, Y0);
g.drawString("x", 420, 165);
// y 軸の描画
g.drawLine(X0, 260, X0, 10);
g.drawString("y", 10, 10);
}
/**
* 関数を描画するメソッド
* @param g
* @param function
* @param x_min
* @param x_max
* @param color
*/
private void drawFunction(
Graphics g,
Function function,
int x_min,
int x_max,
Color color) {
g.setColor(color);
int x[] = new int[x_max - x_min + 1];
int y[] = new int[x_max - x_min + 1];
for (int n = x_min; n <= x_max; n++) {
x[n] = X0 + n;
y[n] = Y0 - (int) (function.f(n) * 100);
}
g.drawPolyline(x, y, 360);
g.drawString(
function.getName(),
x[x.length - 1] + 10,
y[y.length - 1]);
}
}
}
// 関数のインタフェース
interface Function {
public String getName();
public double f(double x);
}
// 度数表現から Cos を返す関数
class DegreeToCosFunction implements Function {
public double f(double x) {
return Math.cos(Math.toRadians(x));
}
public String getName() {
return "cos";
}
}
// 度数表現から Sin を返す関数
class DegreeToSinFunction implements Function {
public double f(double x) {
return Math.sin(Math.toRadians(x));
}
public String getName() {
return "sin";
}
}

