⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 circledx.java

📁 实现二维基本图元直线段生成的基本算法(DDA
💻 JAVA
字号:
package graphics0;
import java.awt.*;
/**
 * <p>Title: computer graphics </p>
 * <p>Description: homeworks</p>
 * <p>Copyright: Copyright (c) 2004 </p>
 * <p>Company: shu</p>
 * @author dxf
 * @version 1.0
 */

public class CircleDx extends Object2D{
  private int Ra, Rb;
  Point spoint;
  int DrawMethod ;

  void drawDemo(Graphics Canvas){
////////////////////////////////////////////////////////
    switch (DrawMethod) {
      case 0: { //circle
        MidPointCircleDemo(spoint.x,spoint.y,Ra, Canvas);
        break;
      }
      case 1: {//ellipse
        MidPointEllipseDemo(spoint.x, spoint.y, Ra, Rb, Canvas);
        break;
      }
    }


  }
  void draw(Graphics Canvas) {
    int w1,w2,w;
 ///////////////////////////////////////////////
 //line width
    w = LineWidth % 2;
    if (1 == w) {
      w1 = (LineWidth + 1) / 2;
      w2 = 0 - (LineWidth - 1) / 2;
    }
    else {
      w1 = LineWidth / 2;
      w2 = 0 - w1;
    }
////////////////////////////////////////////////////////
    switch (DrawMethod) {
      case 0: { //circle
        MidPointCircle(spoint.x,spoint.y,Ra, ForeColor, Canvas,w1,w2);
        break;
      }
      case 1: {//ellipse
        MidPointEllipse(spoint.x, spoint.y, Ra, Rb, Canvas,w1,w2);
        break;
      }
    }

  };

  public void SetRa (int width) {
    Ra = width;
  }
  public int GetRa () {
    return(Ra);
  }

  public void SetRb (int width) {
    Rb = width;
  }
  public int GetRb () {
    return(Rb);
  }

  boolean IsInside(Point p0) {
    return (true);
  };

 public CircleDx() {
   spoint = new Point(0,0);
   DrawMethod = 0;
 }
 public CircleDx(Point s,int d,int ra,int rb, Color c0,Color c1,
                 int w, int l,boolean f) {
   spoint = new Point(s);
   DrawMethod = d;
   Ra = ra;
   Rb = rb;
   ForeColor = c0;
   BackgroundColor = c1;
   LineWidth = w;
   LineStyle = l;
   Filled = f;
 }

///////////////////////////////////////////////////////////////////////////////
 public void CirclePoints(int x0,int y0,int x,int y,Graphics g)
 {
   g.setColor(ForeColor);
   g.drawLine(x0+x,y0+ y, x0+x, y0+y);g.drawLine(x0+ y, y0+x,x0+ y,y0+x);
   g.drawLine(x0-x, y0+y, x0-x, y0+y);g.drawLine(x0+y, y0-x, x0+y,y0-x);
   g.drawLine(x0+x, y0-y, x0+x, y0-y);g.drawLine(x0-y, y0+x,x0-y,y0+x);
   g.drawLine(x0-x, y0-y, x0-x, y0-y);g.drawLine(x0-y, y0-x,x0-y,y0-x);
   if (Filled){
     g.setColor(BackgroundColor);
     g.drawLine(x0+y,y0+ x,x0+ x, y0+y);
     g.drawLine(x0+ x, y0+y,x0+x, y0-y);
     g.drawLine(x0+x, y0-y,x0+y, y0-x);
     g.drawLine(x0+y, y0-x,x0-y, y0-x);
     g.drawLine(x0-y, y0-x,x0-x, y0-y);
     g.drawLine(x0-x, y0-y,x0-x, y0+y);
     g.drawLine(x0-x, y0+y,x0-y, y0+x);
     g.drawLine(x0-y, y0+x,x0+y,y0+ x);
   }
}
///////////////////////////////////////////////////////////////////////////////
  public void MidPointCircle(int x0,int y0,int r, Color color0,
                             Graphics g, int w1,int w2) {
    int x,y, j=1;
    float d;
    x=0;
    y=r;
    d=(float)(1.25-r);
    g.setColor(color0);
    for (int w=w2;w<w1;w++) {
      CirclePoints (x0,y0,x,y+w,g);
    }

    while(x<=y)   {
      if(d<0)   d+=2*x+3;
       else   { d+=2*(x-y)+5; y--;}
       x++;
       if (j==8) j=0;
       if ('1'==sLineStyle[LineStyle].charAt(j))
         for (int w=w2;w<w1;w++) {
           CirclePoints (x0,y0,x,y+w,g);
         }
       j++;
      }
  }
///////////////////////////////////////////////////////////////////////////////
 public void EllipsePoints(int x0,int y0,int x,int y,
                           Graphics g)
 {
   g.setColor(ForeColor);
   g.drawLine(x0+x, y0+y, x0+x, y0+y);
   g.drawLine(x0-x, y0+y, x0-x, y0+y);
   g.drawLine(x0+x, y0-y, x0+x, y0-y);
   g.drawLine(x0-x, y0-y, x0-x, y0-y);
   if (Filled){
     g.setColor(BackgroundColor);

     g.drawLine(x0 - x , y0 - y  ,x0 + x , y0 - y );
     g.drawLine(x0 + x , y0 - y , x0 + x , y0 + y );
     g.drawLine(x0 - x , y0 + y , x0 + x , y0 + y );
     g.drawLine(x0 - x , y0 - y , x0 - x , y0 + y );
/*     g.drawLine(x0-x+LineWidth,y0-y+LineWidth,x0+x-LineWidth,y0-y+LineWidth);
     g.drawLine(x0+x-LineWidth,y0-y+LineWidth,x0+x-LineWidth,y0+y-LineWidth);
     g.drawLine(x0-x+LineWidth,y0+y-LineWidth,x0+x-LineWidth,y0+y-LineWidth);
     g.drawLine(x0-x+LineWidth,y0-y+LineWidth,x0-x-LineWidth,y0+y-LineWidth);*/

   }

}

////////////////////////////////////////////////////////////////////////////////
  public void MidPointEllipse(int x0,int y0,int ra,int rb,
                              Graphics g, int w1,int w2) {
    int x,y,ra2,rb2,j=1;
    float d,t;
    ra2=ra*ra;rb2=rb*rb;
    t = rb2+(float)(0.5*ra2);
    x = 0;   y = rb;
    g.setColor( ForeColor);

    d = (float)(rb2-ra2*rb+0.25*ra2);
    for (int w=w2;w<w1;w++) {
      EllipsePoints(x0, y0, x, y+w,  g);
    }

    while(t +rb2*x < ra2*y)    {
      if(d<0)   d+=2*rb2*x+3*rb2;
       else   { d+=2*rb2*x+3*rb2+2*ra2-2*ra2*y; y--;}
       x++;
       if (j==8) j=0;
       if ('1'==sLineStyle[LineStyle].charAt(j))
         for (int w=w2;w<w1;w++) {
           EllipsePoints (x0,y0,x,y+w,g);
         }
       j++;

      }
   //////////////////////////////////////////////////
   d =(float)(rb2*(x*x+x+0.25)+ra2*(y*y-2*y+1)-ra2*rb2);
      while(y>0)    {
        if(d<0) {  d+=rb2*(2*x+2)+ra2*(3-2*y);x++;}
         else   { d+=ra2*(3-2*y);}//??????????????//
         y--;

         if (j==8) j=0;
         if ('1'==sLineStyle[LineStyle].charAt(j))
           for (int w=w2;w<w1;w++) {
             EllipsePoints(x0, y0, x+w, y,  g);
           }
         j++;
        }
  }
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
 public void CirclePointsDemo(int x0,int y0,int x,int y,Graphics g)
 {
   g.setColor(ForeColor);

   g.fillRect(x0+x,y0+ y,DemoWidth,DemoWidth);
   g.fillRect(x0+ y, y0+x,DemoWidth,DemoWidth);
   g.fillRect(x0-x, y0+y, DemoWidth,DemoWidth);
   g.fillRect(x0+y, y0-x,DemoWidth,DemoWidth);
   g.fillRect(x0+x, y0-y, DemoWidth,DemoWidth);
   g.fillRect(x0-y, y0+x,DemoWidth,DemoWidth);
   g.fillRect(x0-x, y0-y,DemoWidth,DemoWidth);
   g.fillRect(x0-y, y0-x,DemoWidth,DemoWidth);

}
///////////////////////////////////////////////////////////////////////////////
  public void MidPointCircleDemo(int x0,int y0,int r,
                             Graphics g) {
    int x,y, j=1;
    float d;
    x=0;
    y=r;
    int tmp=2*DemoWidth;
    d=(float)(1.25-r);
    g.setColor( ForeColor);
    CirclePointsDemo (x0,y0,x,y,g);
    while(x<=y)   {
      if (d < 0) {
        d += 2 * x + 3;
      }
      else {
        d += 2 * (x - y) + 5;
        y-=tmp;
      }
      x+=tmp;
      CirclePointsDemo(x0, y0, x, y , g);
    }

  }
///////////////////////////////////////////////////////////////////////////////
 public void EllipsePointsDemo(int x0,int y0,int x,int y,
                           Graphics g)
 {
   g.setColor(ForeColor);
   g.fillRect(x0+x, y0+y,DemoWidth,DemoWidth);
   g.fillRect(x0-x, y0+y,DemoWidth,DemoWidth );
   g.fillRect(x0+x, y0-y,DemoWidth,DemoWidth);
   g.fillRect(x0-x, y0-y,DemoWidth,DemoWidth);

}

////////////////////////////////////////////////////////////////////////////////
  public void MidPointEllipseDemo(int x0,int y0,int ra,int rb,
                              Graphics g) {
    int x,y,ra2,rb2;
    float d,t;
    int tmp=2*DemoWidth;
    ra2=ra*ra;rb2=rb*rb;
    t = rb2+(float)(0.5*ra2);
    x = 0;   y = rb;
    g.setColor(ForeColor);

    d = (float)(rb2-ra2*rb+0.25*ra2);
    EllipsePointsDemo(x0, y0, x, y,  g);

    while(t +rb2*x < ra2*y)    {
      if(d<0)   {
        d += 2 * rb2 * x + 3 * rb2;
      }
       else   {
         d += 2*rb2*x+3*rb2+2*ra2-2*ra2*y;
         y-=tmp;
       }
       x+=tmp;
       EllipsePointsDemo (x0,y0,x,y,g);

      }
   //////////////////////////////////////////////////
   d =(float)(rb2*(x*x+x+0.25)+ra2*(y*y-2*y+1)-ra2*rb2);
      while(y>0)    {
        if(d<0) {
          d+=rb2*(2*x+2)+ra2*(3-2*y);
          x+=tmp;
        }
         else   {
           d+=ra2*(3-2*y);
         }
         y-=tmp;
         EllipsePointsDemo(x0, y0, x, y,  g);

       }
  }
/////////////////////////////////////////////////////////////////////////////////
  public void scale(double sx, double sy) {
    Ra = (int)(Ra*sx); Rb = (int)(Rb*sy);
  }
  public void rotate(double theta, int x, int y) {
     translate(x, y);
  }

  public void translate(int x, int y){
    spoint.x += x; spoint.y += y;
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -