package com.photoshare.polygonfill;
import java.util.ArrayList;
/*
* ��;����̬ɨ������
*/
class AELvertex {
double x;
double y;
double dx;// б�ʵĵ���
public void copy() {
}
};
/*
* ��;��������
*/
class Polygon {
boolean isComplete;// ����ֵ��ʾ��ǰ������Ƿ�滭���
ArrayList<Point> points;// ����εĵ㼯
Polygon() {
isComplete = false;
}
};
public class PolygonFill {
static int width;
static int height;
DrawLineDelegate delegate = null;
public PolygonFill(int width, int height, DrawLineDelegate d) {
PolygonFill.width = width;
PolygonFill.height = height;
this.delegate = d;
}
public PolygonFill(int width, int height) {
PolygonFill.width = width;
PolygonFill.height = height;
}
void add(ArrayList r1, ArrayList r2) {
for (int i = 0; i < r2.size(); i++) {
r1.add(r2.get(i));
}
}
static void swap(AELvertex v1, AELvertex v2) {
double i;
i = v1.x;
v1.x = v2.x;
v2.x = i;
i = v1.dx;
v1.dx = v2.dx;
v2.dx = i;
i = v1.y;
v1.y = v2.y;
v2.y = i;
}
static void sort(ArrayList<AELvertex> rel) {
for (int i = 0; i < rel.size(); i++) {
for (int k = 0; k < rel.size() - 1; k++) {
if (rel.get(k).x > rel.get(k + 1).x) {
swap(rel.get(k), rel.get(k + 1));
}
if (rel.get(k).x == rel.get(k + 1).x) {
if (rel.get(k).dx > rel.get(k + 1).dx) {
swap(rel.get(k), rel.get(k + 1));
}
}
}
}
}
public void polygonFill(ArrayList<Point> polygon) {
ArrayList et[] = new ArrayList[height];
ArrayList<AELvertex> p;
AELvertex q;
for (int j = 0; j < height; j++)
et[j] = null;
int k = 0;
for (int i = 0; i < polygon.size(); i++) {
p = new ArrayList<AELvertex>();
q = new AELvertex();
if (polygon.get(i).y < polygon.get((i + 1) % polygon.size()).y) {
k = polygon.get(i).y;
q.x = polygon.get(i).x;
q.y = polygon.get((i + 1) % polygon.size()).y;
q.dx = (polygon.get(i).x * 1.0 - polygon.get((i + 1)
% polygon.size()).x * 1.0)
/ (polygon.get(i).y * 1.0 - polygon.get((i + 1)
% polygon.size()).y * 1.0);
}
if (polygon.get(i).y > polygon.get((i + 1) % polygon.size()).y) {
k = polygon.get((i + 1) % polygon.size()).y;
q.x = polygon.get((i + 1) % polygon.size()).x;
q.y = polygon.get(i).y;
q.dx = (polygon.get(i).x * 1.0 - polygon.get((i + 1)
% polygon.size()).x * 1.0)
/ (polygon.get(i).y * 1.0 - polygon.get((i + 1)
% polygon.size()).y * 1.0);
}
if (et[k] == null) {
p.add(q);
et[k] = p;
} else {
et[k].add(q);
}
}
ArrayList<AELvertex> AEL = new ArrayList<AELvertex>();
AELvertex startAEL = new AELvertex();
startAEL.x = 0;
startAEL.dx = 0;
startAEL.y = height;
AELvertex endAEL = new AELvertex();
endAEL.x = width;
endAEL.dx = 0;
endAEL.y = height;
AEL.add(startAEL);
AEL.add(endAEL);
for (int i = 0; i < height; i++) {
if (et[i] != null) {
add(AEL, et[i]);
et[i] = null;
sort(AEL);
}
if (AEL.size() > 0) {
for (int j = 0; j < AEL.size(); j++) {
k = (int) AEL.get(j).y;
if (k <= i) {
AEL.remove(j);
j--;
}
}
AELvertex temp1 = null;
AELvertex temp2 = null;
for (int j = 0; j < AEL.size() - 1; j += 2) {
temp1 = AEL.get(j);
temp2 = AEL.get(j + 1);
int a, b;
a = (int) (temp1.x + 0.5);
b = (int) (temp2.x + 0.5);
delegate.line(a, i, b, i);
temp1.x = temp1.x + temp1.dx;
temp2.x = temp2.x + temp2.dx;
}
}
}
}
}