这是我在此发布的上一个问题的扩展 - Java Swing GUI for equation 5((θ/β) - cos(2πθ/β))
我已根据帖子中提供的答案实现了Java程序,这是我的程序:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DisplacementFunctionNew extends JFrame {
public DisplacementFunctionNew() {
setLayout(new BorderLayout());
add(new CosGraph(), BorderLayout.CENTER);
}
public static void main(String[] args) {
DisplacementFunctionNew frame = new DisplacementFunctionNew();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(6000, 6000);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setTitle("SineWave");
}
class CosGraph extends JPanel {
public void paintComponent(Graphics g) {
int graphHeight = 5; // Declared this to set the height of graph based on the value given here.
super.paintComponent(g);
int xBase = 100;
int top = 100;
int yScale = 100;
int xAxis = 360;
int yBase = top + yScale;
g.drawLine(xBase, top, xBase, top + 2 * yScale);
g.drawLine(xBase, yBase, xBase + xAxis, yBase);
g.setColor(Color.red);
double maxY = 0;
for (int i = 0; i < 360; i++) {
maxY = Math.max(maxY, Math.abs(getValue(i)));
}
int x, y;
for (int i = 0; i < 360; i++) {
x = xBase + i;
y = yBase - (int) (getValue(i)*graphHeight / maxY * yScale);
g.drawLine(x, y, x, y);
}
}
private double getValue(int theta) {
int beta = 45;
double b = (theta / (double) beta);
double angle = 2 * Math.PI * (b);
double c = Math.cos(angle);
double s = (b - c);
return s;
}
}
}
现在在这个程序中,我希望有一个名为graphHeight
的变量,它有助于增加图形的高度。如果我将变量的值赋予1
,那么我可以看到如下输出:
现在,如果我尝试将高度增加到5
,那么我得到图表但是没有显示平滑或连续的曲线,我得到这样的输出:
有人可以帮助我如何使输出变得平滑连续曲线吗?
答案 0 :(得分:3)
您正在使用点绘制曲线。您在x轴上的每个位置放置一个点 - 这是有意义的。
当图形较小时,它看起来很好,因为这些点的y分离相对较小。但是,随着图形尺寸的增加,这个缺陷会变得更加明显。
这里的解决方案是用线条填充垂直空间。您可以通过以下几种方式确切实现此目的:
x(i), y(i)]
到[x(i+1),y(i+1)]
画一条线 - 这很容易,但可能看起来不像你想要的那样。x(i), y(i)]
到[x(i),y(i+1)]
画一条线 - 这仍然很简单,但它不会很正确:你继续向上,这样你就可以整个像素关闭。x(i), y(i)]
到[x(i),(y(i)+y(i+1))/2]
,然后从[x(i+1), (y(i)+y(i+1))/2]
到[x(i+1),y(i+1)]
画一条线 - 这是1应该做的(忽略抗锯齿),并且将是您最可能的选择。我建议使用数字3.请注意,您可以使用以下形式的循环来实现:
int lastY = yBase - (int) (getValue(0)*graphHeight / maxY * yScale);
for (int i = 1; i < 360; i++) {
x = xBase + i;
y = yBase - (int) (getValue(i)*graphHeight / maxY * yScale);
g.drawLine(x-1, lastY, x-1, (y+lastY)/2);
g.drawLine(x, (y+lastY)/2, x, y);
}
如果一个像素重叠困扰你,你可以使它更复杂,使第二行从+/- 1像素开始(取决于函数是增加还是减少)。
或者,您可以通过手动绘制线来实现数字3,使用for循环,并基本上编写Bresenham的线算法的特例版本。
答案 1 :(得分:0)
您使用graphHeight
来定义要使用g.drawLine(x, y, x, y);
绘制的下一个点的y。绘制点之间的距离将与graphHeight
变量