等式5的Java Swing GUI((θ/β) - cos(2πθ/β)) - 绘制连续图

时间:2015-01-21 21:30:54

标签: java swing

这是我在此发布的上一个问题的扩展 - 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,那么我可以看到如下输出:

enter image description here

现在,如果我尝试将高度增加到5,那么我得到图表但是没有显示平滑或连续的曲线,我得到这样的输出:

enter image description here

有人可以帮助我如何使输出变得平滑连续曲线吗?

2 个答案:

答案 0 :(得分:3)

您正在使用点绘制曲线。您在x轴上的每个位置放置一个点 - 这是有意义的。

当图形较小时,它看起来很好,因为这些点的y分离相对较小。但是,随着图形尺寸的增加,这个缺陷会变得更加明显。

这里的解决方案是用线条填充垂直空间。您可以通过以下几种方式确切实现此目的:

  1. 从[x(i), y(i)][x(i+1),y(i+1)]画一条线 - 这很容易,但可能看起来不像你想要的那样。
  2. 从[x(i), y(i)][x(i),y(i+1)]画一条线 - 这仍然很简单,但它不会很正确:你继续向上,这样你就可以整个像素关闭。
  3. 从[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应该做的(忽略抗锯齿),并且将是您最可能的选择。
  4. 我建议使用数字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变量

相关