JAVA 스캐너 구현 알고리즘(초 상세)

먼저 말씀 드 리 지만 교과서 의 스캐닝 라인 알고리즘 은 확실히 c++로 잘 실현 되 었 고 인터넷 에 소스 코드 가 많 았 습 니 다.자바 가 실현 하 는 것 은 거의(내 가 보지 못 했 을 수도 있 습 니 다)가 없 었 기 때문에 쇼 씨 는 자신 이 코드(실험 숙제 는 이것 을 쓰 고 자신 은 자바 의 원숭이 0.0)를 쓰 려 고 했 습 니 다.
스캐닝 라인 의 실현 과정 에 대해 저 는 여기 서 책 에 있 는 내용(직접 보 러 가기)만 대충 이야기 하고 주로 자신 이 실현 할 때 알고리즘 의 변경 과 실현 방법 을 말씀 드 리 겠 습 니 다.
스캐닝 라인 알고리즘:말 그대로 Ymin 부터 스 캔 한 다음 에 NET 를 구축 한 다음 에 NET 에 따라 AET 를 만 드 는 것 입 니 다.
그림 붙 이기:

실현 할 때 먼저 구조 NET 입 니 다.자바 에 게 c++처럼 지침 을 직접 사용 할 수 없 기 때문에 저 는 대상 배열 과 Node 류(다음 코드)로 배열+지침 과 유사 한 데이터 구 조 를 구 조 했 습 니 다.NET 을 실현 한 후에 NET 을 통 해 AET 를 실현 하기 시 작 했 습 니 다.여기 서 저 는 실현 방식 을 바 꾸 었 습 니 다.교과서 에 스 캔 라인 을 한 번 씩 옮 겨 다 니 고 NET 을 AET 에 삽입 한 후에 정렬 하 는 등 일련의 작업 을 했 습 니 다.저 는 제 가 쓴 데이터 구조 이기 때문에 표를 책 에 있 는 방식 으로 다시 만 들 면 마지막 에 링크 정렬 등 일련의 작업 을 해 야 합 니 다.그래서 저 는 Arraylist 를 포함 하 는 대상 배열 로 대 체 했 습 니 다.내 방법 은 NET 부터 모든 노드 를 옮 겨 다 니 며 노드 를 얻 은 후에 그것 과 자신 이 나중에 설명 할 AET 의 노드(예 를 들 어 현재 스캐닝 라인 y=0 노드)를 삽입 하 는 것 이다.  X:1 dx:-1  Ymax:3 그 다음 에 AET 를 삽입 하 는 게 0 이에 요.-1,1.  화해시키다   -1  -1  2)이 노드 들 을 순서대로 AET 가 스 캔 라인 위치 에 있 는 대상 배열 의 list 에 삽입 하고 NET 의 노드 를 모두 옮 긴 다음 에 AET 의 각 대상 배열 의 list 를 정렬 합 니 다.마지막 으로 NET 에서 인쇄 를 받 았 습 니 다.
코드 붙 이기(학습 교류 참조):

package PolygonScanningAndFilling;
public class Node {    //     x,dx,yMax
  public int x;
  public float dx;
  public int yMax;
  public Node next;
  public int ymin;
  public Node(int x, int dx, int yMax){
    this.x=x;
    this.dx=dx;
    this.yMax=yMax;
  }
  public void getYmin(int Ymin){
    this.ymin=Ymin;
  }
}
package PolygonScanningAndFilling;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class classAndArray {
  public List<Integer> list = new ArrayList<Integer>();
  public classAndArray(){
  }
  public void listSort() {
    Collections.sort(list);
  }
}
package PolygonScanningAndFilling;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
public class PolygonScanning extends JPanel {
  static int X0;
  static int Y0;
  static int X1;
  static int Y1;
  static int a[]=new int [10];    //     10 x  
  static int b[]=new int [10];    //     10 y  
  static int index=0;
  static int time=0;  
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    this.addMouseListener(new MouseAdapter() {     
      public void mouseExited(MouseEvent e) {
          time++;
          repaint();  
      }   
  });
    Graphics2D g2d = (Graphics2D)g;
    int Ymax=0;
    for(int i=0;i<b.length;i++)
    {
      if(Ymax<b[i])
        Ymax=b[i];  
    }
    // System.out.println("Ymax"+Ymax);
    /*
     *      
     */
       int Sum=0;
       for(;Sum<=index;Sum++) {
         if(Sum==index-1)
          {
             g2d.drawLine(a[Sum], b[Sum], a[0],b[0]);
             break;
          }
         else   
           { 
           g2d.drawLine(a[Sum], b[Sum], a[Sum+1],b[Sum+1]); 
           }
       }
      if(time!=0) {
       Node [] head =new Node [Ymax];    //             
       for(int i=0;i<index-1;i++)
       {
         if(b[i]<b[i+1])          //                  
         {
           if(head[b[i]]==null)
             head[b[i]]=new Node(0,0,0);
             head[b[i]].ymin=b[i];
             if(head[b[i]].next==null)    //           
               {  
                 head[b[i]].next=new Node(0,0,0);
                 head[b[i]].next.x=a[i];
                 head[b[i]].next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
                 head[b[i]].next.yMax=b[i+1];    //ymax     y
               }
             else {                //            
                   if(head[b[i]].next.next==null)
                   head[b[i]].next.next=new Node(0,0,0);
                   if((float)(a[i]-a[i+1])/(b[i]-b[i+1])<head[b[i]].next.dx)  //    x        x 
                   {
                     head[b[i]].next.next.x=head[b[i]].next.x;
                     head[b[i]].next.next.dx=head[b[i]].next.dx;
                     head[b[i]].next.next.yMax=head[b[i]].next.yMax;
                     head[b[i]].next.x=a[i];
                     head[b[i]].next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
                     head[b[i]].next.yMax=b[i+1];
                   }
                   else
                   {
                     head[b[i]].next.next.x=a[i];
                     head[b[i]].next.next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
                     head[b[i]].next.next.yMax=b[i+1];
                   }
               }
         }
         else
         {  
           if(head[b[i+1]]==null)
           head[b[i+1]]=new Node(0,0,0);
           head[b[i+1]].ymin=b[i+1];
           if(head[b[i+1]].next==null)    //           
           {  
             head[b[i+1]].next=new Node(0,0,0);
             head[b[i+1]].next.x=a[i+1];
             head[b[i+1]].next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
             head[b[i+1]].next.yMax=b[i];    //ymax     y
           }
           else {                //            
               if(head[b[i+1]].next.next==null)
                 head[b[i+1]].next.next=new Node(0,0,0);
               if((float)(a[i]-a[i+1])/(b[i]-b[i+1])<head[b[i+1]].next.dx)  //    x        x 
               {
                 head[b[i+1]].next.next.x=head[b[i+1]].next.x;
                 head[b[i+1]].next.next.dx=(float)head[b[i+1]].next.dx;
                 head[b[i+1]].next.next.yMax=head[b[i+1]].next.yMax;
                 head[b[i+1]].next.x=a[i+1];
                 head[b[i+1]].next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
                 head[b[i+1]].next.yMax=b[i];
               }
               else
               {
                 head[b[i+1]].next.next.x=a[i+1];
                 head[b[i+1]].next.next.dx=(float)(a[i]-a[i+1])/(b[i]-b[i+1]);
                 head[b[i+1]].next.next.yMax=b[i];
               }
           }
         }
       }
       if(index>0)
       {  if(b[0]<b[index-1])          //           
         {
           if(head[b[0]]==null)
             head[b[0]]=new Node(0,0,0);
             head[b[0]].ymin=b[0];
             if(head[b[0]].next==null)    //           
               {  
                 head[b[0]].next=new Node(0,0,0);
                 head[b[0]].next.x=a[0];
                 head[b[0]].next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
                 head[b[0]].next.yMax=b[index-1];    //ymax     y
               }
             else {                //            
                 if(head[b[0]].next.next==null)
                   head[b[0]].next.next=new Node(0,0,0);
                   if((float)(a[0]-a[index-1])/(b[0]-b[index-1])<head[b[0]].next.dx)  //    x        x 
                   {
                     head[b[0]].next.next.x=head[b[0]].next.x;
                     head[b[0]].next.next.dx=head[b[0]].next.dx;
                     head[b[0]].next.next.yMax=head[b[0]].next.yMax;
                     head[b[0]].next.x=a[0];
                     head[b[0]].next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
                     head[b[0]].next.yMax=b[index-1];
                   }
                   else
                   {
                     head[b[0]].next.next.x=a[0];
                     head[b[0]].next.next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
                     head[b[0]].next.next.yMax=b[index-1];
                   }
               }
         }
         else
         {  
           if(head[b[index-1]]==null)
           head[b[index-1]]=new Node(0,0,0);
           head[b[index-1]].ymin=b[index-1];
           if(head[b[index-1]].next==null)    //           
           {  
             head[b[index-1]].next=new Node(0,0,0);
             head[b[index-1]].next.x=a[index-1];
             head[b[index-1]].next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
             head[b[index-1]].next.yMax=b[0];    //ymax     y
           }
           else {                //            
               if(head[b[index-1]].next.next==null)
               head[b[index-1]].next.next=new Node(0,0,0);
               if((float)(a[0]-a[index-1])/(b[0]-b[index-1])<head[b[index-1]].next.dx)  //    x        x 
               {
                 head[b[index-1]].next.next.x=head[b[index-1]].next.x;
                 head[b[index-1]].next.next.dx=head[b[index-1]].next.dx;
                 head[b[index-1]].next.next.yMax=head[b[index-1]].next.yMax;
                 head[b[index-1]].next.x=a[index-1];
                 head[b[index-1]].next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
                 head[b[index-1]].next.yMax=b[0];
               }
               else
               {
                 head[b[index-1]].next.next.x=a[index-1];
                 head[b[index-1]].next.next.dx=(float)(a[0]-a[index-1])/(b[0]-b[index-1]);
                 head[b[index-1]].next.next.yMax=b[0];
               }
           }
         }
       }
     for(int i=0;i<Ymax;i++)
       if(head[i]!=null)
         while(head[i].next!=null)
         {  System.out.println("   y"+head[i].ymin+"   x"+head[i].next.x+"   dx"+head[i].next.dx+"   yMax"+head[i].next.yMax);
           if(head[i].next.next!=null)
           {
             System.out.println("  "+"   y"+head[i].ymin+"   x"+head[i].next.next.x+"   dx"+head[i].next.next.dx+"   yMax"+head[i].next.next.yMax);
           }
           break;
         }
     int YMIN=b[0];
    for(int i=0;i<b.length;i++)
    {
      if(YMIN>b[i]&&b[i]!=0)
        YMIN=b[i];
    }
    classAndArray [] ca=new classAndArray [Ymax];
    for(int i=YMIN;i<Ymax;i++)  
      ca[i]=new classAndArray();
    //          ca        
      for(int i=0;i<Ymax;i++)
       {
          if(head[i]!=null)
           if(head[i].next!=null)
           {  
             //System.out.println("   y"+head[i].ymin+"   x"+head[i].next.x+"   dx"+head[i].next.dx+"   yMax"+head[i].next.yMax);
               for(int j=head[i].ymin;j<head[i].next.yMax;j++)
               {
                 ca[i+j-head[i].ymin].list.add(head[i].next.x+(int)(0.5+((j-head[i].ymin)*head[i].next.dx)));
                 //System.out.print("ca[i+j-head[i].ymin] "+(i+j-head[i].ymin)+"  "+ca[i+j-head[i].ymin].list.toString());
                 //System.out.println("Ymin "+i+" x "+(head[i].next.x+(j-head[i].ymin)*head[i].next.dx));
               }
             if(head[i].next.next!=null)
             {
               for(int j=head[i].ymin;j<head[i].next.next.yMax;j++)
               {
                 ca[i+j-head[i].ymin].list.add(head[i].next.next.x+(int)(0.5+(j-head[i].ymin)*head[i].next.next.dx));
                 //System.out.print("next ca[i+j-head[i].ymin] "+(i+j-head[i].ymin)+"  "+ca[i+j-head[i].ymin].list.toString());
                 //System.out.println("Ymin "+i+" x "+head[i].next.next.x+(j-head[i].ymin)*head[i].next.next.dx);
               }
               //System.out.println("  "+"   y"+head[i].ymin+"   x"+head[i].next.next.x+"   dx"+head[i].next.next.dx+"   yMax"+head[i].next.next.yMax);
             }
           }
       }
// 
      for(int i=YMIN;i<Ymax;i++)  
      {
        ca[i].listSort();
       for (int j = 0; j < ca[i].list.size(); j++) {
             if(j%2==0||(j==0))
             {
               g2d.drawLine(ca[i].list.get(j), i, ca[i].list.get(j+1), i);
             }
           }
        System.out.println(ca[i].list.toString());
      }     
   }
  }  
  private static void createAndShowGUI() {
    JFrame frame = new JFrame(); 
    frame.setLocationRelativeTo(null);
    frame.setLayout(null);
    JPanel jp=new JPanel();  
    frame.setContentPane(jp); 
    frame.setVisible(true);
     frame.addMouseListener(new MouseAdapter() {
        });
    jp.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
          if(e.getButton() == e.BUTTON1)
          {a[index]=e.getX();
          b[index]=e.getY();
          System.out.println("   ("+a[index]+","+b[index]+")");
          index++;    
          frame.setVisible(true);
          }          
          if(e.getButton() == e.BUTTON3)
          {            
            frame.setContentPane(new PolygonScanning());
            frame.setVisible(true);
          }
        }
    }
        );
   frame.setSize(600, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
  public static void main(String[] args) throws IOException {
    createAndShowGUI();
  }
}
 효과 캡 처(먼저 패 널 에서 점 을 클릭 하고 오른쪽 단 추 를 누 르 면 채 워 야 할 윤곽 이 나타 나 며 마 우 스 를 패 널 로 옮 겨 채 웁 니 다)
 


 총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 JAVA 스 캔 라인 알고리즘 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기