package org.geogebra.common.kernel.implicit;
import org.geogebra.common.kernel.Matrix.Coords;
class Rect {
/**
*
*/
// private final GeoImplicitCurve geoImplicitCurve;
/**
* {top, right, bottom, left}
*/
final double[] evals = new double[4];
int x;
int y;
int shares;
int status;
double fx;
double fy;
boolean singular;
Coords coords = new Coords(3);
Rect[] children;
public void set(int x, int y, double fx, double fy, boolean singular) {
this.x = x;
this.y = y;
this.fx = fx;
this.fy = fy;
this.singular = singular;
this.shares = 0;
}
public void set(Rect r) {
this.set(r.x, r.y, r.fx, r.fy, r.singular);
this.shares = r.shares;
this.coords.set(r.coords);
for (int i = 0; i < 4; i++) {
this.evals[i] = r.evals[i];
}
}
public Rect[] split(GeoImplicitCurve geoImplicitCurve, int factor) {
if (this.children == null) {
this.children = new Rect[4];
for (int i = 0; i < 4; i++) {
this.children[i] = new Rect();
}
}
Rect[] rect = this.children;
double fx2 = fx * 0.5;
double fy2 = fy * 0.5;
double x1 = this.coords.val[0];
double y1 = this.coords.val[1];
for (int i = 0; i < 4; i++) {
rect[i].set(x, y, fx2, fy2, singular);
rect[i].coords.set(x1, y1, 0.0);
rect[i].evals[i] = this.evals[i];
rect[i].shares = this.shares & GeoImplicitCurve.MASK[i];
}
rect[1].coords.val[0] += fx2;
rect[2].coords.val[0] += fx2;
rect[2].coords.val[1] += fy2;
rect[3].coords.val[1] += fy2;
rect[1].evals[0] = geoImplicitCurve.evaluate(rect[1].coords.val,
factor);
rect[2].evals[0] = geoImplicitCurve.evaluate(rect[2].coords.val,
factor);
rect[2].evals[1] = geoImplicitCurve.evaluate(x1 + fx, y1 + fy2, factor);
rect[2].evals[3] = geoImplicitCurve.evaluate(x1 + fx2, y1 + fy, factor);
rect[3].evals[0] = geoImplicitCurve.evaluate(rect[3].coords.val,
factor);
rect[3].evals[1] = rect[0].evals[2] = rect[1].evals[3] = rect[2].evals[0];
rect[0].evals[1] = rect[1].evals[0];
rect[0].evals[3] = rect[3].evals[0];
rect[1].evals[2] = rect[2].evals[1];
rect[3].evals[2] = rect[2].evals[3];
return rect;
}
public double x1() {
return this.coords.val[0];
}
public double x2() {
return this.coords.val[0] + fx;
}
public double y1() {
return this.coords.val[1];
}
public double y2() {
return this.coords.val[1] + fy;
}
}