curve代码

该博客主要展示了一段Java代码,实现了曲线绘制及交互功能。定义了多个类,如CStream、CNumber等,用于处理字符串流、数值计算等。还包含曲线绘制、鼠标事件处理等功能,可根据鼠标位置显示信息,控制曲线可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.awt.*;
import java.awt.event.*;
import java.math.*;

class CStream
{
 private String mStream;
 private String mSep;
 private int mWordCount;
 private String mWord[];

 private void UpdateStream(String Stream)
 {
  int iIndex,iTemp,i;
  
  mStream=Stream;
  
  iIndex=0;
  iTemp=0;
  do
  {
   iIndex=mStream.indexOf(mSep,iIndex)+1;
   iTemp++;
  }while (iIndex!=0);
  
  mWordCount=iTemp-1;
  
  if(mWordCount>0)
  {
   mWord=new String[mWordCount];
   iIndex=0;
   for(i=0;i<mWordCount;i++)
   {
    iTemp=iIndex;
    iIndex=mStream.indexOf(mSep,iTemp)+1;
    mWord[i]=mStream.substring(iTemp,iIndex-1);
   }
  }
 }
 
 public CStream()
 {
  mSep=",";
  UpdateStream("");
 }
 
 public CStream(String Stream)
 {
  mSep=",";
  UpdateStream(Stream);
 }
 
 public CStream(String Stream,String Sep)
 {
  mSep=Sep;
  UpdateStream(Stream);
 }

 public void SetStream(String Stream)
 {
  UpdateStream(Stream);
 }
 
 public void SetStream(String Stream,String Sep)
 {
  mSep=Sep;
  UpdateStream(Stream);
 }

 public String GetStream()
 {
  return mStream;
 }
 
 public int WordCount()
 {
  return mWordCount;
 }
 
 public String GetWord(int Index)
 {
  if(Index<mWordCount)
  {
   return mWord[Index];
  }
  else
  {
   return null;
  }
 }

 public void SetWord(int Index,String Word)
 {
  if(Index<mWordCount) mWord[Index]=Word;
  
  mStream="";
  for(int i=0;i<mWordCount;i++)
   mStream=mStream+mWord[i]+mSep;
 }
 
 public String Format()
 {
  
  if(mWordCount<=0) return null;

  CNumber CN=new CNumber();
  String sOut="";
  
  int iIndex=1;
  for (int i=0;i<mWord[0].length();i++)
  {
   String sKey=mWord[0].substring(i,i+1);
   
   if(sKey.compareTo("//")==0)
   {
    i++;
    char Ch=mWord[0].charAt(i);
    sKey="";
    switch(Ch)
    {
     case 'n':        //回车
      sKey="/n";break;
     case '//':        //回车
      sKey="//";break;    
     case 'c':        //逗号
      sKey=","; break;
     default:
      if(iIndex<mWordCount)
      {
       sKey=mWord[iIndex];
       if(sKey.length()!=0)
       {
        switch(Ch)
        {
         case 's':     //字符串
          break;
         case 'i':     //整型
         case 'l':     //长整型
          CN.SetExp(sKey);
          sKey=Integer.toString((int)CN.GetValue());
          break;
         case 'f':     //浮点型
         case 'd':     //双精度浮点型
          CN.SetExp(sKey);
          sKey=Double.toString(CN.GetValue());
          break;
        }
       }
       iIndex++;
      }
    }
   }
   sOut=sOut+sKey;
  }
  return sOut;
 }
}
class CNumber
{
 private String Expression;
 private double Value;
 
 private void SetExpression(String Exp)
 {
  int Operator;
  String Ch;
  
  Expression=Exp;
  Value=0;
  Operator=0;
  for(int i=0;i<Expression.length();i++)
  {
   Ch=Expression.substring(i,i+1);
   if(Ch.compareTo("+")==0){Operator=0;}
   if(Ch.compareTo("-")==0){Operator=1;}
   if(Ch.compareTo("*")==0){Operator=2;}
   if(Ch.compareTo("/")==0){Operator=3;}
   if(Ch.compareTo("%")==0){Operator=4;}
   if((Ch.compareTo("E")==0)||(Ch.compareTo(".")==0)||(Ch.compareTo("0")>=0&&Ch.compareTo("9")<=0))
   {
    int k=i;
    do
    {
     k++;
     if(k>=Expression.length()) break;
     Ch=Expression.substring(k,k+1);
    } while((Ch.compareTo("E")==0)||(Ch.compareTo(".")==0)||(Ch.compareTo("0")>=0&&Ch.compareTo("9")<=0));
    
    double dblTemp=Double.valueOf(Expression.substring(i,k)).doubleValue();
    if(Operator==0) Value+=dblTemp;
    if(Operator==1) Value-=dblTemp;
    if(Operator==2) Value*=dblTemp;
    if(Operator==3) Value/=dblTemp;
    if(Operator==4) Value%=dblTemp;
    i=k-1;
   }
  }
 }
 
 CNumber()
 {
  SetExpression("");
 }
 CNumber(String Exp)
 {
  SetExpression(Exp);
 }
 public void SetExp(String Exp)
 {
  SetExpression(Exp);
 }
 public String GetExp()
 {
  return Expression;
 }
 public double GetValue()
 {
  return Value;
 }
}
class CPoint
{
 public double x;
 public double y;
 CPoint()
 {
  x=0;
  y=0;
 }
 CPoint(double dblx,double dbly)
 {
  x=dblx;
  y=dbly;
 }
}

class CMessage
{
 public Font font;
 public Color color;
 public String message;
}

class CAxis
{
 public boolean Visible;
 public double Inc;
 public Color color;

 public double Rate;
 public double Begin;
 public boolean Label;
 public CMessage Unit;
}

class CCurve
{
 public boolean Visible;

 public CPoint p[];
 public int pnum;
 public Color color;
 public String CutLine;
 
 //(二分查找算法)
 public int GetIndexByDichotomy(double Value)
 {
  int TBegin,TCurrent,Tend;
  double dd;
   
  TBegin = 0;
  Tend = pnum-1;
  TCurrent = (int)Math.round((TBegin + Tend + 1) / 2-0.5);
  
  dd = (p[1].x - p[0].x) / 2;
  
  while((TCurrent!=TBegin)&&(TCurrent!=Tend))
  {
   if (Math.abs(Value-p[TCurrent].x)<=dd) return TCurrent;
   if (Value<p[TCurrent].x) Tend = TCurrent;
   if (Value>p[TCurrent].x) TBegin = TCurrent;
   TCurrent = (int)Math.round((TBegin + Tend + 1) / 2-0.5);
  }
  if(Math.abs(Value - p[TBegin].x) < dd) return TBegin;
  if(Math.abs(Value - p[Tend].x) < dd) return Tend;
  return -1;
 }
}
 
public class Curve extends java.applet.Applet
{
 public double CURVE_INVAILD_YAXIS=-99999999;
 
 public Image ImgBuffer;
 public Graphics GC;
 
 public Image ImgSave;
 public Graphics GS;
 public boolean bHasDrawed;
 
 public int pTop,pLeft,pWidth,pHeight;
 
 public double cFirst,cLast,cMax,cMin;
 public int ChartType;     //图表类型
 public CMessage Title;     //标题
 public Color BackColor;     //背景色
 public Color PlotColor;     //绘图区背景色
 public CAxis AX,AY;      //横轴和纵轴
 public int cWidth,cHeight;    //长宽
 public CCurve C[];      //序列
 public int CNum;      //序列数
 public boolean bCutLine;    //图例
 public Font CutLineFont;    //图例字体
 public boolean bZeroFlag;    //包含零轴
 
 public CMessage Expression;
 public Color ExpColor;
 public Point ExpRange;
 
 public CStream XLabel;     //X轴
 public int ExpMessageNum;    //辅助标签数
 public CStream ExpMessage[];    //辅助标签

 
  

 public Color ToColor(String Param)
 {
  int r=0,g=0,b=0;

  CStream C=new CStream(Param,",");

  if(C.WordCount()>=3)
  {
   r=Integer.valueOf(C.GetWord(0)).intValue();
   g=Integer.valueOf(C.GetWord(1)).intValue();
   b=Integer.valueOf(C.GetWord(2)).intValue();
  }
  return new Color(r,g,b);
 }
 
 public Point ToPoint(String Param)
 {
  int x=0,y=0;

  CStream C=new CStream(Param,",");

  if(C.WordCount()>=2)
  {
   x=Integer.valueOf(C.GetWord(0)).intValue();
   y=Integer.valueOf(C.GetWord(1)).intValue();
  }
  return new Point(x,y);
 }

 public Rectangle ToRectangle(String Param)
 {
  int x=0,y=0,width=0,height=0;

  CStream C=new CStream(Param,",");

  if(C.WordCount()>=4)
  {
   x=Integer.valueOf(C.GetWord(0)).intValue();
   y=Integer.valueOf(C.GetWord(1)).intValue();
   width=Integer.valueOf(C.GetWord(2)).intValue();
   height=Integer.valueOf(C.GetWord(3)).intValue();
  }
  return new Rectangle(x,y,width,height);
 }

 public Font ToFont(String Param)
 {
  String Name="宋体";
  int iStyle=0,iSize=9;
  
  CStream C=new CStream(Param,",");
  if(C.WordCount()>=3)
  {
   Name=C.GetWord(0);
   if(ToBoolean(C.GetWord(1))) iStyle=Font.BOLD;
   iSize=Integer.valueOf(C.GetWord(2)).intValue();
  }
  return new Font(Name,iStyle,iSize);
 }
 
 public boolean ToBoolean(String sValue)
 {
  boolean b=false;
  try
  {
   b=Integer.valueOf(sValue).intValue()==0?false:true;
  }catch(Exception e){};
       
  return b;
 }

 public boolean ToBoolean(int iValue)
 {
  return iValue==0?false:true;
 }

 public int ToInt(long lValue)
 {
  Long LTemp;
  LTemp=new Long(lValue);
  return LTemp.intValue();
 }
 
 public int ToInt(double dblValue)
 {
  Double dblTemp;
  dblTemp=new Double(dblValue);
  return dblTemp.intValue();
 }

 public int ToInt(String sValue)
 {
  return Integer.valueOf(sValue).intValue();
 }

 public double ToDouble(String sValue)
 {
  double dblTemp=0;
  try
  {
   dblTemp=Double.valueOf(sValue).doubleValue();
  }catch(Exception e){};
       
  return dblTemp;
 }

 public int GetInt(double dblValue,int k)
 {
  double dblTemp1,dblTemp2;
  double dblTemp=0;
  int i;
  
  dblTemp1 = Math.pow(10,k-1);
  dblTemp2 = Math.pow(10,k);

  i = 0;
  if((dblValue!=0)&&(k>=1))
  {
   dblTemp = Math.abs(dblValue);
   while((dblTemp<=dblTemp1)||(dblTemp>dblTemp2))
   {
    if(dblTemp <= dblTemp1)
    {
     dblTemp = dblTemp * 10;
     i = i - 1;
    }
    else
    {
     dblTemp = dblTemp / 10;
     i = i + 1;
    }
   }
  }
  dblTemp = (dblValue<0?-1:1) * dblTemp;
  return i;
 }
 
 private String GetParam(String Name,String Fault)
 {
  String Param=null;
  
  try{
   Param=getParameter(Name);
  }catch(Exception e){}
  
  if(Param==null) Param=Fault;
  
  return Param;
 }
 
 private int SetMax()
 {
  double d;
  long z,i;
  
  i = 0;
  d = Math.abs(cMax);
  while( d <= 10 || d > 100)
  {
   if(d <= 10)
   {
    d = d * 10;
    i = i - 1;
   }
   else
   {
    d = d / 10;
    i = i + 1;
   }
  }
  if(d>50)
  {
   z = 10;
  }
  else if(d>20)
  {
   z=5;
  }
  else
  {
   z = 2;
  }

  cMax = cMax / Math.pow(10,i);
  cMax = cMax / z;
  cMax = -Math.round(-cMax-0.5);
  cMax = cMax * z;
  cMax = -Math.round(-cMax-0.5);
  cMax = cMax / Math.pow(10,-i);
  
  d = cMax / (z * Math.pow(10,i));
  return ToInt(-Math.round(-d-0.5));
 }
 
 private int SetMaxMin()
 {
  int dd;
  double vMax,vMin,d;

  vMax=cMax;
  vMin=cMin;
  if(vMax<vMin)
  {
      d = vMax;
   vMax = vMin;
   vMin = d;
  }
  if(vMin > 0) vMin = 0;
  if(vMax < 0) vMax = 0;
  if((vMin == 0) && (vMax == 0)) vMax = 1;

  if(vMax>0)
  {
   cMax = vMax;
   SetMax();
   vMax = cMax;
  }
  if(vMin<0)
  {
   cMax = -vMin;
   SetMax();
   vMin = -cMax;
  }
  cMax = vMax - vMin;
  dd = SetMax();
  d = cMax / dd;

  cMax += vMin;
  cMin = vMin;
  
  dd = 0;
  vMax = 0;
  while(vMax < cMax)
  {
   vMax += d;
   dd++;
  }
  vMin = 0;
  while(vMin > cMin)
  {
   vMin -= d;
   dd++;
  }
  cMax=vMax;
  cMin=vMin;
  return dd;
 }

 private void SetPlot()
 {
  pLeft=50;
  pTop=50;
  pWidth=cWidth-100;
  pHeight=cHeight-100;

  CStream CS=new CStream(GetParam("Plot","0,"));
  if((CS.WordCount()>=5)&&(ToBoolean(CS.GetWord(0))))
  {
   pLeft=Integer.valueOf(CS.GetWord(1)).intValue();
   pTop=Integer.valueOf(CS.GetWord(2)).intValue();
   pWidth=Integer.valueOf(CS.GetWord(3)).intValue();
   pHeight=Integer.valueOf(CS.GetWord(4)).intValue();
  }
 }
 private boolean GetCurveData()
 {
  int i,j,k;
  CStream CS=new CStream();
  CNumber CN=new CNumber();
   
  Expression=new CMessage();
  Expression.message=GetParam("Expression",null);
  Expression.font=ToFont(GetParam("ExpFont","宋体,0,12,"));
  Expression.color=ToColor(GetParam("ExpFontColor","0,0,0,"));
  ExpColor=ToColor(GetParam("ExpBackColor","0,0,0,"));

  BackColor=ToColor(GetParam("BackColor","255,255,255,"));
  PlotColor=ToColor(GetParam("PlotColor","255,255,255,"));
  bCutLine=ToBoolean(GetParam("CutLine","0"));
  CutLineFont=ToFont(GetParam("CutLineFont","宋体,0,12,"));
  bZeroFlag=ToBoolean(GetParam("ZeroFlag","1"));

  Title=new CMessage();
  Title.color=ToColor(GetParam("TitleColor","0,0,0,"));
  Title.font=ToFont(GetParam("TitleFont","宋体,0,12,"));
  Title.message=GetParam("TitleMsg",null);
  
  AX=new CAxis();
  AX.Visible = ToBoolean(GetParam("VisibleXY","1"));
  AX.color=ToColor(GetParam("ColorXY","0,0,0,"));
  
  CN.SetExp(GetParam("IncX","1"));
  AX.Inc =CN.GetValue();
  CN.SetExp(GetParam("RateX","1"));
  AX.Rate=CN.GetValue();
  
  AX.Begin = ToDouble(GetParam("BeginX","0"));
  
  AX.Label = ToBoolean(Integer.valueOf(GetParam("LabelX","1")).intValue());
  AX.Unit = new CMessage();
  AX.Unit.message = GetParam("UnitX",null);
  AX.Unit.font = ToFont(GetParam("FontX","宋体,0,12,"));
  AX.Unit.color = AX.color;
  
  XLabel=new CStream(GetParam("XLabel",""));

  i=0;
  while(GetParam("ExpMessage"+Integer.toString(++i),null)!=null);
  ExpMessageNum=i;
  if(i>0) ExpMessage=new CStream[ExpMessageNum];
  for(i=0;i<ExpMessageNum;i++)
  {
   ExpMessage[i]=new CStream(GetParam("ExpMessage"+Integer.toString(i),""));
  }

  AY=new CAxis();
  AY.Visible = ToBoolean(GetParam("VisibleXY","1"));
  AY.color=ToColor(GetParam("ColorXY","0,0,0,"));
  
  CN.SetExp(GetParam("IncY","1"));
  AY.Inc =CN.GetValue();
  CN.SetExp(GetParam("RateY","1"));
  AY.Rate=CN.GetValue();

  AY.Begin = ToDouble(GetParam("BeginY","0"));

  AY.Label = ToBoolean(GetParam("LabelY","1"));
  AY.Unit = new CMessage();
  AY.Unit.message = GetParam("UnitY",null);
  AY.Unit.font = ToFont(GetParam("FontY","宋体,0,12,"));
  AY.Unit.color = AY.color;
  
  i=0;
  while(GetParam("Visible"+Integer.toString(++i),null)!=null);
  CNum=i;
  
  if(i>0) C=new CCurve[CNum];
  
  for(i=0;i<CNum;i++)
  {
   C[i]=new CCurve();
   
   C[i].Visible=ToBoolean(GetParam("Visible"+Integer.toString(i),"0"));
   C[i].color=ToColor(GetParam("lCol"+Long.toString(i),"0,0,0,"));
   C[i].CutLine=GetParam("CutLine"+Long.toString(i),null);
   
   CS.SetStream(GetParam("Data"+Integer.toString(i),null),";");
   
   C[i].pnum=CS.WordCount();
   if(C[i].pnum>0) C[i].p=new CPoint[C[i].pnum];
   
   for(j=0;j<C[i].pnum;j++)
   {
    C[i].p[j]=new CPoint();
    
    k=CS.GetWord(j).indexOf(",");
    C[i].p[j].x=ToDouble(CS.GetWord(j).substring(0,k));
    C[i].p[j].y=ToDouble(CS.GetWord(j).substring(k+1));
   }
  }

  cFirst=ToDouble(GetParam("First","0"));
  cLast=ToDouble(GetParam("Last","5"));

  SetPlot();
  return true;
 }
 
 private int xToClient(double x)
 {
  double dblx;

  dblx = pWidth / (cLast - cFirst);
   
  return ToInt(Math.round((x - cFirst) * dblx + pLeft));
 }
 
 private int yToClient(double y)
 {
  double dbly;
   
  dbly = pHeight / (cMax - cMin);
   
  return ToInt(Math.round((cMax-y) * dbly + pTop));
 }

 private double clientToX(int x)
 {
  double dblx;

  dblx = (cLast - cFirst) / pWidth;
   
  return (x-pLeft)*dblx+cFirst;
 }
 
 private double clientToY(int y)
 {
  double dbly;
   
  dbly = (cMax - cMin) / pHeight;
   
  return cMax-(y-pTop)*dbly;
 }

 public void DrawCurve()
 {
  boolean bMax=false,bMin=false,bInvaild;
  double PlotHeight,PlotWidth;
  double xPosition=0,yPosition=0;
  int xPlotCount,yPlotCount;
  int i,j;
  double dblTemp;
  String sTemp;
  
  GC.setColor(BackColor);
  GC.fillRect(0,0,cWidth,cHeight);
  GC.setColor(PlotColor);
  GC.fillRect(pLeft,pTop,pWidth,pHeight);
  
  for(i=0;i<CNum;i++)
  {
   if(C[i].Visible)
   for(j=0;j<C[i].pnum;j++)
   {
    if(C[i].p[j].y != CURVE_INVAILD_YAXIS)
    {
     if(bMax)
     {
      if(cMax < C[i].p[j].y) cMax = C[i].p[j].y;
     }
     else
     {
      bMax=true;
      cMax=C[i].p[j].y;
     }
     if(bMin)
     {
      if(cMin > C[i].p[j].y) cMin = C[i].p[j].y;
     }
     else
     {
      bMin = true;
      cMin = C[i].p[j].y;
     }
    }
   }
  }
  
  yPlotCount=SetMaxMin();

  PlotHeight=(cMax-cMin)/yPlotCount;
  
  xPlotCount=ToInt((cLast-cFirst)/AX.Inc);
  PlotWidth=AX.Inc;
   
  GC.setColor(AX.color);
  GC.drawRect(xToClient(cFirst),yToClient(cMax),xToClient(cLast)-xToClient(cFirst),yToClient(cMin)-yToClient(cMax));

  if(AY.Visible)
  {
   GC.setColor(AY.color);
   for(i=1;i<yPlotCount;i++)
   {
    GC.drawLine(xToClient(cFirst),yToClient(cMin+i*AY.Inc*PlotHeight),
       xToClient(cLast),yToClient(cMin+i*AY.Inc*PlotHeight));
   }
  }
  if(AY.Label)
  {
   GC.setFont(AY.Unit.font);
   GC.setColor(AY.Unit.color);
   for(i=0;i<=yPlotCount;i++)
   {
    if(Math.round(AY.Begin+PlotHeight*i)==AY.Begin+PlotHeight*i)
    {
     sTemp=Long.toString(Math.round(cMin+PlotHeight*i));
    }
    else
    {
     //整定有效数字位数为3
     int iTemp=GetInt(cMin+PlotHeight*i,3);
     long lTemp=Math.round((cMin+PlotHeight*i)*Math.pow(10,-iTemp));
     sTemp=Double.toString(lTemp/Math.pow(10,-iTemp));
    }
    GC.drawString(sTemp,xToClient(cFirst)-GC.getFontMetrics(AY.Unit.font).stringWidth(sTemp),yToClient(cMin+i*PlotHeight)+ToInt(GC.getFontMetrics(AY.Unit.font).getHeight()*0.5));
   }
   sTemp=AY.Unit.message;
   GC.drawString(sTemp,xToClient(cFirst)-GC.getFontMetrics(AY.Unit.font).stringWidth(sTemp),yToClient(cMin+(i-1)*PlotHeight)-ToInt(GC.getFontMetrics(AY.Unit.font).getHeight()*0.5));
  }

  if(AX.Visible)
  {
   GC.setColor(AX.color);
   for(i=1;i<=xPlotCount;i++)
   {
    GC.drawLine(xToClient(cFirst+i*PlotWidth),yToClient(cMin),
       xToClient(cFirst+i*PlotWidth),yToClient(cMax));
   }
  }

  if(AX.Label && (AX.Inc>0) && (XLabel.WordCount()==0))
  {
   GC.setFont(AX.Unit.font);
   GC.setColor(AX.Unit.color);
   
   sTemp=null;
   dblTemp=cFirst;
   while(dblTemp<=cLast)
   {
    if(Math.round(AX.Begin+dblTemp*AX.Rate)==AX.Begin+dblTemp*AX.Rate)
    {
     sTemp=Long.toString(Math.round(AX.Begin+dblTemp*AX.Rate));
    }
    else
    {
     sTemp=Double.toString(AX.Begin+dblTemp*AX.Rate)+AX.Unit.message;
    }
    GC.drawString(sTemp,xToClient(dblTemp)-GC.getFontMetrics(AX.Unit.font).stringWidth(sTemp)/2,yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
    dblTemp+=AX.Inc;
   }
   GC.drawString("("+AX.Unit.message+")",xToClient(cLast)+GC.getFontMetrics(AX.Unit.font).stringWidth(sTemp)/2,yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
  }
  else
  {
   GC.setFont(AX.Unit.font);
   GC.setColor(AX.Unit.color);
   for(i=0;i<XLabel.WordCount();i++)
   {
    GC.drawString(XLabel.GetWord(i),xToClient(i),yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
   }
  }

  //写标题头
  if(Title.message!=null)
  {
   GC.setFont(Title.font);
   GC.setColor(Title.color);
   GC.drawString(Title.message,pLeft+(pWidth-GC.getFontMetrics(Title.font).stringWidth(Title.message))/2,yToClient(cMax)-1);
   GC.setFont(new Font("宋体",0,11));
  }
  
  //写图例
  if(bCutLine)
  {
   GC.setFont(CutLineFont);
   for(i=0;i<CNum;i++)
   {
    GC.setColor(C[i].color);
    GC.fillRect(xToClient(cLast)+5,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8),20,5);
    if(!C[i].Visible) GC.fillArc(xToClient(cLast)+30,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8),5,5,0,360);
    GC.drawString(C[i].CutLine,xToClient(cLast)+5,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8)+2+GC.getFontMetrics(CutLineFont).getHeight());
   }
  }

  //画曲线
  for(j=0;j<CNum;j++)
  {
   if(C[j].Visible)
   {
    GC.setColor(C[j].color);
    if(C[j].p[0].y == CURVE_INVAILD_YAXIS)
    {
     bInvaild = true;
    }
    else
    {
     xPosition = C[j].p[0].x;
     yPosition = C[j].p[0].y;
     bInvaild = false;
    }
    for(i=1;i< C[j].pnum;i++)
    {
     if(C[j].p[i].y == CURVE_INVAILD_YAXIS)
     {
      bInvaild = true;
     }
     else
     {
      if(bInvaild)
      {
       xPosition = C[j].p[i].x;
       yPosition = C[j].p[i].y;
       bInvaild = false;
      }
      else
      {
       GC.drawLine(xToClient(xPosition),yToClient(yPosition),
       xToClient(C[j].p[i].x),yToClient(C[j].p[i].y));
        
       //GC.drawLine(xToClient(xPosition),yToClient(yPosition)-1,
       //xToClient(C[j].p[i].x),yToClient(C[j].p[i].y)-1);
      
       xPosition=C[j].p[i].x;
       yPosition=C[j].p[i].y;
       
      }
     }
    }
    //Ctrl.Circle (Datas(j, i).x, Datas(j, i).y), 0.15
   }//endif
  }//end for
 }
 
 public void init()
 {
  cWidth = Integer.valueOf(GetParam("Width","0")).intValue();
  cHeight = Integer.valueOf(GetParam("Height","0")).intValue();

  ImgBuffer=createImage(cWidth,cHeight);
  GC=ImgBuffer.getGraphics();

  ImgSave=createImage(cWidth,cHeight);
  GS=ImgSave.getGraphics();
  bHasDrawed=false;

  if(!GetCurveData())
   GC.drawString("Param Error!",5,5);
  else
   DrawCurve();

  enableEvents(MouseEvent.MOUSE_MOVED);
 }
 
 public void paint(Graphics g)
 {
  g.drawImage(ImgBuffer,0,0,this);
  
  //int i,j;
  //Graphics2D g2 = (Graphics2D)g;
  //g2.draw(TempQuad);
 
    
  
 }
 
 protected void processMouseMotionEvent( MouseEvent e )
 {
  boolean bRepaint=false;
  boolean bDrawMsg=false;

  CStream CS;
  CNumber CN=new CNumber();
  
  String sIn="",sOut="",ch,ch2;
  
  if(Expression.message!=null)
  {
   int x=e.getX();
   int y=e.getY();
   
   if(bHasDrawed)
   {
    GC.drawImage(ImgSave,0,0,this);
    bRepaint=true;
    bHasDrawed=false;
   }
   if(x>=pLeft&&x<=pLeft+pWidth&&y>=pTop&&y<=pTop+pHeight)
   {
    double xClient=clientToX(x);
    
    CS=new CStream(Expression.message);

    for(int i=1;i<CS.WordCount();i++)
    {
     sIn=CS.GetWord(i);
     sOut="";
     for(int j=0;j<sIn.length();j++)
     {
      ch=sIn.substring(j,j+1);
      if(ch.compareTo("X")==0||ch.compareTo("Y")==0||ch.compareTo("M")==0)
      {
       int k=j;
       do
       {
        k++;
        if(k>=sIn.length()) break;
        ch2=sIn.substring(k,k+1);
       } while(ch2.compareTo("0")>=0&&ch2.compareTo("9")<=0);
       
       int cIndex=Integer.valueOf(sIn.substring(j+1,k)).intValue();
       int pIndex=C[cIndex].GetIndexByDichotomy(xClient);
       if(pIndex!=-1)
       {
        if(ch.compareTo("M")==0)
        {
         if(cIndex<ExpMessageNum&&cIndex>=0)
          if(pIndex<ExpMessage[cIndex].WordCount()&&pIndex>=0)
          {
           sOut=sOut+ExpMessage[cIndex].GetWord(pIndex);
           bDrawMsg=true;
          }
        }
        if(ch.compareTo("X")==0)
        {
         sOut=sOut+C[cIndex].p[pIndex].x;
         bDrawMsg=true;
        }
        if(ch.compareTo("Y")==0)
         if(C[cIndex].p[pIndex].y!=CURVE_INVAILD_YAXIS)
         {
          sOut=sOut+C[cIndex].p[pIndex].y;
          bDrawMsg=true;
         }
       }
       j=k-1;
      }
      else
      {
       sOut=sOut+ch;
      }
     }
     CS.SetWord(i,sOut);
    }
    if(bDrawMsg)
    {
     int iLeft=0,iTop=0,iWidth=0,iHeight=0;
     CS=new CStream(CS.Format()+"/n","/n");
     GS.drawImage(ImgBuffer,0,0,this);
     for(int i=0;i<CS.WordCount();i++)
      iWidth=Math.max(iWidth,GC.getFontMetrics(Expression.font).stringWidth(CS.GetWord(i)));
     iHeight=CS.WordCount()*GC.getFontMetrics(Expression.font).getHeight();
    
     iWidth+=5;
     iHeight+=5;
    
     if(x+iWidth+10>pWidth+pLeft)
      iLeft=x-iWidth;
     else
      iLeft=x+10;

     if(y+iHeight+10>pHeight+pTop)
     {
      iTop=y-iHeight;
     }
     else
     {
      iTop=y+10;
     }
     GC.setColor(ExpColor);
     GC.fillRect(iLeft,iTop,iWidth,iHeight);
     GC.setFont(Expression.font);
     GC.setColor(Expression.color);
     for(int i=0;i<CS.WordCount();i++)
      GC.drawString(CS.GetWord(i),iLeft+2,iTop+(i+1)*GC.getFontMetrics(GC.getFont()).getHeight());
    
     GC.drawLine(x,pTop,x,pTop+pHeight);
     bHasDrawed=true;
     bRepaint=true;
    }
   }

   if(bRepaint) repaint();
  }
 }
 public void update(Graphics g)   //重载update降低闪烁
 {
  paint(g);
 }
 protected void processMouseEvent( MouseEvent e )
 {
  CStream CS=new CStream(e.paramString() + ",");
  
  if(CS.GetWord(0).compareTo("MOUSE_EXITED")==0)
  {
   if(Expression.message!=null)
   {
    if(bHasDrawed)
    {
     GC.drawImage(ImgSave,0,0,this);
     bHasDrawed=false;
     repaint();
    }
   }
  }
  if(CS.GetWord(0).compareTo("MOUSE_CLICKED")==0)
  {
   for(int i=0;i<CNum;i++)
   {
    int iLeft=xToClient(cLast)+5;
    int iRight=iLeft+20;
    int iTop=yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8);
    int iBottom=iTop+5;
    
    if(e.getX()>=iLeft&&e.getX()<=iRight&&e.getY()>=iTop&&e.getY()<=iBottom)
    {
     C[i].Visible=!C[i].Visible;
     DrawCurve();
     repaint();
     break;
    }
   }
  }
 }

 static public void main(String[] avgs)
 {
  
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值