Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方程式5的Java Swing GUI(θ;/β;)-cos(2π;θ;/β;)-绘制连续图_Java_Swing - Fatal编程技术网

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

方程式5的Java Swing GUI(θ;/β;)-cos(2π;θ;/β;)-绘制连续图,java,swing,Java,Swing,这是我在这里发布的上一个问题的扩展-- 我已经根据帖子中提供的答案实现了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 { publi

这是我在这里发布的上一个问题的扩展--

我已经根据帖子中提供的答案实现了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;
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类置换函数新扩展JFrame{
公共流离失所功能新的(){
setLayout(新的BorderLayout());
添加(新CosGraph(),BorderLayout.CENTER);
}
公共静态void main(字符串[]args){
位移函数新框架=新位移函数新();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架设置尺寸(6000,6000);
frame.setVisible(true);
frame.setLocationRelativeTo(空);
帧。设置标题(“正弦波”);
}
类余图扩展了JPanel{
公共组件(图形g){
int-graphHeight=5;//声明此选项以根据此处给定的值设置图形的高度。
超级组件(g);
int xBase=100;
int top=100;
int yScale=100;
int-xAxis=360;
int yBase=top+yScale;
g、 抽绳(xBase,顶部,xBase,顶部+2*yScale);
g、 抽绳(xBase、yBase、xBase+xAxis、yBase);
g、 setColor(Color.red);
双最大值=0;
对于(int i=0;i<360;i++){
maxY=Math.max(maxY,Math.abs(getValue(i));
}
int x,y;
对于(int i=0;i<360;i++){
x=xBase+i;
y=yBase-(int)(getValue(i)*图形高度/最大y*yScale);
g、 抽绳(x,y,x,y);
}
}
私有双getValue(intθ){
intβ=45;
双b=(θ/(双)β);
双角度=2*Math.PI*(b);
双c=数学cos(角度);
双s=(b-c);
返回s;
}
}
}
现在在这个程序中,我想要一个名为
graphHeight
的变量,它有助于增加图形的高度。如果将变量的值设为
1
,则可以看到如下输出:

现在,如果我尝试将高度增加到
5
,那么我会得到图形,但它不是平滑或连续的曲线,我会得到如下输出:


有人能帮助我如何获得平滑连续曲线的输出吗?

您可以使用
graphHeight
定义下一个要绘制的点的y。绘制线(x,y,x,y)。绘制的点之间的距离将与使用点绘制曲线时的
图形高度
变量

有关。您将在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)]
    ——这是我应该做的事情(忽略消除混叠),也是最正确的选择
  • 我建议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);
    
            }
    
    intlasty=yBase-(int)(getValue(0)*图形高度/maxY*yScale);
    对于(int i=1;i<360;i++){
    x=xBase+i;
    y=yBase-(int)(getValue(i)*图形高度/最大y*yScale);
    g、 抽绳(x-1,拉丝,x-1,(y+拉丝)/2);
    g、 抽绳(x,(y+lastY)/2,x,y);
    }
    
    如果一个像素重叠困扰您,您可以使其更复杂一些,以便第二行从+/-1像素开始(取决于函数是增加还是减少)



    或者,您可以通过使用for循环手动绘制线来实现编号3,基本上写一个Bresenham直线算法的特例版本。

    你需要将间隔改为一个较小的数量。最简单的方法是:用直线连接点。@气垫船不会画出平滑的曲线,尽管它会在屁股上涂上油漆,但是你可以用导数来创建小的切线。仅仅用三次曲线来绘制线段是不可行的,这样的函数可能看起来很好,很平滑,但可能是“错误的”。增加点的数量(使其大于像素的数量)也不切实际。我认为最明智的方法是计算像素x坐标的世界x坐标,计算对应的y像素坐标的世界y坐标。在中插入函数看起来“很好”,并且经过合理的努力效果也很好,我想。我可以使用其他选项增加图形高度吗?我想你可以按照Malik的建议“将间隔更改为较小的数量”你可以指定如何操作吗,当我将I的值更改为以0.5或0.75的间隔递增时,则输出中没有任何图形。感谢您的明确解释,在我在您的答案的for循环中添加了缺少的行,即
    lastY=y
    后,程序也工作了。