JAVA 스캐너 구현 알고리즘(초 상세)
스캐닝 라인 의 실현 과정 에 대해 저 는 여기 서 책 에 있 는 내용(직접 보 러 가기)만 대충 이야기 하고 주로 자신 이 실현 할 때 알고리즘 의 변경 과 실현 방법 을 말씀 드 리 겠 습 니 다.
스캐닝 라인 알고리즘:말 그대로 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 스 캔 라인 알고리즘 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.