解答例 - 実習課題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"; } }