Java Swing GUI for equation 5((θ/β) - cos(2πθ/β))



我正在尝试使用Java Swing为数学方程5((θ/β) - cos(2πθ/β))创建一个GUI

最初,我开始使用一个简单的余弦函数并创建了GUI,并且它工作正常。这是我的余弦函数程序:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SimpleCosWave extends JFrame {
    public SimpleCosWave() {
        setLayout(new BorderLayout());
        add(new CosGraph(), BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        SimpleCosWave frame = new SimpleCosWave();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setTitle("SineWave");
    }
    class CosGraph extends JPanel {
        public void paintComponent(Graphics g) {
            int xBase = 100;
            int top = 100; 
            int yScale = 100;
            int xAxis = 360; 
            int yBase = top + yScale;
            int x, y;
            g.drawLine(xBase, top, xBase, top + 2 * yScale);
            g.drawLine(xBase, yBase, xBase + xAxis, yBase);
            g.setColor(Color.red);
            for (int i = 0; i < xAxis; i++) {
                x = xBase + i;
                y =  yBase - (int) Math.cos(Math.toRadians(i)) * yScale;
                g.drawLine(x,y,x,y);
            }
        }
    }
}

该程序运行良好,我可以在摆动 GUI 上获取 cos 图。

现在我正在尝试扩展该程序以支持等式 - 5((θ/β) - cos(2πθ/β)) θ范围从0 to 360 degreesβ的值到0 < β < 360

我已经更改了上面的代码来计算y坐标以支持这个方程,如下所示:

y =  yBase - getValue(i) * yScale;

这里的getValue方法是:

private int getValue(int theta) {
            int beta = 45;
            double b = (theta/beta);
            double angle = 2*Math.PI*(b);
            double c = Math.cos(angle);
            double result = 5*(b-c);
            return (int)result;
        }

当我进行此更改时,我没有得到任何正确的图形或波浪,而是得到一条水平线。

有人可以帮助我在此代码中犯错的地方吗?

正如 Wim Delauwe 指出的那样,当将 int 除以 int 时,您正在执行整数除法。 例如,45 / 90 会导致 int 值为零。 但是,45.0 / 90.0计算结果为 0.5 的双精度值。 如果其中一个操作数是双精度数,则另一个操作数被强制转换为双精度数,因此45 / 90.0也将产生 0.5。

同样,由于值的范围内相对较小,因此在计算出与该值对应的确切像素之前,不应将值截断为整数,以保持精度。 因此,getValue应具有双精度的返回类型,并且它应返回result而不强制转换它。

然后,在绘图代码中,您将执行强制转换:

y = yBase - (int) (getValue(i) * yScale);

然而,正如David Wallace指出的那样,getValue(i)似乎返回的值大约在-5到+43之间。 将这些值乘以yScale将创建一个非常垂直拉伸的图形。

您可以硬编码规范化:

y = yBase - (int) (getValue(i) / 43.0 * yScale);

我会选择计算最大的 y 值,并通过以下方式对它们进行规范化:

double maxY = 0;
for (int i = 0; i < xAxis; i++) {
    maxY = Math.max(maxY, Math.abs(getValue(i)));
}
for (int i = 0; i < xAxis; i++) {
    x = xBase + i;
    y = yBase - (int) (getValue(i) / maxY * yScale);
    g.drawLine(x,y,x,y);
}

替换:

double b = (theta/beta);

double b = (theta/(double)beta);

看看这是否有帮助。

有关详细信息,请参阅如何使 2 个整数的除法产生浮点数而不是另一个整数?

最新更新