当前位置: 首页 > 知识库问答 >
问题:

在java中绘制sin(x)的图形

乔望
2023-03-14

我目前正在尝试用java绘制sin(x)的图形。作业说明要求我只使用drawLine()作为绘制图形的方法。我似乎不知道如何正确设置y值。现在我有一个while循环,用于逐个像素绘制线,但无法获得正确的y值。这是我目前所掌握的。

public class GraphJComponent extends JComponent {
public void paintComponent (Graphics g){
    Color axis = new Color(128, 128, 128);
    g.setColor(axis);

    int xShift = getWidth() / 50;
    int xShift2 = getWidth() / 100;
    int yShift = getHeight() / 10;
    int yShift2 = getHeight() / 17;

    g.drawLine(xShift,yShift,xShift,getHeight() - yShift);
    g.drawLine(xShift, getHeight() / 2, getWidth() - xShift, getHeight() / 2);

    g.drawString("0", xShift + xShift2, getHeight() / 2 + yShift2);
    g.drawString("1", xShift + xShift2, yShift - (yShift2 / 4));
    g.drawString("-1", xShift + xShift2, getHeight() - yShift + yShift2);
    g.drawString("\u03c0", getWidth() / 2, getHeight() / 2 + yShift2);
    g.drawString("2" + "\u03c0", getWidth() - (2 * xShift), getHeight() / 2 + yShift2);

    Color line = new Color (255, 0, 0);
    g.setColor(line);

    int x = xShift;
    int y = getHeight() / 2;




    while (x < getWidth() - xShift){
        x += 1;

        y = ??;


        g.drawLine(x, y, x, y);
    }










}

}

是的,我知道有很多事情我可以整理或简化,这只是一个粗略的草稿,本身,一旦我一切正常,我会清理。我已经尝试了多种方法来正确设置 y 值,我得到的最接近的方法最终绘制了一条直线对角线,它不像它应该的那样弯曲。我该怎么做才能正确设置 y 值,以便正确绘制 [0, 2pi] 中的正弦图?

尝试澄清问题:问题在于更改我的 drawLine 函数的 y 值。基本上,我所做的工作不会正确地绘制罪恶函数,因为我只能弄清楚线性增加它。它看起来像这样:

 /\
/  \  /
    \/

我的最终问题是:我怎样才能使它的y坐标与罪(x)图的适当y坐标成比例?换句话说,我怎样才能使它“不直”并像罪(x)图应该的那样适当弯曲。

另一种看待问题的方法是,我如何用JFrame的像素适当地“缩放”sin(x)的y值?谢谢你的时间,我感谢你的帮助。

共有2个答案

袁山
2023-03-14

这是代码,它不仅可以绘制sin(x)图,还可以使用外部解析器绘制任何图。

      import javax.swing.*;
      import java.awt.*;
      import java.util.Scanner;
      import net.objecthunter.exp4j.*;

     class math extends JFrame
     {
        public static void main(String args[])
      {
    math m=new math();
    m.setVisible(true);
    m.setLocationRelativeTo(null);


}

public void paintallies(Graphics G1,double sf)
{int i;
 Graphics2D g21=(Graphics2D) G1;
 g21.setColor(Color.GREEN);
    for(i=0;i<=600;i=(int) (i+sf))
    {
        g21.drawLine(i,0,i,600);
        g21.drawLine(0,i,600,i);

    }

}
public void paintaxes(Graphics G1)
{
    Graphics2D g21=(Graphics2D) G1;
    g21.setColor(Color.BLACK);
    g21.drawLine(300,0,300,600);//y axis

    g21.drawLine(0,300,600,300); //x axis

}


public void paint(Graphics G)
{
    int i;
    double j,k;

    Scanner s=new Scanner(System.in);
    System.out.println("Enter input");
    String input=s.nextLine();
    System.out.println("Enter scale factor");
    double sf=s.nextDouble();
    double sff=300/sf;
    double kf=sff;
    double count=0;






    Graphics g2=(Graphics) G;
    paintallies(G,sf);
    paintaxes(G);

    g2.translate(300,300);
    do
    {
        kf=kf-(1/sf);
        count++;

    }while(kf>=0);
    double counts=2*count;


    Color c=Color.RED;
    g2.setColor(c.darker());

    double yarr[]=new double[(int)counts];
    double xarr[]=new double[(int)counts];



    Expression E=new ExpressionBuilder(input).variables("x").build();


     j=-sff; k=-sff;
    for(i=0;i<counts;i++)
    {

        xarr[i]=j;
        j=j+(1/sf);


        E.setVariable("x",k);
        yarr[i]=E.evaluate();
        k=k+(1/sf);

        xarr[i]=sf*xarr[i];
        yarr[i]=-sf*yarr[i];

    }

    for(i=0;i<counts;i++)
    {
        if(i==counts-1)
        {
            break;
        }
        else
        {
        g2.drawLine((int)xarr[i],(int)yarr[i],(int)xarr[i+1],(int)yarr[i+1]);

        }
    }


}






math()
{
    super("Grapher");
    setSize(600,600);
    setResizable(true);



}

}

郭修平
2023-03-14

好吧,David Wallace在评论中提到您需要减少x增量,但我认为您正在尝试在整个宽度间隔内获得2*PI

使用y=Math.sin(x*Math.PI*2/getWidth()),它将缩放x值,然后将它们插入sin函数。

 类似资料:
  • sin() 方法 sin() -- 返回数的正弦值 语法: Math.sin( x ); 参数说明: x -- Number 类型的弧度( 将角度乘以 0.017453293 (2PI/360)即可转换为弧度 )。 返回值: x 的正弦值。返回值在 -1.0 到 1.0 之间。 示例: console.log( Math.sin( 2 ) ); console.log( Math.s

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我想用Java绘制图形(节点和边)。但是,由于我不知道该怎么做,因此在开始之前我想寻求一些建议。 我应该怎么做? 使用Graphics2D包,对吗? 节点的标签怎么样?我应该使用诸如drawString之类的东西并手动处理所有“

  • 描述 (Description) C库函数double sin(double x)返回弧度角x的正弦值。 声明 (Declaration) 以下是sin()函数的声明。 double sin(double x) 参数 (Parameters) x - 这是浮点值,表示以弧度表示的角度。 返回值 (Return Value) 此函数返回x的正弦值。 例子 (Example) 以下示例显示了sin(

  • 问题内容: 我想在另一幅图像上绘制部分透明的图像(在物体上形成阴影)。我目前正在使用Java的Graphics2D类进行渲染,有人告诉我将合成设置为AlphaComposite,但这仅将其设置为完全透明。 我可以使用当前设置进行此操作吗?我必须怎么做才能解决此问题? 这是我被告知可以使其部分透明的代码: (顺便说一句,我正在使用png图像) 这是您的sscce(它们都在不同的类中,但是为了简单起见

  • 我试图用shap和我的数据作图,但弄错了,我真的不明白为什么。我还没发现这方面的任何东西。请解释如何避免此错误?

  • 问题内容: 我正在开发的Java Swing GUI需要根据程序中生成的x和y坐标绘制2D图形。 为此有一个Swing组件吗? 还是有其他目的的开源软件包? 问题答案: 您应该查看具有Swing支持的JFreeChart。以下是一些示例: http://www.jfree.org/jfreechart/samples.html