计算机图形学代码PixelWindow
import java.awt.*; import java.applet.Applet; public class Sutherland_Cohen extends Applet{ int xL=100,xR=300,yB=100,yT=400;//设置四个边界public int code(float x,float y){ int c=0; if(xxR) c=c|2;//在右边,第二位为一if(yyT) c=c|8;//在上边,第四位为一return c; } public void sutherland_cohen(Graphics g,float x0,float y0,float x2,float y2){ int c1,c2,c; float x,y,wx,wy; boolean accept=false,done=false; c1=code(x0,y0); c2=code(x2,y2); do { if ((c1|c2)==0)//两个编码都为0,表明在窗口内{ accept=true; done=true; } else if((c1&c2)!=0)done=true;//两个编码的某一位为1,则必然在外侧显然在窗口外else { c=c1; if(c==0)c=c2;//选一个在外边的点wx=x2-x0; wy=y2-y0; if ((c&8)==8) {//在上边,求与上边界的交点x=x0+wx*(yT-y0)/wy; y=yT; } else if ((c&4)==4) {//在下边,求与下边界的交点x=x0+wx*(yB-y0)/wy; y=yB; } else if ((c&1)==1) {//在左边,求与右边界的交点y=y0+wy*(xL-x0)/wx; x=xL; }else//即(c&2)==2 {//在右边,求与右边界的交点y=y0+wx*(xR-x0)/wx; x=xR; } if (c==c1) {//起点不再窗口内,将交点作为新起点x0=x; y0=y; c1=code(x0,y0); } else {//中点不再窗口内,将交点作为新终点x2=x; y2=y; c2=code(x2,y2); } }//else } while (done==false); if(accept)g.drawLine((int)x0,(int)y0,(int)x2,(int)y2); } public void paint(Graphics g){ //Graphics2D g2=(Graphics2D)g;//强制转化为Graphics2D类型的对象g.setColor(Color.red); //分别画四条边框g.drawLine((int)xL,(int)yB,(int)xL,(int)yT); g.drawLine((int)xL,(int)yB,(int)xR,(int)yB); g.drawLine((int)xL,(int)yT,(int)xR,(int)yT); g.drawLine((int)xR,(int)yB,(int)xR,(int)yT); g.setColor(Color.blue); g.drawLine(10,420,420);//画需要裁减的直线g.setColor(Color.green); sutherland_cohen(g,10,420);//调用裁减方法} }
706B
文件大小:
评论区