0

您好,我正在尝试创建一个 Java 程序,该程序允许您绘制方程,并且到目前为止它运行良好,直到我希望它绘制余弦和正弦函数。当正弦和余弦返回双倍但 drawLine 只接受整数时,我对如何做到这一点感到困惑。我是java新手,所以这可能很容易,但如果你能提供帮助,我将不胜感激。

这是我的代码:

import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;
import java.lang.Math;
import java.awt.geom.*;

class PlotGraph extends JFrame{


public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g;

    g.drawLine(50, 300, 550, 300); //x axis
    g.drawLine(300, 550, 300, 50); //y axis
    //Orignin x = 300 y = 300

    double xmin, xmax;
    double y;
    xmin =(0);
    xmax = 100;
    double x = xmin;

    double form = Math.cos(x);

    double last_y = 300-(form);

    for (x = xmin+1; x<=xmax; x++){
    double newForm = Math.cos(x);
    y = 300-(newForm);
    g2.draw(new Line2D.Double(x-1+(300), last_y, x+300, y));
    last_y = y;

    }




}

public static void main(String [] args) {

    PlotGraph graph = new PlotGraph();
    graph.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    graph.setSize(600, 600);
    graph.setVisible(true); 
    graph.setTitle("PlotGraph");

}
}
4

4 回答 4

2

由于 Math.cos() 返回一个介于 -1 和 1 之间的值,因此转换为 int 将只产生 3 个值 -1、0 和 1,并且几乎总是为 0。

你想要做的是将双精度乘以一个大常数来创建一个整数范围:

    y = 300-(int)(300d * newForm);

注意 300 之后的“d”:这使得 300 成为双倍,如果乘法也加倍,则结果会加倍,这保持了精细的粒度。

于 2013-03-10T07:37:32.177 回答
1

使用 Line2D.Double 对象,一个 Graphics2D Graphics 对象,并让 Graphics2D 对象使用其draw(...)方法绘制形状。

于 2013-03-10T07:36:41.727 回答
0

尝试将 double 转换为 int。

int y = 300 - (int) (Math.cos(x) * scaleFactor);

正如 Aiias 所说:cos 只会返回 -1 和 1 之间的值。因此,请确保将其乘以一个常数因子,否则在转换后您将丢失该值。

于 2013-03-10T07:34:33.623 回答
0

正确缩放后,您可以尝试以下任一方法:

  • 类型转换doubleintint i = (int)d;

  • 四舍五入,它返回long必须通过类型转换为intint i = (int)Math.round(d);

于 2013-03-10T07:35:30.220 回答