Добавлен метод clip

This commit is contained in:
Victor 2014-03-02 19:00:10 +02:00
parent eca1b4cbdd
commit 50226ed4eb

View File

@ -24,6 +24,50 @@ public class Clip extends Rect {
return y + height; return y + height;
} }
public double[] clip(double x1, double y1, double x2, double y2) {
int c1 = getClipCode(x1, y1);
int c2 = getClipCode(x2, y2);
while (c1 != 0 || (c2 != 0)) {
if (c1 == 0 && c2 == 0) {
return new double[] { x1, y1, x2, y2 };
}
double dx = x2 - x1;
double dy = y2 - y1;
if (c1 != 0) {
if (x1 < x) {
y1 += dy * (x - x1) / dx;
x1 = x;
} else if (x1 > getXMax()) {
y1 += dy * (getXMax() - x1) / dx;
x1 = getXMax();
} else if (y1 < y) {
x1 += dx * (y - y1) / dy;
y1 = y;
} else if (y1 > getYMax()) {
x1 += dx * (getYMax() - y1) / dy;
y1 = getYMax();
}
c1 = getClipCode(x1, y1);
} else if (c2 != 0) {
if (x2 < x) {
y2 += dy * (x - x2) / dx;
x2 = x;
} else if (x2 > getXMax()) {
y2 += dy * (getXMax() - x2) / dx;
x2 = getXMax();
} else if (y2 < y) {
x2 += dx * (y - y2) / dy;
y2 = y;
} else if (y2 > getYMax()) {
x2 += dx * (getYMax() - y2) / dy;
y2 = getYMax();
}
c2 = getClipCode(x2, y2);
}
}
return new double[] { x1, y1, x2, y2 };
}
public int getClipCode(double x, double y) { public int getClipCode(double x, double y) {
int xmin = (x < super.x) ? 1 : 0; int xmin = (x < super.x) ? 1 : 0;
int xmax = (x > getXMax()) ? 1 : 0; int xmax = (x > getXMax()) ? 1 : 0;