急问:Graphics2D画曲线时的截断问题

时间:2022-01-15 11:19:57
我原来的代码是C#的,后来为了移植到Linux,发现必须改用Java。
C#中的Graphics提供了float参数的DrawLine方法,而Java的Graphics2D中没有对应的方法,因此我画出来的曲线出现了截断的状况。
C#的代码片断如下:
private void DrawSig(ArrayList data, float pos, Color c)
{
// draw signal
int i;
float vt = -100.0f, hr = (float)(ClientSize.Width) / (len*1.1f), tmp0, tmp1;
// vt - vertical scale ratio
// hr - horizontal scale ratio
// tmp0 - previous data
// tmp1 - current data
g.TranslateTransform(20, pos);
g.ScaleTransform(hr, vt);
Pen pn = new Pen(c);
tmp0 = (float)(Convert.ToDouble(data[0]));
g.DrawLine(pn, 0, tmp0, 0, tmp0);
for (i = 1; i < org.Count; i++)
{
tmp0 = (float)(Convert.ToDouble(data[i - 1]));
tmp1 = (float)(Convert.ToDouble(data[i]));
g.DrawLine(pn, i - 1, tmp0, i, tmp1);
}
g.ScaleTransform(1 / hr, 1/vt);
g.TranslateTransform(-20, -pos);
}
改成Java后如下:
    private void DrawSig(Graphics2D g, ArrayList<Float> data, float pos, Color c)
    {
        // draw signal
        int i;
        float vt = -100.0f, hr = (float)(getWidth()) / (len*1.1f), tmp0, tmp1;
        // vt - vertical scale ratio
        // hr - horizontal scale ratio
        // tmp0 - previous data
        // tmp1 - current data

        g.translate(20, pos);
        g.scale(hr, vt);
        g.setPaint(c);
        tmp0 = data.get(0)*getHeight()/100.0f;
        g.drawLine(0, (int)tmp0, 0, (int)tmp0);
        for (i = 1; i < ogn.size(); i++)
        {
            tmp0 = data.get(i - 1)*getHeight()/100.0f;
            tmp1 = data.get(i)*getHeight()/100.0f;
            g.drawLine(i - 1, (int)tmp0, i, (int)tmp1);
        }
        g.scale(1/hr, 1/vt);
        g.translate(-20, -pos);
    }

Java的版本是直接在JFrame里边的paint方法画的。好像没找到类似C#的
        CreateGraphics().DrawImage(bmp, ClientRectangle);
这种双缓冲画法,由于数据较多故每次有遮盖都要重画很久。

我是Java新手,请大虾们多多指教!

4 个解决方案

#1


import java.awt.geom.*;
...


Line2D line = new Line2D.Float(x1, y1, x2, y2); 
graphics2d.draw(line);

#2


谢谢gtlang78的指点,好像可以画出部分效果了。刚刚发现截断的现象是由于垂直放大了100倍引起的,所以只需要在构造line的时候对y1,y2乘100就可以了。而且Java画线的速度明显快于C#,估计是没有用C#的泛型ArrayList,而且读文件操作没有用到bufferedstream。

剩下的问题是,如何避免图像被遮盖时的重画过程?

#3


晕...
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示

#4


呼.................
求人不如求己
google了一下,搞定了:

import java.awt.image.*;
........
先声明
    BufferedImage bi; // for buffered display
    Graphics2D big; // for buffered display
然后在构造方法里边初始化:
    bi=(BufferedImage)createImage(getWidth(), getHeight());
    big=bi.createGraphics();
并在big上画图。然后在paint方法里贴图:
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;        
        g2.drawImage(bi, null, 0, 0);
    }
不知道linux是什么效果...

#1


import java.awt.geom.*;
...


Line2D line = new Line2D.Float(x1, y1, x2, y2); 
graphics2d.draw(line);

#2


谢谢gtlang78的指点,好像可以画出部分效果了。刚刚发现截断的现象是由于垂直放大了100倍引起的,所以只需要在构造line的时候对y1,y2乘100就可以了。而且Java画线的速度明显快于C#,估计是没有用C#的泛型ArrayList,而且读文件操作没有用到bufferedstream。

剩下的问题是,如何避免图像被遮盖时的重画过程?

#3


晕...
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示

#4


呼.................
求人不如求己
google了一下,搞定了:

import java.awt.image.*;
........
先声明
    BufferedImage bi; // for buffered display
    Graphics2D big; // for buffered display
然后在构造方法里边初始化:
    bi=(BufferedImage)createImage(getWidth(), getHeight());
    big=bi.createGraphics();
并在big上画图。然后在paint方法里贴图:
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;        
        g2.drawImage(bi, null, 0, 0);
    }
不知道linux是什么效果...