📄 draw_cut.java
字号:
}//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 + -