gpt4 book ai didi

等式 5((θ/β) - cos(2πθ/β)) 的 Java Swing GUI

转载 作者:行者123 更新时间:2023-11-29 06:59:43 33 4
gpt4 key购买 nike

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

最初我开始使用一个简单的余弦函数并创建了 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);
}
}
}
}

这个程序运行良好,我可以在 swing 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 的计算结果为 double 值 0.5。如果其中一个操作数是 double ,则另一个被强制转换为 double ,因此 45/90.0 也将产生 0.5。

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

然后,在您的绘图代码中,您将进行转换:

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

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

你可以硬编码规范化:

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);
}

关于等式 5((θ/β) - cos(2πθ/β)) 的 Java Swing GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075431/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com