广交好友~~ 想要讨论的可以留下msn~~~ 希望群友网友经常能提出问题,一起解决,共同提高

凸多边形填充的办法(扫描线法)

上一篇 / 下一篇  2010-04-27 18:53:32 / 个人分类:Java&C

凸多边形填充的办法(扫描线法)
 
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();

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;
  }
 }
}
/*判断点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)
{
 int min=0;
 int max=0;
 if(a==nodes.length-3)
 return a+2;
 else
 {
  min=a+1;
  max=a+1;
  for(int j=a+2;j<NODES.LENGTH;J++)
  {
   if((nodes[j][1]-nodes[a][1])*(nodes[min][0]-nodes[a][0])<(nodes[min][1]-nodes[a][1])*(nodes[j][0]-nodes[a][0]))
   {
    min=j;
   }
   if((nodes[j][1]-nodes[a][1])*(nodes[max][0]-nodes[a][0])>(nodes[max][1]-nodes[a][1])*(nodes[j][0]-nodes[a][0]))
   {
    max=j;
   }
  }
  if(nodes[min][0]-nodes[max][0]>0)
  return min;
  else
  if(nodes[min][0]-nodes[max][0]<0)
  return max;
  else
  if(min==a+1)
  return max;
  else
  return min;
 }
}
public void fillPolygon(int nodes[][])
{
 sort(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;
 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;
    }
   }
    if((nodes[i][1]-tempy1)*(nodes[i+1][1]-tempy2)>=0)
    p3=nodes[i+1][1];
    else
    p3=tempy2;
    if(p3==nodes[i+1][1])
    p4=tempy2;
    else
    p4=nodes[i+1][1];
   
   for(int j=nodes[i][0];j<=nodes[i+1][0];j++)
   {

    for(int m=1;m<=nHeight;m++)
    {
     if(cut(nodes[i][0],nodes[i][1],nodes[i+1][0],p3,j,m))
     p1=m;
     if(cut(nodes[i][0],tempy1,nodes[i+1][0],p4,j,m))
     p2=m;
    }  
    gb.drawLine(j,p1,j,p2);
   }
   tempy1=tempy2;
  }
  else
  {
   gb.drawLine(nodes[i][0],nodes[i][1],nodes[i+1][0],nodes[i+1][1]);
   tempy1=nodes[i][1];
  }
 }
}
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()
{
gb.setColor(0x00ffffff);
gb.fillRect(0,0,nWidth,nHeight);
fillPolygon(nodes);
drawPolygon(nodes);
System.out.println("done1");
repaint();
}

private void pause(long t)
{
try{Thread.sleep(t);}catch(Exception e){}
}
public void keyPressed(int keyCode)
  {

}
}

 
 

TAG:

 

评分:0

我来说两句

Open Toolbar