Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as text by krziu ( 17 years ago )
/* klasa uniwersalna ułatwiające rysowanie wykresów
 */
import java.awt.*;
import java.text.*;

public class AutoSkalowanie
{
    //współrzędne początku układu w pikslach
    protected int centerX;
    protected int centerY;
    //ile piksli przypada na "jednostkÄ™", "jednostka"=1.0*baza
    protected int unitX=0;
    protected int unitY=0;
    protected double baseX=1.0;
    protected double baseY=1.0;
    //rozmiar rysunku w pikslach
    protected int width;
    protected int height;
    //marginesy - ile piksli od brzegów rysunku kończą się osie
    protected int leftMargin=5;
    protected int rightMargin=5;
    protected int topMargin=5;
    protected int bottomMargin=5;

    protected boolean isXZero=true; //czy oś X zawiera wartość zero
    protected boolean isYZero=true; //czy oś Y zawiera wartość zero

    protected DecimalFormat df=new DecimalFormat("######0.0#");//formatowanie liczb opisujÄ…cych osie
    //zakres zmiennych x,y
    protected double minX;
    protected double maxX;
    protected double minY;
    protected double maxY;
    //
    protected double deltaX;
    protected double deltaY;
    //------------------------
    public AutoSkalowanie()
    {
        //ten konstruktor jest tylko dlatego że klasa pochodna WykrexXY wymaga by
        //klasa bazowa miała konstruktor bezargumentowy
    }
    //------------------------
    public AutoSkalowanie(int width,int height,double minX,double maxX,double minY,double maxY)
    {
        this.width=width;
        this.height=height;
        this.minX=minX;
        this.maxX=maxX;
        this.minY=minY;
        this.maxY=maxY;
        konfiguruj();
    }
    //------------------------
    private void konfiguruj()
    {
        centerX=leftMargin+(int)((double)(width)*(-minX/(maxX-minX)));
        centerY=bottomMargin+(int)((double)(height)*(-minY/(maxY-minY)));
        if(minX>0.0 || maxX<0.0 || minY>0.0 || maxY<0.0)
        {
            if(minX>0.0 || maxX<0.0)
            {
                centerX=5;
                //leftMargin+=10;
                //width-=10;
                //centerY+=5;
                isXZero=false;
            }
            if(minY>0.0 || maxY<0.0)
            {
                centerY=5;
                bottomMargin+=10;
                height-=10;
                centerX+=5;
                isYZero=false;
            }
        }
        centerY=(height+topMargin+bottomMargin)-centerY;//wsp&Atilde;&sup3;&Aring;‚rz&Auml;™dne "pikslowe" rosn&Auml;… w d&Atilde;&sup3;&Aring;‚ ekranu, matematyczne rosn&Auml;…
                                                        //w g&Atilde;&sup3;r&Auml;™ dlatego trzeba zrobi&Auml;‡ odbicie
        unitX=(int)(width/(maxX-minX));
        int wsp=10;
        while(unitX==0.0)
        {
            baseX*=10.0;
            unitX=(int)(wsp*width/(maxX-minX));
            wsp*=10;
        }
        while(unitX<=40)
        {
            baseX*=2.0;
            unitX*=2;
        }
        while(unitX>=width)
        {
            baseX/=2;
            unitX/=2;
        }
        unitX=Math.min(unitX,width-5);
        deltaX=(maxX-minX)*(double)unitX/(double)(width-5);

        unitY=(int)((height)/(maxY-minY));
        wsp=10;
        while(unitY==0.0)
        {
            baseY*=10.0;
            unitY=(int)(wsp*height/(maxY-minY));
            wsp*=10;
        }
        while(unitY<=40)
        {
            baseY*=2.0;
            unitY*=2;
        }
        while(unitY>=height)
        {
            baseY/=2;
            unitY/=2;
        }
        unitY=Math.min(unitY,height-5);
        deltaY=(maxY-minY)*(double)unitY/(double)(height-5);
    }
    //------------------------
    public void osie(Graphics g)
    {
        osie(g,new Font("Dialog",Font.PLAIN,10));
    }
    //------------------------
    public void osie(Graphics g,Font f)
    {
        g.setFont(f);
        int rozmiar=f.getSize();
        // "zaostrzona" o&Aring;› pozioma
        g.drawLine(leftMargin,centerY,width-leftMargin,centerY);
        g.drawLine(width-leftMargin,centerY,width-leftMargin-5,centerY-3);
        g.drawLine(width-leftMargin,centerY,width-leftMargin-5,centerY+3);
        if (centerY>=rozmiar+5)
        {
            g.drawString("t[s]",width+leftMargin-10,centerY-5);
        }
        else
        {
            g.drawString("t[s]",width+leftMargin-10,centerY+15);
        }
        // "zaostrzona" o&Aring;› pionowa
        g.drawLine(centerX,topMargin,centerX,height+topMargin);
        g.drawLine(centerX,topMargin,centerX-3,topMargin+5);
        g.drawLine(centerX,topMargin,centerX+3,topMargin+5);
        if (centerX<=width-15)
        {
            g.drawString("Y",centerX+5,topMargin+10);
        }
        else
        {
            g.drawString("Y",centerX-15,topMargin+10);
        }
    }
    // funkcje skaluj&Auml;…ce o&Aring;› X
    //------------------------
    public void skalujX(Graphics g)
    {
        skalujX(g,false,new Font("Dialog",Font.PLAIN,10));
    }
    //------------------------
    public void skalujX(Graphics g,boolean decimal)
    {
        skalujX(g,decimal,new Font("Dialog",Font.PLAIN,10));
    }
    //------------------------
    public void skalujX(Graphics g,boolean decimal,Font f)
    {
        g.setFont(f);
        int rozmiar=f.getSize();
        int dx;
        if(isXZero)
        {
            int i=1;
            while (centerX+i*unitX<width+leftMargin-5)
            {
                g.drawLine(centerX+i*unitX,centerY+4,centerX+i*unitX,centerY-4);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dx=(int)(j*unitX)/10;
                        g.drawLine(centerX+(i-1)*unitX+dx,centerY+2,centerX+(i-1)*unitX+dx,centerY-2);
                    }
                }
                if(centerX+i*unitX-5+8<width+leftMargin-5)
                {
                    if (centerY>=rozmiar+5)
                    {
                        g.drawString(""+i*baseX,centerX+i*unitX-5,centerY-5);
                    }
                    else
                    {
                        g.drawString(""+i*baseX,centerX+i*unitX-5,centerY+15);
                    }
                }
                i++;
            }
            if(decimal)
            {
                i--;
                int j=1;
                dx=(int)(j*unitX)/10;
                while (centerX+(i-1)*unitX+dx<width+leftMargin)
                {
                    g.drawLine(centerX+(i-1)*unitX+dx,centerY+2,centerX+(i-1)*unitX+dx,centerY-2);
                    j++;
                    dx=(int)(j*unitX)/10;
                }
            }
            i=1;
            while (centerX-i*unitX>leftMargin)
            {
                g.drawLine(centerX-i*unitX,centerY+4,centerX-i*unitX,centerY-4);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dx=(int)(j*unitX)/10;
                        g.drawLine(centerX-(i-1)*unitX-dx,centerY+2,centerX-(i-1)*unitX-dx,centerY-2);
                    }
                }
                if (centerY>=5+rozmiar)
                {
                    g.drawString("-"+i*baseX,centerX-i*unitX-5,centerY-5);
                }
                else
                {
                    g.drawString("-"+i*baseX,centerX-i*unitX-5,centerY+15);
                }
                i++;
            }
            if(decimal)
            {
                i--;
                int j=1;
                dx=(int)(j*unitX)/10;
                while (centerX-(i-1)*unitX-dx>leftMargin)
                {
                    g.drawLine(centerX-(i-1)*unitX-dx,centerY+2,centerX-(i-1)*unitX-dx,centerY-2);
                    j++;
                    dx=(int)(j*unitX)/10;
                }
            }
        }
        else
        {
            int i=0;
            while(leftMargin+i*unitX<width+leftMargin-5)
            {
                g.drawLine(leftMargin+i*unitX,centerY+4,leftMargin+i*unitX,centerY-4);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dx=(int)(j*unitX)/10;
                        if(leftMargin+i*unitX+dx<width+leftMargin-5)
                        {
                            g.drawLine(leftMargin+i*unitX+dx,centerY+2,leftMargin+i*unitX+dx,centerY-2);
                        }
                    }
                }
                if(i>0 && centerX+i*unitX-5+8<width+leftMargin-5)
                {
                    double x=minX+i*deltaX;
                    g.drawString(df.format(x),centerX+i*unitX-5,centerY-5);
                }
                i++;
            }
        }
    }
    // funkcje skaluj&Auml;…ce o&Aring;› Y
    //------------------------
    public void skalujY(Graphics g)
    {
        skalujY(g,false,new Font("Dialog",Font.PLAIN,10));
    }
    //------------------------
    public void skalujY(Graphics g,boolean decimal)
    {
        skalujY(g,decimal,new Font("Dialog",Font.PLAIN,10));
    }
    //------------------------
    public void skalujY(Graphics g,boolean decimal,Font f)
    {
        int dy;
        if(isYZero)
        {
            if(!isXZero)
            {
                g.drawLine(centerX+4,centerY,centerX-4,centerY);
                if (centerX>=30 && !isXZero)
                {
                    g.drawString("0.0",centerX-25,centerY);
                }
                else
                {
                    g.drawString("0.0",centerX+5,centerY);
                }
            }
            int i=1;
            while (centerY-i*unitY>topMargin+5)
            {
                g.drawLine(centerX+4,centerY-i*unitY,centerX-4,centerY-i*unitY);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dy=(int)(j*unitY)/10;
                        g.drawLine(centerX+2,centerY-(i-1)*unitY-dy,centerX-2,centerY-(i-1)*unitY-dy);
                    }
                }
                if (centerX>=30 && !isXZero)
                {
                    g.drawString(""+i*baseY,centerX-25,centerY-i*unitY);
                }
                else
                {
                    g.drawString(""+i*baseY,centerX+5,centerY-i*unitY);
                }
                i++;
            }
            if(decimal)
            {
                i--;
                int j=1;
                dy=(int)(j*unitY)/10;
                while (centerY-(i-1)*unitY-dy>topMargin+5)
                {
                    g.drawLine(centerX+2,centerY-(i-1)*unitY-dy,centerX-2,centerY-(i-1)*unitY-dy);
                    j++;
                    dy=(int)(j*unitY)/10;
                }
            }
            i=1;
            while (centerY+i*unitY<height+topMargin)
            {
                g.drawLine(centerX+4,centerY+i*unitY,centerX-4,centerY+i*unitY);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dy=(int)(j*unitY)/10;
                        g.drawLine(centerX+2,centerY+(i-1)*unitY+dy,centerX-2,centerY+(i-1)*unitY+dy);
                    }
                }
                if (centerX>=30 && !isXZero)
                {
                    g.drawString("-"+i*baseY,centerX-25,centerY+i*unitY);
                }
                else
                {
                    g.drawString("-"+i*baseY,centerX+5,centerY+i*unitY);
                }
                i++;
            }
            if(decimal)
            {
                i--;
                int j=1;
                dy=(int)(j*unitY)/10;
                while (centerY+(i-1)*unitY+dy<height+topMargin)
                {
                    g.drawLine(centerX+2,centerY+(i-1)*unitY+dy,centerX-2,centerY+(i-1)*unitY+dy);
                    j++;
                    dy=(int)(j*unitY)/10;
                }
            }
        }
        else
        {
            int i=0;
            while(height-bottomMargin-i*unitY>topMargin+5)
            {
                g.drawLine(centerX-4,height+topMargin-i*unitY,centerX+4,height+topMargin-i*unitY);
                if (decimal)
                {
                    for (int j=1;j<=9;j++)
                    {
                        dy=(int)(j*unitY)/10;
                        if(height-bottomMargin-i*unitY-dy>topMargin+5)
                        {
                            g.drawLine(centerX-2,height+topMargin-i*unitY-dy,centerX+2,height+topMargin-i*unitY-dy);
                        }
                    }
                }
                if(height+topMargin-i*unitY>topMargin+10)
                {
                    double y=minY+i*deltaY;
                    g.drawString(df.format(y),centerX+5,height+topMargin-i*unitY);
                }
                i++;
            }
        }
    }
    //------------------------
    // funkcja przeliczaj&Auml;…ca wspo&Aring;‚rz&Auml;™dn&Auml;… x-ow&Auml;… matematyczn&Auml;… na piksele
    public int getX(double x)
    {
        if(isXZero)
        {
            return centerX+(int)((x*unitX)/baseX);
        }
        else
        {
            return centerX+(int)((x-minX)*unitX/baseX);
        }
    }
    //------------------------
    public int getX(int ix)
    {
        return leftMargin+ix;
    }
    //------------------------
    // funkcja przeliczaj&Auml;…ca wspo&Aring;‚rz&Auml;™dn&Auml;… y-ow&Auml;… matematyczn&Auml;… na piksele
    public int getY(double y)
    {
        if(isYZero)
        {
            return centerY-(int)((y*unitY)/baseY);
        }
        else
        {
            return centerY-(int)((y-minY)*unitY/baseY);
        }
    }
    //------------------------
    public int[] getCenter()
    {
        int[] result={centerX,centerY};
        return result;
    }
    //------------------------
    public int[] getUnits()
    {
        int[] result={unitX,unitY};
        return result;
    }
}

 

Revise this Paste

Your Name: Code Language: