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ółrzędne "pikslowe" rosną w dół ekranu, matematyczne rosną
//w górę dlatego trzeba zrobić 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Å› 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Å› 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Ä…ce oÅ› 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Ä…ce oÅ› 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ąca wspołrzędną x-ową matematyczną 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ąca wspołrzędną y-ową matematyczną 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