绘制超出图像边界的图表点会出现一些计算错误
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 是最大距离远离基点。最终结果是:
下面是我的代码,用于在空白图像上绘制图表。 问题是 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 是最大距离远离基点。最终结果是: