我正在尝试使用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);
}
}
}
}
这个程序工作正常,我可以在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;
}
当我做这个改变时,我没有得到任何正确的图形或波形,而是我得到一条水平线。
在此代码中,有人可以帮我解决我的错误吗?
答案 0 :(得分:3)
替换:
double b = (theta/beta);
与
double b = (theta/(double)beta);
看看这是否有帮助。
有关详细信息,请参阅How to make the division of 2 ints produce a float instead of another int?。
答案 1 :(得分:3)
正如Wim Delauwe所指出的,当用int分割int时,你正在进行整数除法。例如,45 / 90
导致int值为零。但是,45.0 / 90.0
计算为0.5的double值。如果任一操作数是double,则另一个操作数被强制为double,因此45 / 90.0
也将产生0.5。
同样,因为您的值在相对较小的范围内,所以在计算与值对应的确切像素之前,不应将值截断为整数,以保持精度。因此,getValue
的返回类型应为double,并且应该返回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);
}