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

📄 draw_cut.java

📁 图形学的源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		   }//switch(point)
	     }//while
	     break;
}//switch

    
//在缓冲区中画
        mark=0x8000;n=0;
        x=xu0;
        y=yu0;
        g=buffer.getGraphics();
             	
     	if(isXOR) g.setXORMode(c);
		else 
		{
		    g.setPaintMode();
			g.setColor(c);
			
		}
		
		
   switch(k){
	case 1:
	      e=-dx;
	      x=xu0;
      	  y=yu0;
	      g.fillOval(xu0,yu0,1,1);
	      while(x<xu1)
	      {	 
	       e+=2*dy;
	       if(e>=0)
		    { x++; y++; e-=2*dx; }
		   else  x++;
	  	  n++;
		  if(n%16>1)  mark=0x8000>>(n%16-1);
          if(n%16==1) mark=0x8000;
          if(n%16==0) mark=0x0001;
          if((linestyle & mark)!=0)
           switch(point)
           {
		   case 1:
		          g.fillOval(x,y,1,1);
		          break;
		   case 2:g.fillOval(x,y,1,1);
		          g.fillOval(x,y+1,1,1);
		          break;
		   case 3:g.fillOval(x,y,1,1);
		          g.fillOval(x,y+1,1,1);
		          g.fillOval(x,y-1,1,1);
		          break;
		   }
	     }//while
	     
	     break;
	 case 2:
	      e=dx;
	      x=xu0;
      	  y=yu0;
	      g.fillOval(xu0,yu0,1,1);
	      while(x<xu1)
		  {
		  	e+=2*dy; 
		   if(e<=0)
		    {x++;y--;e+=2*dx;}
		   else  x++;
	  	  n++;
		  if(n%16>1)  mark=0x8000>>(n%16-1);
          if(n%16==1) mark=0x8000;
          if(n%16==0) mark=0x0001;
          if((linestyle & mark)!=0)
           switch(point)
           {
		   case 1:g.fillOval(x,y,1,1);
		          break;
		   case 2:g.fillOval(x,y,1,1);
		          g.fillOval(x,y+1,1,1);
		          break;
		   case 3:g.fillOval(x,y,1,1);
		          g.fillOval(x,y+1,1,1);
		          g.fillOval(x,y-1,1,1);
		          break;
		   }
	     }//while  
	     break;   
	   case 3:
	      e=-dy;
	      x=xu0;
      	  y=yu0;
	      g.fillOval(xu0,yu0,1,1);
	      while(y<yu1)
		  { 
		   e+=2*dx;
		   if(e>=0)
		    {y++;x++;e-=2*dy;}
		   else  y++;
	  	  n++;
		  if(n%16>1)  mark=0x8000>>(n%16-1);
          if(n%16==1) mark=0x8000;
          if(n%16==0) mark=0x0001;
          if((linestyle & mark)!=0)
           switch(point)
           {
		   case 1:g.fillOval(x,y,1,1);
		          break;
		   case 2:g.fillOval(x,y,1,1);
		          g.fillOval(x+1,y,1,1);
		          break;
		   case 3:g.fillOval(x,y,1,1);
		          g.fillOval(x+1,y,1,1);
		          g.fillOval(x-1,y,1,1);
		          break;
		   }
	     }//while
	     break;
	   case 4: 
	      e=dy;
	      x=xu0;
      	  y=yu0; 
	      g.fillOval(xu0,yu0,1,1);
	      while(y>yu1)
		  {
		  	e+=2*dx; 
		   if(e>=0)
		    {y--;x++;e+=2*dy;}
		   else  y--;
	  	  n++;
		  if(n%16>1)  mark=0x8000>>(n%16-1);
          if(n%16==1) mark=0x8000;
          if(n%16==0) mark=0x0001;
          if((linestyle & mark)!=0) 
           switch(point)
           {
		   case 1:g.fillOval(x,y,1,1);
		          break;
		   case 2:g.fillOval(x,y,1,1);
		          g.fillOval(x+1,y,1,1);
		          break;
		   case 3:g.fillOval(x,y,1,1);
		          g.fillOval(x+1,y,1,1);
		          g.fillOval(x-1,y,1,1);
		          break;
		   }//switch(point)
	     }//while
	     break;
       }//switch
	}//BreLine
}


//定义圆类
class DrawCircle 
{ 
  public void BijinCircle(Graphics g,Image buffer,Color c,int x0,int y0,int r)
  {
  	int linestyle=0xffff,point=1;
 	boolean isXOR=false;
	int x1,y1,x2,y2;
	double o; 
    g.setPaintMode();
	g.setColor(c);
    g.fillOval(x0,y0,3,3); //画圆心   
 	for(o=0;o<360*2*Math.PI;o++)
 	{ 
 		x1=(int) (x0+r*Math.cos(o/360));
 		y1=(int) (y0+r*Math.sin(o/360));
 		x2=(int) (x0+r*Math.cos((o+1)/360));
 		y2=(int) (y0+r*Math.sin((o+1)/360));
 		(new DrawLine()).DDALine(g,buffer,c,linestyle,point,x1,y1,x2,y2,isXOR);
 	}
 	
 	g=buffer.getGraphics();
	g.setPaintMode();
	g.setColor(c);
    for(o=0;o<360*2*Math.PI;o++)
 	{
 		x1=(int) (x0+r*Math.cos(o/360));
 		y1=(int) (y0+r*Math.sin(o/360));
 		x2=(int) (x0+r*Math.cos((o+1)/360));
 		y2=(int) (y0+r*Math.sin((o+1)/360));
 		(new DrawLine()).DDALine(g,buffer,c,linestyle,point,x1,y1,x2,y2,isXOR);
 	}
  }//BijinCircle
  
  public void MidCircle(Graphics g,Image buffer,Color c,int x0,int y0,int r)
  {
  	int x,y;
       float d;
       g.setPaintMode();
	   g.setColor(c);
       x=0; y=r; d=1-r; 
      g.fillOval(x0,y0,3,3); //画圆心 
     //显示圆弧上的八个对称点
     g.fillOval(x+x0,y+y0,1,1);
     g.fillOval(x+x0,-y+y0,1,1);
     g.fillOval(-x+x0,y+y0,1,1);
     g.fillOval(-x+x0,-y+y0,1,1);
     g.fillOval(-y+x0,-x+y0,1,1);
     g.fillOval(y+x0,-x+y0,1,1);
     g.fillOval(y+x0,x+y0,1,1);
     g.fillOval(-y+x0,x+y0,1,1);              
     while(x<=y)
     {if(d<0) d+=2*x+3;//正右方的点
	  else { d+=2*(x-y)+5;y--;}//右上方的点
      x++;
     //显示圆弧上的八个对称点
     
     g.fillOval(x+x0,y+y0,1,1);
     g.fillOval(x+x0,-y+y0,1,1);
     g.fillOval(-x+x0,y+y0,1,1);
     g.fillOval(-x+x0,-y+y0,1,1);
     g.fillOval(-y+x0,-x+y0,1,1);
     g.fillOval(y+x0,-x+y0,1,1);
     g.fillOval(y+x0,x+y0,1,1);
     g.fillOval(-y+x0,x+y0,1,1);     
	 }//while
	 
	 g=buffer.getGraphics();
	 g.setPaintMode();
	   g.setColor(c);
       x=0; y=r; d=1-r;
       g.fillOval(x0,y0,3,3); //画圆心 
     //显示圆弧上的八个对称点
     g.fillOval(x+x0+1,y+y0,1,1);
     g.fillOval(x+x0,y+y0,1,1);
     g.fillOval(x+x0,-y+y0,1,1);
     g.fillOval(-x+x0,y+y0,1,1);
     g.fillOval(-x+x0,-y+y0,1,1);
     g.fillOval(-y+y0,-x+x0,1,1);
     g.fillOval(y+y0,-x+x0,1,1);
     g.fillOval(y+y0,x+x0,1,1);
     g.fillOval(-y+y0,x+x0,1,1);              
     while(x<=y)
     {if(d<0) d+=2*x+3;//正右方的点
	  else { d+=2*(x-y)+5;y--;}//右上方的点
      x++;
     //显示圆弧上的八个对称点
     g.fillOval(x+x0+1,y+y0,1,1);
     g.fillOval(x+x0,y+y0,1,1);
     g.fillOval(x+x0,-y+y0,1,1);
     g.fillOval(-x+x0,y+y0,1,1);
     g.fillOval(-x+x0,-y+y0,1,1);
     g.fillOval(-y+y0,-x+x0,1,1);
     g.fillOval(y+y0,-x+x0,1,1);
     g.fillOval(y+y0,x+x0,1,1);
     g.fillOval(-y+y0,x+x0,1,1);  
	 }//while

  }//MidCircle
}


//定义填充类
class Fill
{
	static int LEFT=0,RIGHT=0,TOP=0,BOTTOM=0;
    static int TAB_TERM[]=new int[600];
    static int PUSH_POINT=0,POP_POINT=0;
    Robot bt;
    int xl,xr,x_left=0,x_right=0,se_x=0,se_y=0;
    
    Fill()
    {
    	LEFT=0;
    	RIGHT=draw.width-1;
    	TOP=0;
    	BOTTOM=draw.height-1;
    	xl=0;
    	xr=0;
    } 
    
    void scan_board(draw d, int seed_x, int seed_y,Color f_color, Color g_color) 
    {
    	int x,y;  
    	x=seed_x; y=seed_y;
    	Color color=d.getBackground();
        while(true)
        {
        	--x;
        	if(x<=LEFT) break;//找左边界
            color=bt.getPixelColor(x,y);	 	      
	 	    if(!color.equals(g_color)) break;
        }
        x_left=++x;  xl=x_left;  x=seed_x;
        
        while(true)
        {
        	++x;
        	if(x>=RIGHT)break;//找右边界
            color=bt.getPixelColor(x,y);	 	      
	 	    if(!color.equals(g_color)) break;
        }
        x_right=--x; xr=x_right;
           
        (new DrawLine()).BreLine(d.g,d.buffer,f_color,0xffff,1,x_left,y,x_right,y,false); 
    }

    //将边界点入队列
    void push_x(int x_left, int x_right,int seed_y)                              
    {
    	if(PUSH_POINT>=TAB_TERM.length) PUSH_POINT=0;
        TAB_TERM[PUSH_POINT]=x_left;
        PUSH_POINT++;
        TAB_TERM[PUSH_POINT]=x_right;
        PUSH_POINT++;
        TAB_TERM[PUSH_POINT]=seed_y;
        PUSH_POINT++;
    }

    //将边界点出队列
    void pop_x()  
    {
    	if(POP_POINT>=TAB_TERM.length) POP_POINT=0;
        xl=TAB_TERM[POP_POINT];
        POP_POINT++;
        xr=TAB_TERM[POP_POINT];
        POP_POINT++;
        se_y=TAB_TERM[POP_POINT];
        POP_POINT++;
    }

  public void FillArea(draw d,Color f_color,int x,int y)
  {
    	Color color,g_color;
      	int y_up,y_down,i;
      	PUSH_POINT=0;
      	POP_POINT=0;
      	try
		{
			bt=new Robot();
		}
		catch(Exception e)
		{
			System.out.print(e.getMessage());
		}
		 
        //判断点(x,y)是否是种子
      	if(x<0||x>=RIGHT)  return;
      	if(y<0||y>=BOTTOM) return;
       	
	 	g_color=bt.getPixelColor(x,y);	 	 	  
	 	if(f_color.equals(g_color))  return;
	 	
	 	//点(x,y)是种子
	 	scan_board(d,x,y,f_color,g_color);	 	
	 	push_x(xl,xr,y);
	 	
	 	while(PUSH_POINT!=POP_POINT)//队列不为空
	 	{
	 		pop_x();
	 		y_up=se_y;
	 		y_down=se_y;
	 		if(y_up>TOP)  y_up--;
	 	    if(y_down<BOTTOM)  y_down++;
	 	
	 	    //在上一条扫描线和下一条扫描线上找种子
	 		for(i=xl;i<xr;i++)   
	 		{	 	        	 		      
                color=bt.getPixelColor(i,y_up);   
	 	        if(color.equals(g_color))
	 	        {
	 	        	scan_board(d,i,y_up,f_color,g_color);
	 	        	push_x(x_left,x_right,y_up);
	 	        }
	 	        
	 		    color=bt.getPixelColor(i,y_down);   
	 	        if(color.equals(g_color))
	 	         {
	 	         	scan_board(d,i,y_down,f_color,g_color);
	 	         	push_x(x_left,x_right,y_down);
	 	         }
	 	     }//for	 	   
	    } //While	     
    }
}  

//定义裁剪类
class Cut
{
//	static int xl=draw.x0,xr=draw.x1,yt=draw.y0,yb=draw.y1;
	static int xl=444,xr=585,yt=252,yb=366;
	Color color;
	
	public int GetCode(int x,int y,int code)
	{
		code=0;
		if(x<xl) code=code|1;
		if(x>xr) code=code|2;
		if(y>yb) code=code|4;
		if(y<yt) code=code|8;
		return code; 
	}
	 
	public void LineCut(draw d,Color col,int x0,int y0,int x1,int y1)
	{
		int code0=0,code1=0,code,x01,y01,x11,y11,xm,ym,ax,ay,bx,by;
		
		(new DrawLine()).BreLine(d.g,d.buffer,col,0xffff,1,x0,y0,x1,y1,false);//画被裁剪的线段

/*		(new DrawLine()).BreLine(d.g,d.buffer,col,0xffff,1,x0,y0,x0,y1,false);  //画矩形区域
      	(new DrawLine()).BreLine(d.g,d.buffer,col,0xffff,1,x0,y0,x1,y0,false);
      	(new DrawLine()).BreLine(d.g,d.buffer,col,0xffff,1,x1,y0,x1,y1,false);
      	(new DrawLine()).BreLine(d.g,d.buffer,col,0xffff,1,x0,y1,x1,y1,false);*/
      	
      	(new DrawLine()).BreLine(d.g,d.buffer,Color.black,0xffff,1,444,252,444,366,false);  //画矩形区域
      	(new DrawLine()).BreLine(d.g,d.buffer,Color.black,0xffff,1,444,252,585,252,false);
      	(new DrawLine()).BreLine(d.g,d.buffer,Color.black,0xffff,1,585,252,585,366,false);
      	(new DrawLine()).BreLine(d.g,d.buffer,Color.black,0xffff,1,444,366,585,366,false);
			
		code0=GetCode(x0,y0,code0);
		code1=GetCode(x1,y1,code1);
				
		if(code0==0&&code1==0) return;
		if((code0&code1)!=0) return;
		code=code0; //code记录窗口外的点
		if(code0==0)  code=code1;
	
		x01=x0; y01=y0; x11=x1; y11=y1;
		while(true)
		{
			xm=(x0+x1)/2;  
			ym=(y0+y1)/2;
			if((xm-x1)*(xm-x1)+(ym-y1)*(ym-y1)<2)
			{ ax=xm; ay=ym; break; }  //找到最近可见点(ax,ay)
			else if((x0>xr||x0<xl||y0>yb||y0<yt)&&(xm>xr||xm<xl||ym>yb||ym<yt))
			{ x0=xm; y0=ym; }  //在(xm,ym)和(x1,y1)决定的区间找
			else
			{ x1=xm; y1=ym; }  //在(x1,y1)和(xm,ym)决定的区间找
		}
 		
		x0=x01; y0=y01; x1=x11; y1=y11;
		while(true)
		{
			xm=(x0+x1)/2;  
			ym=(y0+y1)/2;
			if((xm-x0)*(xm-x0)+(ym-y0)*(ym-y0)<2)
			{ bx=xm; by=ym; break; }  //找到最近可见点(ax,ay)
			else if((x1>xr||x1<xl||y1>yb||y1<yt)&&(xm>xr||xm<xl||ym>yb||ym<yt))
			{ x1=xm; y1=ym; }  //在(x1,y1)和(xm,ym)决定的区间找
			else
			{ x0=xm; y0=ym; }  //在(xm,ym)和(x1,y1)决定的区间找
		}
		System.out.println("a:"+ax+","+ay+" b:"+bx+","+by);//????????????
		color=d.getBackground();
		(new DrawLine()).BreLine(d.g,d.buffer,color,0xffff,1,x01,y01,ax,ay,false);
		(new DrawLine()).BreLine(d.g,d.buffer,color,0xffff,1,bx,by,x11,y11,false);
//		(new DrawLine()).BreLine(d.g,d.buffer,Color.red,0xffff,1,ax,ay,bx,by,false);
	}
}

⌨️ 快捷键说明

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