这个算法比先前的算法效率提高了10倍
import java.lang.*;import javax.microedition.lcdui.*;import java.util.*;import javax.microedition.rms.*;import java.io.*;class MainPit extends Canvas implements Runnable{ Graphics gb;Image bufImg;
private int nWidth = getWidth();private int nHeight = getHeight();int[] x;int[] y;int[] id;int top,bottom;public MainPit(){try{bufImg = Image.createImage(nWidth,nHeight);}catch(Exception e){System.out.println(e+" createImage");}gb = bufImg.getGraphics();}
public void paint(Graphics g){g.drawImage(bufImg,0,0,0);}
int nodes[][] = {//8/{20,100},//0{100,40},//1{150,80},//2{60,50},//{150,110},//3{150,150},//4//{160,150},//5//{110,110},//6{50,130},//7{160,140},{60,139},{110,45}};public void sort(int nodes[][]){ int i=nodes.length; int temp1=0; int temp2=0; for(int m=0;m<i-1;m++) for(int n=0;n<i-m-1;n++) { if(nodes[n][0]>nodes[n+1][0]||(nodes[n][0]==nodes[n+1][0]&&nodes[n][1]>nodes[n+1][1])) { temp1=nodes[n][0]; temp2=nodes[n][1]; nodes[n][0]=nodes[n+1][0]; nodes[n][1]=nodes[n+1][1]; nodes[n+1][0]=temp1; nodes[n+1][1]=temp2; } }}public void sortTang(int nodes[][]){ id=new int[nodes.length-1]; int[] high=new int[id.length]; int[] low=new int[id.length]; for(int i=0;i<id.length;i++) { id[i]=-1;//序号数组 high[i]=-1; low[i]=-1; } int Htag,Ltag; Htag=0; Ltag=0; for(int i=1;i<nodes.length;i++) { if(nodes[i][1]<=nodes[0][1]) high[Htag++]=i; else low[Ltag++]=i; } for(int i=0;i<id.length;i++) { if(high[i]>0) id[i]=high[i]; else id[i]=low[Ltag-1-i+Htag]; } top=0; bottom=id.length-1;}/*判断点x2,y2是不是在指定的线段上*/public boolean cut(int x0,int y0,int x1,int y1,int x2,int y2){ if(((y1-y0)*(x2-x0)<=(y2-y0)*(x1-x0))&&((y1-y0)*(x2-x0)>=(y2-1-y0)*(x1-x0))) return true; else return false;}public int findNextPoint(int[][] nodes,int a,boolean s){ if(a==nodes.length-3) return a+2; else { if(id[top]==a+1) { top++; return id[bottom]; } else { bottom--; return id[top]; } }}public void fillPolygon(int nodes[][]){ gb.setColor(0xff0000); int tempy1=nodes[0][1]; int tempy2=0; int nextP=0; int p1=0; int p2=0; int p3=0; int p4=0; int scanp1=-1; int scanp2=-1; for(int i=0;i<nodes.length-1;i++) { nextP=0; if(nodes[i][0]<nodes[i+1][0]) { if(tempy1!=nodes[i][1]) nextP=findNextPoint(nodes,i,tempy1>=nodes[i][1]?true:false); else if((nodes[i+1][1]-nodes[i][1])*(nodes[i+2][0]-nodes[i][0])<(nodes[i+2][1]-nodes[i][1])*(nodes[i+1][0]-nodes[i][0])) nextP=findNextPoint(nodes,i,true); else nextP=findNextPoint(nodes,i,false); if((nodes[i+1][1]-nodes[nextP][1])*(nodes[i][1]-tempy1)>=0) p3=tempy1; else p3=nodes[i][1]; for(int j=0;j<nHeight;j++) { if(cut(nodes[i][0],p3,nodes[nextP][0],nodes[nextP][1],nodes[i+1][0],j)) { tempy2=j; break; } } p1=nodes[i][1]>tempy1?tempy1:nodes[i][1]; p2=p1!=tempy1?tempy1:nodes[i][1]; p3=nodes[i+1][1]>tempy2?tempy2:nodes[i+1][1]; p4=p3!=tempy2?tempy2:nodes[i+1][1]; scanp1=p1; scanp2=p2; for(int j=nodes[i][0];j<=nodes[i+1][0];j++) { for(int m=scanp1>p3?p3:scanp1;m<=(scanp1>p3?scanp1:p3);m++) { if(cut(nodes[i][0],p1,nodes[i+1][0],p3,j,m)) { scanp1=m; break; } } for(int m=scanp2>p4?p4:scanp2;m<=(scanp2>p4?scanp2:p4);m++) { if(cut(nodes[i][0],p2,nodes[i+1][0],p4,j,m)) { scanp2=m; break; } } gb.drawLine(j,scanp1,j,scanp2); } tempy1=tempy2; } else { gb.drawLine(nodes[i][0],nodes[i][1],nodes[i+1][0],nodes[i+1][1]); tempy1=nodes[i][1]; bottom--; } }}private void drawPolygon(int nodes[][]){gb.setColor(0x0000ff00);for(int i = 0; i < nodes.length; i++){gb.drawLine(nodes[i][0],nodes[i][1],nodes[i][0],nodes[i][1]);gb.drawString(String.valueOf(nodes[i][0])+"."+String.valueOf(nodes[i][1]),nodes[i][0],nodes[i][1],0);}}public void run(){x=new int[nodes.length];y=new int[nodes.length];for(int i=0;i<x.length;i++){ x[i]=nodes[i][0]; y[i]=nodes[i][1];} gb.setColor(0x00ffffff);gb.fillRect(0,0,nWidth,nHeight);gb.setColor(0);long time1=0;long time2=0;sort(nodes);sortTang(nodes);time1=System.currentTimeMillis();//fillPolygon(gb,x,y);fillPolygon(nodes);time2=System.currentTimeMillis();System.out.println(time2-time1);drawPolygon(nodes);System.out.println("done1");repaint();}
private void pause(long t){try{Thread.sleep(t);}catch(Exception e){}}public void keyPressed(int keyCode) {
} }