目次へ

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

}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp