方程式5的Java Swing GUI(θ;/β;)-cos(2π;θ;/β;)-绘制连续图
这是我在这里发布的上一个问题的扩展-- 我已经根据帖子中提供的答案实现了Java程序,下面是我的程序:方程式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
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)]
——这是我应该做的事情(忽略消除混叠),也是最正确的选择 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
后,程序也工作了。