Рисование графика sin(x) в Java

В настоящее время я пытаюсь нарисовать график греха (х) в Java. В соответствии с инструкциями моего назначения я должен использовать только drawLine() в качестве метода рисования графика. Я не могу понять, как правильно установить значение у, хотя. Сейчас у меня есть цикл 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 x1 = xShift;
    int y1 = getHeight() / 2;
    int x2 = xShift;
    int y2;
    int yScale = getHeight() / 2;
    int sinInput = 0;




    while (sinInput <= 360){
        x2 += (getWidth() / 360);

        y2 = (yScale - ((int)(Math.sin(sinInput) * yScale)));


        sinInput += 1;
        g.drawLine(x1, y1, x2, y2);

        x1 = x2;
        y1 = y2;

    }










}

}

Да, я знаю, что есть много вещей, которые я мог бы привести в порядок или упростить, это просто черновик, как таковой, который я уберу, как только у меня все заработает. Я попробовал несколько способов получить значение y для правильной установки, самое близкое, что я получил, это нарисовать прямые диагональные линии, оно не было искривлено, как должно было быть. Что я могу сделать, чтобы правильно установить значение y, чтобы график sin из [0, 2pi] был правильно нарисован?

Чтобы попытаться прояснить проблему: Проблема заключается в изменении значения y моей функции drawLine. По сути, то, что я работал, не рисовало бы функцию sin должным образом, потому что я только мог придумать, чтобы линейно увеличивать ее. Это выглядело примерно так:

 /\
/  \  /
    \/

Последний вопрос, который у меня возникает: как я могу сделать так, чтобы моя координата y масштабировалась с правильной координатой y графика sin(x)? Другими словами, как я могу сделать его "не прямолинейным" и правильно изогнутым, как должен делать график sin(x). Спасибо за ваше время, я ценю любую помощь.

Последнее, с чем я играл, это что-то вроде этого: значение координаты y вычисляется путем масштабирования значения греха степени и манипулирования им с определенными коэффициентами, чтобы получить правильную координату пикселя. Я думаю, что это правильный способ сделать это, есть мысли?

Внизу этой страницы вы можете увидеть, как должен выглядеть конечный результат: http://nameless.cis.udel.edu/class_wiki/index.php/CISC181_S2015_Lab3

2 ответа

Попробуйте y= Math.sin(x)*100; И взять шкалу
1 =100 делений Таким образом, вы можете взять десятичные дроби.

Как указал immibis, Math.Sin принимает угол в радианах. Просто конвертируйте ваши градусы в радианы, передавая их в Math.sin, что должно решить вашу проблему.

Math.sin((sinInput * 2 * Math.PI) / 360)
Другие вопросы по тегам