绘制超出图像边界的图表点会出现一些计算错误

plotting chart points going out of image bounds some calculation error

下面是我的代码,用于在空白图像上绘制图表。 问题是 getY() returns 超出图像高度范围的点 就是这一行:

yy= mid + ((basePoint - val)*5);
evaluates to:
( 150 + ((90.0f - 92.0f)*5) );
( 150 + ((90.0f - 89.25f)*5) );
( 150 + ((90.0f - 89.0f)*5) );
and so on...
( 150 + ((90.0f - 127.0f)*5) );

当达到这个高范围127.0f时,坐标全部超出图像边界。

如果我减少 (*5),那么差异很小的点看起来就像在一条直线上,比如:89.0f 和 89.25f 将形成一条直线,但我希望 89.25f 到比89.0f高一点,可见差异。

我能否将该计算更改为其他内容,使其始终保持在图像边界内?即使 127.0f 超过 150.0f?

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.imageio.*;
import javax.imageio.stream.*;


class plotChart{

int w= 1400;
int h= 300;
BufferedImage chart = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB );

Integer mid = h/2;
Float basePoint = 0.0f;

public Integer getY( Float val ){
Integer y;
Float yy;

yy= mid + ((basePoint - val)*5);
y= yy.intValue();

return y;
}//method end getY

public static void main( String[] args ){
plotChart pp= new plotChart();


Float[] f={ 90.0f, 92.0f, 89.25f, 94.0f, 97.0f, 99.0f, 102.0f, 110.0f, 115.0f, 120.0f, 125.0f, 127.0f, 130.0f, 60.35f, 64.0f, 70.0f, 74.15f, 74.0f, 75.50f, 88.0f  };

Graphics2D gg= pp.chart.createGraphics();
BasicStroke bs = new BasicStroke(3);
gg.setStroke(bs);

Integer x=0; Integer y= pp.mid;
Integer xx, yy;

pp.basePoint = f[0];

for(int i=0; i<f.length; ++i){

xx= i * 20;
yy= pp.getY( f[i] );

gg.drawLine( x, y, xx, yy );

x=xx; y=yy;

//try{ ImageIO.write( pp.chart, "png", new FileOutputStream( "ppChart.png") ); }catch(Exception e){ e.printStackTrace(); }


}//for


gg.dispose();

try{
ImageIO.write( pp.chart, "png", new FileOutputStream( "ppChart.png") );
}catch(Exception e){ e.printStackTrace(); }

}//main ends
}//class ends

一种方法是使图形触及图像的顶部。为此,您需要获取距 basePoint 最远的值,并将浮点值添加到 class "plotChart"(我使用 "diff")。此代码将在您设置 basePoint 后立即执行:

float max = f[0];
for (float fl : f){
    if (fl>max){
        max = fl;
    }
}
float min = f[0];
for (float fl : f){
    if (fl<min){
        min = fl;
    }
}
float maxdiff = max-pp.basePoint;
float mindiff = pp.basePoint-min;
float diff;
if (maxdiff>mindiff){
    diff = maxdiff;
} else {
    diff = mindiff;
}
pp.diff = diff;

那么你需要修改getY()中的代码:

yy= mid + (((basePoint - val)/diff)*mid);

这将使您的图表大小基于图像的大小,因为我们知道 basePoint-val 的绝对值将始终介于 0 和 diff 之间(除了 diff 时),因为 diff 是最大距离远离基点。最终结果是: