home *** CD-ROM | disk | FTP | other *** search
- package sun.awt.geom;
-
- import java.awt.geom.CubicCurve2D;
- import java.awt.geom.PathIterator;
- import java.awt.geom.QuadCurve2D;
- import java.awt.geom.Rectangle2D;
- import java.util.Vector;
-
- public abstract class Curve {
- public static final int INCREASING = 1;
- public static final int DECREASING = -1;
- protected int direction;
- public static final double TMIN = 0.001;
-
- public static void insertMove(Vector var0, double var1, double var3) {
- var0.add(new Order0(var1, var3));
- }
-
- public static void insertLine(Vector var0, double var1, double var3, double var5, double var7) {
- if (var3 < var7) {
- var0.add(new Order1(var1, var3, var5, var7, 1));
- } else if (var3 > var7) {
- var0.add(new Order1(var5, var7, var1, var3, -1));
- }
-
- }
-
- public static void insertQuad(Vector var0, double var1, double var3, double[] var5) {
- double var6 = var5[3];
- if (var3 > var6) {
- Order2.insert(var0, var5, var5[2], var6, var5[0], var5[1], var1, var3, -1);
- } else {
- if (var3 == var6 && var3 == var5[1]) {
- return;
- }
-
- Order2.insert(var0, var5, var1, var3, var5[0], var5[1], var5[2], var6, 1);
- }
-
- }
-
- public static void insertCubic(Vector var0, double var1, double var3, double[] var5) {
- double var6 = var5[5];
- if (var3 > var6) {
- Order3.insert(var0, var5, var5[4], var6, var5[2], var5[3], var5[0], var5[1], var1, var3, -1);
- } else {
- if (var3 == var6 && var3 == var5[1] && var3 == var5[3]) {
- return;
- }
-
- Order3.insert(var0, var5, var1, var3, var5[0], var5[1], var5[2], var5[3], var5[4], var6, 1);
- }
-
- }
-
- public static int crossingsForLine(double var0, double var2, double var4, double var6, double var8, double var10) {
- if (var6 > var10) {
- return 0 - crossingsForLine(var0, var2, var8, var10, var4, var6);
- } else if (var6 == var10) {
- return 0;
- } else if (!(var2 < var6) && !(var2 >= var10)) {
- if (var0 >= var4 && var0 >= var8) {
- return 0;
- } else {
- double var12 = (var2 - var6) / (var10 - var6);
- return var0 < var4 + var12 * (var8 - var4) ? 1 : 0;
- }
- } else {
- return 0;
- }
- }
-
- public static int crossingsForQuad(double var0, double var2, double var4, double var6, double[] var8) {
- double var9 = var8[0];
- double var11 = var8[1];
- double var13 = var8[2];
- double var15 = var8[3];
- if (var2 < var6 && var2 < var11 && var2 < var15) {
- return 0;
- } else if (var2 >= var6 && var2 >= var11 && var2 >= var15) {
- return 0;
- } else if (var0 >= var4 && var0 >= var9 && var0 >= var13) {
- return 0;
- } else if (var0 < var4 && var0 < var9 && var0 < var13) {
- if (var6 < var15) {
- return var2 >= var6 && var2 < var15 ? 1 : 0;
- } else if (!(var15 < var6)) {
- return 0;
- } else {
- return var2 >= var15 && var2 < var6 ? -1 : 0;
- }
- } else {
- double[] var17 = new double[3];
- double[] var18 = new double[3];
- Order2.getEqn(var17, var4, var8[0], var8[2]);
- Order2.getEqn(var18, var6, var8[1], var8[3]);
- System.arraycopy(var18, 0, var8, 0, 3);
- var8[0] -= var2;
- int var19 = QuadCurve2D.solveQuadratic(var8, var8);
- int var20 = 0;
-
- for(int var21 = 0; var21 < var19; ++var21) {
- double var22 = var8[var21];
- if (var22 >= (double)0.0F && var22 <= (double)1.0F) {
- double var24 = (var17[2] * var22 + var17[1]) * var22 + var17[0];
- if (var0 <= var24) {
- var24 = (double)2.0F * var18[2] * var22 + var18[1];
- if (var24 > (double)0.0F) {
- ++var20;
- } else if (var24 < (double)0.0F) {
- --var20;
- }
- }
- }
- }
-
- return var20;
- }
- }
-
- public static int crossingsForCubic(double var0, double var2, double var4, double var6, double[] var8) {
- double var9 = var8[0];
- double var11 = var8[1];
- double var13 = var8[2];
- double var15 = var8[3];
- double var17 = var8[4];
- double var19 = var8[5];
- if (var2 < var6 && var2 < var11 && var2 < var15 && var2 < var19) {
- return 0;
- } else if (var2 >= var6 && var2 >= var11 && var2 >= var15 && var2 >= var19) {
- return 0;
- } else if (var0 >= var4 && var0 >= var9 && var0 >= var13 && var0 >= var17) {
- return 0;
- } else if (var0 < var4 && var0 < var9 && var0 < var13 && var0 < var17) {
- if (var6 < var19) {
- return var2 >= var6 && var2 < var19 ? 1 : 0;
- } else if (!(var19 < var6)) {
- return 0;
- } else {
- return var2 >= var19 && var2 < var6 ? -1 : 0;
- }
- } else {
- double[] var21 = new double[4];
- double[] var22 = new double[4];
- Order3.getEqn(var21, var4, var8[0], var8[2], var8[4]);
- Order3.getEqn(var22, var6, var8[1], var8[3], var8[5]);
- System.arraycopy(var22, 0, var8, 0, 4);
- var8[0] -= var2;
- int var23 = CubicCurve2D.solveCubic(var8, var8);
- int var24 = 0;
-
- for(int var25 = 0; var25 < var23; ++var25) {
- double var26 = var8[var25];
- if (var26 >= (double)0.0F && var26 <= (double)1.0F) {
- double var28 = ((var21[3] * var26 + var21[2]) * var26 + var21[1]) * var26 + var21[0];
- if (var0 <= var28) {
- var28 = ((double)3.0F * var22[3] * var26 + (double)2.0F * var22[2]) * var26 + var22[1];
- if (var28 > (double)0.0F) {
- ++var24;
- } else if (var28 < (double)0.0F) {
- --var24;
- }
- }
- }
- }
-
- return var24;
- }
- }
-
- public static int crossingsForPath(PathIterator var0, double var1, double var3) {
- double var5 = (double)0.0F;
- double var7 = (double)0.0F;
- double var9 = (double)0.0F;
- double var11 = (double)0.0F;
- int var17 = 0;
-
- for(double[] var18 = new double[6]; !var0.isDone(); var0.next()) {
- switch (var0.currentSegment(var18)) {
- case 0:
- if (var11 != var7) {
- var17 += crossingsForLine(var1, var3, var9, var11, var5, var7);
- }
-
- var5 = var9 = var18[0];
- var7 = var11 = var18[1];
- break;
- case 1:
- double var20 = var18[0];
- double var22 = var18[1];
- var17 += crossingsForLine(var1, var3, var9, var11, var20, var22);
- var9 = var20;
- var11 = var22;
- break;
- case 2:
- double var19 = var18[2];
- double var21 = var18[3];
- var17 += crossingsForQuad(var1, var3, var9, var11, var18);
- var9 = var19;
- var11 = var21;
- break;
- case 3:
- double var13 = var18[4];
- double var15 = var18[5];
- var17 += crossingsForCubic(var1, var3, var9, var11, var18);
- var9 = var13;
- var11 = var15;
- break;
- case 4:
- if (var11 != var7) {
- var17 += crossingsForLine(var1, var3, var9, var11, var5, var7);
- }
-
- var9 = var5;
- var11 = var7;
- }
- }
-
- if (var11 != var7) {
- var17 += crossingsForLine(var1, var3, var9, var11, var5, var7);
- }
-
- return var17;
- }
-
- public Curve(int var1) {
- this.direction = var1;
- }
-
- public final int getDirection() {
- return this.direction;
- }
-
- public final Curve getWithDirection(int var1) {
- return this.direction == var1 ? this : this.getReversedCurve();
- }
-
- public static double round(double var0) {
- return var0;
- }
-
- public static double firstValidRoot(double[] var0, int var1) {
- for(int var2 = 0; var2 < var1; ++var2) {
- double var3 = var0[var2];
- if (var3 >= (double)0.0F && var3 <= (double)1.0F) {
- return var3;
- }
- }
-
- return (double)0.0F;
- }
-
- public static int orderof(double var0, double var2) {
- if (var0 < var2) {
- return -1;
- } else {
- return var0 > var2 ? 1 : 0;
- }
- }
-
- public static long signeddiffbits(double var0, double var2) {
- return Double.doubleToLongBits(var0) - Double.doubleToLongBits(var2);
- }
-
- public static long diffbits(double var0, double var2) {
- return Math.abs(Double.doubleToLongBits(var0) - Double.doubleToLongBits(var2));
- }
-
- public static double prev(double var0) {
- return Double.longBitsToDouble(Double.doubleToLongBits(var0) - 1L);
- }
-
- public static double next(double var0) {
- return Double.longBitsToDouble(Double.doubleToLongBits(var0) + 1L);
- }
-
- public String toString() {
- return "Curve[" + this.getOrder() + ", " + "(" + round(this.getX0()) + ", " + round(this.getY0()) + "), " + this.controlPointString() + "(" + round(this.getX1()) + ", " + round(this.getY1()) + "), " + (this.direction == 1 ? "D" : "U") + "]";
- }
-
- public String controlPointString() {
- return "";
- }
-
- public abstract int getOrder();
-
- public abstract double getXTop();
-
- public abstract double getYTop();
-
- public abstract double getXBot();
-
- public abstract double getYBot();
-
- public abstract double getXMin();
-
- public abstract double getXMax();
-
- public abstract double getX0();
-
- public abstract double getY0();
-
- public abstract double getX1();
-
- public abstract double getY1();
-
- public abstract double XforY(double var1);
-
- public abstract double TforY(double var1);
-
- public abstract double XforT(double var1);
-
- public abstract double YforT(double var1);
-
- public abstract double dXforT(double var1, int var3);
-
- public abstract double dYforT(double var1, int var3);
-
- public abstract double nextVertical(double var1, double var3);
-
- public int crossingsFor(double var1, double var3) {
- return !(var3 >= this.getYTop()) || !(var3 < this.getYBot()) || !(var1 < this.getXMax()) || !(var1 < this.getXMin()) && !(var1 < this.XforY(var3)) ? 0 : 1;
- }
-
- public boolean accumulateCrossings(Crossings var1) {
- double var2 = var1.getXHi();
- if (this.getXMin() >= var2) {
- return false;
- } else {
- double var4 = var1.getXLo();
- double var6 = var1.getYLo();
- double var8 = var1.getYHi();
- double var10 = this.getYTop();
- double var12 = this.getYBot();
- double var14;
- double var16;
- if (var10 < var6) {
- if (var12 <= var6) {
- return false;
- }
-
- var16 = var6;
- var14 = this.TforY(var6);
- } else {
- if (var10 >= var8) {
- return false;
- }
-
- var16 = var10;
- var14 = (double)0.0F;
- }
-
- double var18;
- double var20;
- if (var12 > var8) {
- var20 = var8;
- var18 = this.TforY(var8);
- } else {
- var20 = var12;
- var18 = (double)1.0F;
- }
-
- boolean var22 = false;
- boolean var23 = false;
-
- while(true) {
- double var24 = this.XforT(var14);
- if (var24 < var2) {
- if (var23 || var24 > var4) {
- return true;
- }
-
- var22 = true;
- } else {
- if (var22) {
- return true;
- }
-
- var23 = true;
- }
-
- if (var14 >= var18) {
- if (var22) {
- var1.record(var16, var20, this.direction);
- }
-
- return false;
- }
-
- var14 = this.nextVertical(var14, var18);
- }
- }
- }
-
- public abstract void enlarge(Rectangle2D var1);
-
- public Curve getSubCurve(double var1, double var3) {
- return this.getSubCurve(var1, var3, this.direction);
- }
-
- public abstract Curve getReversedCurve();
-
- public abstract Curve getSubCurve(double var1, double var3, int var5);
-
- public int compareTo(Curve var1, double[] var2) {
- double var3 = var2[0];
- double var5 = var2[1];
- var5 = Math.min(Math.min(var5, this.getYBot()), var1.getYBot());
- if (var5 <= var2[0]) {
- System.err.println("this == " + this);
- System.err.println("that == " + var1);
- System.out.println("target range = " + var2[0] + "=>" + var2[1]);
- throw new InternalError("backstepping from " + var2[0] + " to " + var5);
- } else {
- var2[1] = var5;
- if (this.getXMax() <= var1.getXMin()) {
- return this.getXMin() == var1.getXMax() ? 0 : -1;
- } else if (this.getXMin() >= var1.getXMax()) {
- return 1;
- } else {
- double var7 = this.TforY(var3);
- double var9 = this.YforT(var7);
- if (var9 < var3) {
- var7 = this.refineTforY(var7, var9, var3);
- var9 = this.YforT(var7);
- }
-
- double var11 = this.TforY(var5);
- if (this.YforT(var11) < var3) {
- var11 = this.refineTforY(var11, this.YforT(var11), var3);
- }
-
- double var13 = var1.TforY(var3);
- double var15 = var1.YforT(var13);
- if (var15 < var3) {
- var13 = var1.refineTforY(var13, var15, var3);
- var15 = var1.YforT(var13);
- }
-
- double var17 = var1.TforY(var5);
- if (var1.YforT(var17) < var3) {
- var17 = var1.refineTforY(var17, var1.YforT(var17), var3);
- }
-
- double var19 = this.XforT(var7);
- double var21 = var1.XforT(var13);
- double var23 = Math.max(Math.abs(var3), Math.abs(var5));
- double var25 = Math.max(var23 * 1.0E-14, 1.0E-300);
- if (this.fairlyClose(var19, var21)) {
- double var27 = var25;
- double var29 = Math.min(var25 * 1.0E13, (var5 - var3) * 0.1);
-
- double var31;
- label99:
- for(var31 = var3 + var25; var31 <= var5; var31 += var27) {
- if (!this.fairlyClose(this.XforY(var31), var1.XforY(var31))) {
- var31 -= var27;
-
- while(true) {
- var27 /= (double)2.0F;
- double var33 = var31 + var27;
- if (var33 <= var31) {
- break label99;
- }
-
- if (this.fairlyClose(this.XforY(var33), var1.XforY(var33))) {
- var31 = var33;
- }
- }
- }
-
- if ((var27 *= (double)2.0F) > var29) {
- var27 = var29;
- }
- }
-
- if (var31 > var3) {
- if (var31 < var5) {
- var2[1] = var31;
- }
-
- return 0;
- }
- }
-
- if (var25 <= (double)0.0F) {
- System.out.println("ymin = " + var25);
- }
-
- while(var7 < var11 && var13 < var17) {
- double var42 = this.nextVertical(var7, var11);
- double var44 = this.XforT(var42);
- double var45 = this.YforT(var42);
- double var46 = var1.nextVertical(var13, var17);
- double var35 = var1.XforT(var46);
- double var37 = var1.YforT(var46);
-
- try {
- if (this.findIntersect(var1, var2, var25, 0, 0, var7, var19, var9, var42, var44, var45, var13, var21, var15, var46, var35, var37)) {
- break;
- }
- } catch (Throwable var40) {
- System.err.println("Error: " + var40);
- System.err.println("y range was " + var2[0] + "=>" + var2[1]);
- System.err.println("s y range is " + var9 + "=>" + var45);
- System.err.println("t y range is " + var15 + "=>" + var37);
- System.err.println("ymin is " + var25);
- return 0;
- }
-
- if (var45 < var37) {
- if (var45 > var2[0]) {
- if (var45 < var2[1]) {
- var2[1] = var45;
- }
- break;
- }
-
- var7 = var42;
- var19 = var44;
- var9 = var45;
- } else {
- if (var37 > var2[0]) {
- if (var37 < var2[1]) {
- var2[1] = var37;
- }
- break;
- }
-
- var13 = var46;
- var21 = var35;
- var15 = var37;
- }
- }
-
- double var43 = (var2[0] + var2[1]) / (double)2.0F;
- return orderof(this.XforY(var43), var1.XforY(var43));
- }
- }
- }
-
- public boolean findIntersect(Curve var1, double[] var2, double var3, int var5, int var6, double var7, double var9, double var11, double var13, double var15, double var17, double var19, double var21, double var23, double var25, double var27, double var29) {
- if (!(var11 > var29) && !(var23 > var17)) {
- if (!(Math.min(var9, var15) > Math.max(var21, var27)) && !(Math.max(var9, var15) < Math.min(var21, var27))) {
- if (var13 - var7 > 0.001) {
- double var31 = (var7 + var13) / (double)2.0F;
- double var33 = this.XforT(var31);
- double var35 = this.YforT(var31);
- if (var31 == var7 || var31 == var13) {
- System.out.println("s0 = " + var7);
- System.out.println("s1 = " + var13);
- throw new InternalError("no s progress!");
- }
-
- if (var25 - var19 > 0.001) {
- double var37 = (var19 + var25) / (double)2.0F;
- double var39 = var1.XforT(var37);
- double var41 = var1.YforT(var37);
- if (var37 == var19 || var37 == var25) {
- System.out.println("t0 = " + var19);
- System.out.println("t1 = " + var25);
- throw new InternalError("no t progress!");
- }
-
- if (var35 >= var23 && var41 >= var11 && this.findIntersect(var1, var2, var3, var5 + 1, var6 + 1, var7, var9, var11, var31, var33, var35, var19, var21, var23, var37, var39, var41)) {
- return true;
- }
-
- if (var35 >= var41 && this.findIntersect(var1, var2, var3, var5 + 1, var6 + 1, var7, var9, var11, var31, var33, var35, var37, var39, var41, var25, var27, var29)) {
- return true;
- }
-
- if (var41 >= var35 && this.findIntersect(var1, var2, var3, var5 + 1, var6 + 1, var31, var33, var35, var13, var15, var17, var19, var21, var23, var37, var39, var41)) {
- return true;
- }
-
- if (var17 >= var41 && var29 >= var35 && this.findIntersect(var1, var2, var3, var5 + 1, var6 + 1, var31, var33, var35, var13, var15, var17, var37, var39, var41, var25, var27, var29)) {
- return true;
- }
- } else {
- if (var35 >= var23 && this.findIntersect(var1, var2, var3, var5 + 1, var6, var7, var9, var11, var31, var33, var35, var19, var21, var23, var25, var27, var29)) {
- return true;
- }
-
- if (var29 >= var35 && this.findIntersect(var1, var2, var3, var5 + 1, var6, var31, var33, var35, var13, var15, var17, var19, var21, var23, var25, var27, var29)) {
- return true;
- }
- }
- } else if (var25 - var19 > 0.001) {
- double var53 = (var19 + var25) / (double)2.0F;
- double var55 = var1.XforT(var53);
- double var57 = var1.YforT(var53);
- if (var53 == var19 || var53 == var25) {
- System.out.println("t0 = " + var19);
- System.out.println("t1 = " + var25);
- throw new InternalError("no t progress!");
- }
-
- if (var57 >= var11 && this.findIntersect(var1, var2, var3, var5, var6 + 1, var7, var9, var11, var13, var15, var17, var19, var21, var23, var53, var55, var57)) {
- return true;
- }
-
- if (var17 >= var57 && this.findIntersect(var1, var2, var3, var5, var6 + 1, var7, var9, var11, var13, var15, var17, var53, var55, var57, var25, var27, var29)) {
- return true;
- }
- } else {
- double var54 = var15 - var9;
- double var56 = var17 - var11;
- double var58 = var27 - var21;
- double var59 = var29 - var23;
- double var60 = var21 - var9;
- double var61 = var23 - var11;
- double var43 = var58 * var56 - var59 * var54;
- if (var43 != (double)0.0F) {
- double var45 = (double)1.0F / var43;
- double var47 = (var58 * var61 - var59 * var60) * var45;
- double var49 = (var54 * var61 - var56 * var60) * var45;
- if (var47 >= (double)0.0F && var47 <= (double)1.0F && var49 >= (double)0.0F && var49 <= (double)1.0F) {
- var47 = var7 + var47 * (var13 - var7);
- var49 = var19 + var49 * (var25 - var19);
- if (var47 < (double)0.0F || var47 > (double)1.0F || var49 < (double)0.0F || var49 > (double)1.0F) {
- System.out.println("Uh oh!");
- }
-
- double var51 = (this.YforT(var47) + var1.YforT(var49)) / (double)2.0F;
- if (var51 <= var2[1] && var51 > var2[0]) {
- var2[1] = var51;
- return true;
- }
- }
- }
- }
-
- return false;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- public double refineTforY(double var1, double var3, double var5) {
- double var7 = (double)1.0F;
-
- while(true) {
- double var9 = (var1 + var7) / (double)2.0F;
- if (var9 == var1 || var9 == var7) {
- return var7;
- }
-
- double var11 = this.YforT(var9);
- if (var11 < var5) {
- var1 = var9;
- } else {
- if (!(var11 > var5)) {
- return var7;
- }
-
- var7 = var9;
- }
- }
- }
-
- public boolean fairlyClose(double var1, double var3) {
- return Math.abs(var1 - var3) < Math.max(Math.abs(var1), Math.abs(var3)) * 1.0E-10;
- }
-
- public abstract int getSegment(double[] var1);
- }
-