Java 缩放数据以适应像素空间

Java 缩放数据以适应像素空间,java,swing,graph,plot,scaling,Java,Swing,Graph,Plot,Scaling,我有一个数据集,我正在下面的代码中定义的矩形空间中绘制。数据集的长度几乎总是不同于需要绘制数据集的屏幕空间的像素宽度 我的问题是,我需要一种有效的方法将数据集的图形分布到绘图空间的整个宽度上 从下面我发布的代码中可以看出,数据(错误地)绘制在矩形宽度的子集中。如果编译代码并手动重新调整帧大小几次,您将看到相对于蓝色内部矩形宽度的datagraph宽度会随着帧宽度的变化而变化。为了最清楚地说明这一点,下面的代码还绘制了两条绿色垂直线,一条在数据集图形的开头,另一条在末尾。如果代码工作正常,垂直绿线

我有一个数据集,我正在下面的代码中定义的矩形空间中绘制。数据集的长度几乎总是不同于需要绘制数据集的屏幕空间的像素宽度

我的问题是,我需要一种有效的方法将数据集的图形分布到绘图空间的整个宽度上

从下面我发布的代码中可以看出,数据(错误地)绘制在矩形宽度的子集中。如果编译代码并手动重新调整帧大小几次,您将看到相对于蓝色内部矩形宽度的datagraph宽度会随着帧宽度的变化而变化。为了最清楚地说明这一点,下面的代码还绘制了两条绿色垂直线,一条在数据集图形的开头,另一条在末尾。如果代码工作正常,垂直绿线应仅位于蓝色内矩形的开始和结束处,它们之间的尖峰应位于距离蓝色内矩形的开始和结束的适当百分比距离处(30%和70%,分别对应于指数120/400和280/400)。但是,正如您所看到的,第二条绿色垂直线总是不合适,而第一条绿色垂直线似乎总是在其正确的位置,并且数据线的位置相对于(错位的)绿色垂直标记,而不是相对于内部蓝色矩形的左边缘和右边缘正确放置,应与(正确放置的)绿色垂直线重叠

有谁能告诉我如何修复下面的代码,使其在内部蓝色矩形的宽度上均匀分布datagraph的宽度

我认为问题出在hstep变量中,我在下面的DataPanel.java代码中标记了一个地方,我认为问题代码在注释中有所有的大写字母

代码位于以下两个文件中:

DataGUI.java

import java.awt.*;
import javax.swing.*;

class DataGUI{
DataGUI() { 
    JFrame jfrm = new JFrame("X-Y Plot");// Create a new JFrame container.
    jfrm.getContentPane().setLayout(new GridLayout(1,1));// Specify FlowLayout for the layout manager.
    int frameHeight = 500;
    int frameWidth = 767;
    jfrm.setSize(frameWidth, frameHeight);// Give the frame an initial size.
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Terminate program when user closes application.
    int len = 400;
    double[] data = new double[len];
    for(int d=0;d<data.length;d++){
        if(d==120||d==280){data[d]=45;}
        else{data[0]=0;}
    }
    DataPanel myDataPanel = new DataPanel(data);
    jfrm.add(myDataPanel);
    jfrm.setVisible(true);// Display the frame. 
} 

public static void main(String args[]) { 
    // Create frame on event dispatching thread.
    SwingUtilities.invokeLater(new Runnable() {public void run(){new DataGUI();}});
}
}  
import java.awt.*;
导入javax.swing.*;
类DataGUI{
DataGUI(){
JFrame jfrm=newjframe(“X-Y图”);//创建一个新的JFrame容器。
jfrm.getContentPane().setLayout(新的GridLayout(1,1));//为布局管理器指定FlowLayout。
int frameHeight=500;
int frameWidth=767;
jfrm.setSize(frameWidth,frameHeight);//为框架指定初始大小。
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//当用户关闭应用程序时终止程序。
int len=400;
双精度[]数据=新双精度[len];

对于(intd=0;d这基本上就是罪魁祸首:
double-hstep=blueWidth/len;
您在这里将两个
int
s相除,这将再次产生一个整数。为了获得所需的
double
,您必须显式地将例如
len
转换为double,如下所示:
double hstep=blueWidth/(double)len;
。 (也适用于除以numYticks的行)

您的问题是blueWidth和len都是整数,它们的结果将是整数(然后转换为双精度)

相反,尝试

double hstep = ((double)blueWidth)/len;

@泰迪尔发现了这只虫子,或者至少是一个很好的猜测。 如果我这么说,我会拿我的点,缩放并偏移它们。 然后在绘制代码中遍历集合

这种方法的好处是,min和max X和Y为您提供了一个边界矩形,所以最初您只需绘制该矩形,并对缩放/调整大小进行排序,然后绘制点并根据缩放坐标进行装饰

绘制代码调试起来很痛苦,所以我喜欢尽可能多地委托数学运算,并在用装饰将代码弄乱之前对“角”进行排序

当有很多要点时,你也可以聪明地对其进行优化,或者在非常动态的情况下查看“屏幕外”建筑

不是爪哇人。 在给定的条件下,您可以将数据集从youyr集合加载到点集合中,例如

点是两个浮动的结构,称为X和Y 和点是一个有序列表(X)

然后算出界限 只要循环通过min和max Y的点,就已经有了X,因为它们是顺序,所以它只是第一个和最后一个 如果需要的话,将其合理化,即原点为0,0,MaxX=7658,所以称之为8000,MaxY为84,所以称之为100

现在你的点可以被一个矩形(0,08000100)包围 实际高度=100,实际宽度=8000(计算此值,以处理负轴)

在某些情况下,您已经计算出打印区域为755 X 384,原点将打印在30,45

所以XRatio=(双)实际宽度/755,YRatio=

通过实际点循环并生成另一个缩放点列表,添加偏移量,反转Y 然后从点0到1,1到2,n-1到n)画一条线

这都是非常简单的东西,只要把整个图形的绘制分成几个简单的步骤就行了。想想你用一些画纸、尺子和铅笔会怎么做

例如,你可以很容易地计算出你的步幅。 然后使用记号位置和方向确定记号标签的位置。 您可以将您的描述、标题等放在中心位置

诀窍是相对定位

X轴标签从X轴线向下20像素,位于X轴起点和终点之间的中心

不要试图使用绝对坐标在一个循环中完成所有操作


PS首先让它工作起来,然后看看如何变得聪明…

+1谢谢你的建议。有没有一种简单的方法让你提供一些示例代码来说明你所建议的技术?谢谢。我将此标记为答案,因为你比任何人都投入更多。但是,任何读者都可以看到这三个answers是正确的。林德佐,谢谢你。谢谢你帮我解决了这个问题。谢谢你。谢谢你帮我解决了这个问题。
double hstep = ((double)blueWidth)/len;