home *** CD-ROM | disk | FTP | other *** search
- package java.awt.geom;
-
- import java.awt.Rectangle;
- import java.awt.Shape;
- import java.util.Arrays;
-
- public abstract class CubicCurve2D implements Shape, Cloneable {
- private static final int BELOW = -2;
- private static final int LOWEDGE = -1;
- private static final int INSIDE = 0;
- private static final int HIGHEDGE = 1;
- private static final int ABOVE = 2;
-
- protected CubicCurve2D() {
- }
-
- public abstract double getX1();
-
- public abstract double getY1();
-
- public abstract Point2D getP1();
-
- public abstract double getCtrlX1();
-
- public abstract double getCtrlY1();
-
- public abstract Point2D getCtrlP1();
-
- public abstract double getCtrlX2();
-
- public abstract double getCtrlY2();
-
- public abstract Point2D getCtrlP2();
-
- public abstract double getX2();
-
- public abstract double getY2();
-
- public abstract Point2D getP2();
-
- public abstract void setCurve(double var1, double var3, double var5, double var7, double var9, double var11, double var13, double var15);
-
- public void setCurve(double[] var1, int var2) {
- this.setCurve(var1[var2 + 0], var1[var2 + 1], var1[var2 + 2], var1[var2 + 3], var1[var2 + 4], var1[var2 + 5], var1[var2 + 6], var1[var2 + 7]);
- }
-
- public void setCurve(Point2D var1, Point2D var2, Point2D var3, Point2D var4) {
- this.setCurve(var1.getX(), var1.getY(), var2.getX(), var2.getY(), var3.getX(), var3.getY(), var4.getX(), var4.getY());
- }
-
- public void setCurve(Point2D[] var1, int var2) {
- this.setCurve(var1[var2 + 0].getX(), var1[var2 + 0].getY(), var1[var2 + 1].getX(), var1[var2 + 1].getY(), var1[var2 + 2].getX(), var1[var2 + 2].getY(), var1[var2 + 3].getX(), var1[var2 + 3].getY());
- }
-
- public void setCurve(CubicCurve2D var1) {
- this.setCurve(var1.getX1(), var1.getY1(), var1.getCtrlX1(), var1.getCtrlY1(), var1.getCtrlX2(), var1.getCtrlY2(), var1.getX2(), var1.getY2());
- }
-
- public static double getFlatnessSq(double var0, double var2, double var4, double var6, double var8, double var10, double var12, double var14) {
- return Math.max(Line2D.ptSegDistSq(var0, var2, var12, var14, var4, var6), Line2D.ptSegDistSq(var0, var2, var12, var14, var8, var10));
- }
-
- public static double getFlatness(double var0, double var2, double var4, double var6, double var8, double var10, double var12, double var14) {
- return Math.sqrt(getFlatnessSq(var0, var2, var4, var6, var8, var10, var12, var14));
- }
-
- public static double getFlatnessSq(double[] var0, int var1) {
- return getFlatnessSq(var0[var1 + 0], var0[var1 + 1], var0[var1 + 2], var0[var1 + 3], var0[var1 + 4], var0[var1 + 5], var0[var1 + 6], var0[var1 + 7]);
- }
-
- public static double getFlatness(double[] var0, int var1) {
- return getFlatness(var0[var1 + 0], var0[var1 + 1], var0[var1 + 2], var0[var1 + 3], var0[var1 + 4], var0[var1 + 5], var0[var1 + 6], var0[var1 + 7]);
- }
-
- public double getFlatnessSq() {
- return getFlatnessSq(this.getX1(), this.getY1(), this.getCtrlX1(), this.getCtrlY1(), this.getCtrlX2(), this.getCtrlY2(), this.getX2(), this.getY2());
- }
-
- public double getFlatness() {
- return getFlatness(this.getX1(), this.getY1(), this.getCtrlX1(), this.getCtrlY1(), this.getCtrlX2(), this.getCtrlY2(), this.getX2(), this.getY2());
- }
-
- public void subdivide(CubicCurve2D var1, CubicCurve2D var2) {
- subdivide(this, var1, var2);
- }
-
- public static void subdivide(CubicCurve2D var0, CubicCurve2D var1, CubicCurve2D var2) {
- double var3 = var0.getX1();
- double var5 = var0.getY1();
- double var7 = var0.getCtrlX1();
- double var9 = var0.getCtrlY1();
- double var11 = var0.getCtrlX2();
- double var13 = var0.getCtrlY2();
- double var15 = var0.getX2();
- double var17 = var0.getY2();
- double var19 = (var7 + var11) / (double)2.0F;
- double var21 = (var9 + var13) / (double)2.0F;
- var7 = (var3 + var7) / (double)2.0F;
- var9 = (var5 + var9) / (double)2.0F;
- var11 = (var15 + var11) / (double)2.0F;
- var13 = (var17 + var13) / (double)2.0F;
- double var23 = (var7 + var19) / (double)2.0F;
- double var25 = (var9 + var21) / (double)2.0F;
- double var27 = (var11 + var19) / (double)2.0F;
- double var29 = (var13 + var21) / (double)2.0F;
- var19 = (var23 + var27) / (double)2.0F;
- var21 = (var25 + var29) / (double)2.0F;
- if (var1 != null) {
- var1.setCurve(var3, var5, var7, var9, var23, var25, var19, var21);
- }
-
- if (var2 != null) {
- var2.setCurve(var19, var21, var27, var29, var11, var13, var15, var17);
- }
-
- }
-
- public static void subdivide(double[] var0, int var1, double[] var2, int var3, double[] var4, int var5) {
- double var6 = var0[var1 + 0];
- double var8 = var0[var1 + 1];
- double var10 = var0[var1 + 2];
- double var12 = var0[var1 + 3];
- double var14 = var0[var1 + 4];
- double var16 = var0[var1 + 5];
- double var18 = var0[var1 + 6];
- double var20 = var0[var1 + 7];
- if (var2 != null) {
- var2[var3 + 0] = var6;
- var2[var3 + 1] = var8;
- }
-
- if (var4 != null) {
- var4[var5 + 6] = var18;
- var4[var5 + 7] = var20;
- }
-
- var6 = (var6 + var10) / (double)2.0F;
- var8 = (var8 + var12) / (double)2.0F;
- var18 = (var18 + var14) / (double)2.0F;
- var20 = (var20 + var16) / (double)2.0F;
- double var22 = (var10 + var14) / (double)2.0F;
- double var24 = (var12 + var16) / (double)2.0F;
- var10 = (var6 + var22) / (double)2.0F;
- var12 = (var8 + var24) / (double)2.0F;
- var14 = (var18 + var22) / (double)2.0F;
- var16 = (var20 + var24) / (double)2.0F;
- var22 = (var10 + var14) / (double)2.0F;
- var24 = (var12 + var16) / (double)2.0F;
- if (var2 != null) {
- var2[var3 + 2] = var6;
- var2[var3 + 3] = var8;
- var2[var3 + 4] = var10;
- var2[var3 + 5] = var12;
- var2[var3 + 6] = var22;
- var2[var3 + 7] = var24;
- }
-
- if (var4 != null) {
- var4[var5 + 0] = var22;
- var4[var5 + 1] = var24;
- var4[var5 + 2] = var14;
- var4[var5 + 3] = var16;
- var4[var5 + 4] = var18;
- var4[var5 + 5] = var20;
- }
-
- }
-
- public static int solveCubic(double[] var0) {
- return solveCubic(var0, var0);
- }
-
- public static int solveCubic(double[] var0, double[] var1) {
- double var2 = var0[3];
- if (var2 == (double)0.0F) {
- return QuadCurve2D.solveQuadratic(var0, var1);
- } else {
- double var4 = var0[2] / var2;
- double var6 = var0[1] / var2;
- double var8 = var0[0] / var2;
- int var10 = 0;
- double var11 = (var4 * var4 - (double)3.0F * var6) / (double)9.0F;
- double var13 = ((double)2.0F * var4 * var4 * var4 - (double)9.0F * var4 * var6 + (double)27.0F * var8) / (double)54.0F;
- double var15 = var13 * var13;
- double var17 = var11 * var11 * var11;
- var4 /= (double)3.0F;
- if (var15 < var17) {
- double var19 = Math.acos(var13 / Math.sqrt(var17));
- var11 = (double)-2.0F * Math.sqrt(var11);
- if (var1 == var0) {
- var0 = new double[4];
- System.arraycopy(var1, 0, var0, 0, 4);
- }
-
- var1[var10++] = var11 * Math.cos(var19 / (double)3.0F) - var4;
- var1[var10++] = var11 * Math.cos((var19 + (Math.PI * 2D)) / (double)3.0F) - var4;
- var1[var10++] = var11 * Math.cos((var19 - (Math.PI * 2D)) / (double)3.0F) - var4;
- fixRoots(var1, var0);
- } else {
- boolean var31 = var13 < (double)0.0F;
- double var20 = Math.sqrt(var15 - var17);
- if (var31) {
- var13 = -var13;
- }
-
- double var22 = Math.pow(var13 + var20, 0.3333333333333333);
- if (!var31) {
- var22 = -var22;
- }
-
- double var24 = var22 == (double)0.0F ? (double)0.0F : var11 / var22;
- var1[var10++] = var22 + var24 - var4;
- }
-
- return var10;
- }
- }
-
- private static void fixRoots(double[] var0, double[] var1) {
- for(int var4 = 0; var4 < 3; ++var4) {
- double var5 = var0[var4];
- if (Math.abs(var5) < 1.0E-5) {
- var0[var4] = findZero(var5, (double)0.0F, var1);
- } else if (Math.abs(var5 - (double)1.0F) < 1.0E-5) {
- var0[var4] = findZero(var5, (double)1.0F, var1);
- }
- }
-
- }
-
- private static double solveEqn(double[] var0, int var1, double var2) {
- double var4 = var0[var1];
-
- while(true) {
- --var1;
- if (var1 < 0) {
- return var4;
- }
-
- var4 = var4 * var2 + var0[var1];
- }
- }
-
- private static double findZero(double var0, double var2, double[] var4) {
- double[] var5 = new double[]{var4[1], (double)2.0F * var4[2], (double)3.0F * var4[3]};
- double var8 = (double)0.0F;
- double var10 = var0;
-
- while(true) {
- double var6 = solveEqn(var5, 2, var0);
- if (var6 == (double)0.0F) {
- return var0;
- }
-
- double var12 = solveEqn(var4, 3, var0);
- if (var12 == (double)0.0F) {
- return var0;
- }
-
- double var14 = -(var12 / var6);
- if (var8 == (double)0.0F) {
- var8 = var14;
- }
-
- if (var0 < var2) {
- if (var14 < (double)0.0F) {
- return var0;
- }
- } else {
- if (!(var0 > var2)) {
- return var14 > (double)0.0F ? var2 + java.lang.Double.MIN_VALUE : var2 - java.lang.Double.MIN_VALUE;
- }
-
- if (var14 > (double)0.0F) {
- return var0;
- }
- }
-
- double var16 = var0 + var14;
- if (var0 == var16) {
- return var0;
- }
-
- if (var14 * var8 < (double)0.0F) {
- int var18 = var10 < var0 ? getTag(var2, var10, var0) : getTag(var2, var0, var10);
- if (var18 != 0) {
- return (var10 + var0) / (double)2.0F;
- }
-
- var0 = var2;
- } else {
- var0 = var16;
- }
- }
- }
-
- public boolean contains(double var1, double var3) {
- int var5 = 0;
- double var6 = this.getX1();
- double var8 = this.getY1();
- double var10 = this.getX2();
- double var12 = this.getY2();
- double var14 = var12 - var8;
- if ((var14 > (double)0.0F && var3 >= var8 && var3 <= var12 || var14 < (double)0.0F && var3 <= var8 && var3 >= var12) && var1 < var6 + (var3 - var8) * (var10 - var6) / var14) {
- ++var5;
- }
-
- double var16 = this.getCtrlX1();
- double var18 = this.getCtrlY1();
- double var20 = this.getCtrlX2();
- double var22 = this.getCtrlY2();
- boolean var24 = (var12 - var8) * (var18 - var8) >= (double)0.0F;
- boolean var25 = (var8 - var12) * (var22 - var12) >= (double)0.0F;
- double[] var26 = new double[4];
- double[] var27 = new double[4];
- fillEqn(var26, var3, var8, var18, var22, var12);
- int var28 = solveCubic(var26, var27);
- var28 = evalCubic(var27, var28, var24, var25, var26, var6, var16, var20, var10);
-
- while(true) {
- --var28;
- if (var28 < 0) {
- return (var5 & 1) == 1;
- }
-
- if (var1 < var27[var28]) {
- ++var5;
- }
- }
- }
-
- public boolean contains(Point2D var1) {
- return this.contains(var1.getX(), var1.getY());
- }
-
- private static void fillEqn(double[] var0, double var1, double var3, double var5, double var7, double var9) {
- var0[0] = var3 - var1;
- var0[1] = (var5 - var3) * (double)3.0F;
- var0[2] = (var7 - var5 - var5 + var3) * (double)3.0F;
- var0[3] = var9 + (var5 - var7) * (double)3.0F - var3;
- }
-
- private static int evalCubic(double[] var0, int var1, boolean var2, boolean var3, double[] var4, double var5, double var7, double var9, double var11) {
- int var13 = 0;
-
- for(int var14 = 0; var14 < var1; ++var14) {
- double var15 = var0[var14];
- if ((var2 ? var15 >= (double)0.0F : var15 > (double)0.0F) && (var3 ? var15 <= (double)1.0F : var15 < (double)1.0F) && (var4 == null || var4[1] + ((double)2.0F * var4[2] + (double)3.0F * var4[3] * var15) * var15 != (double)0.0F)) {
- double var17 = (double)1.0F - var15;
- var0[var13++] = var5 * var17 * var17 * var17 + (double)3.0F * var7 * var15 * var17 * var17 + (double)3.0F * var9 * var15 * var15 * var17 + var11 * var15 * var15 * var15;
- }
- }
-
- return var13;
- }
-
- private static int getTag(double var0, double var2, double var4) {
- if (var0 <= var2) {
- return var0 < var2 ? -2 : -1;
- } else if (var0 >= var4) {
- return var0 > var4 ? 2 : 1;
- } else {
- return 0;
- }
- }
-
- private static boolean inwards(int var0, int var1, int var2) {
- switch (var0) {
- case -2:
- case 2:
- default:
- return false;
- case -1:
- return var1 >= 0 || var2 >= 0;
- case 0:
- return true;
- case 1:
- return var1 <= 0 || var2 <= 0;
- }
- }
-
- public boolean intersects(double var1, double var3, double var5, double var7) {
- if (!(var5 < (double)0.0F) && !(var7 < (double)0.0F)) {
- double var9 = this.getX1();
- double var11 = this.getY1();
- int var13 = getTag(var9, var1, var1 + var5);
- int var14 = getTag(var11, var3, var3 + var7);
- if (var13 == 0 && var14 == 0) {
- return true;
- } else {
- double var15 = this.getX2();
- double var17 = this.getY2();
- int var19 = getTag(var15, var1, var1 + var5);
- int var20 = getTag(var17, var3, var3 + var7);
- if (var19 == 0 && var20 == 0) {
- return true;
- } else {
- double var21 = this.getCtrlX1();
- double var23 = this.getCtrlY1();
- double var25 = this.getCtrlX2();
- double var27 = this.getCtrlY2();
- int var29 = getTag(var21, var1, var1 + var5);
- int var30 = getTag(var23, var3, var3 + var7);
- int var31 = getTag(var25, var1, var1 + var5);
- int var32 = getTag(var27, var3, var3 + var7);
- if (var13 < 0 && var19 < 0 && var29 < 0 && var31 < 0) {
- return false;
- } else if (var14 < 0 && var20 < 0 && var30 < 0 && var32 < 0) {
- return false;
- } else if (var13 > 0 && var19 > 0 && var29 > 0 && var31 > 0) {
- return false;
- } else if (var14 > 0 && var20 > 0 && var30 > 0 && var32 > 0) {
- return false;
- } else if (inwards(var13, var19, var29) && inwards(var14, var20, var30)) {
- return true;
- } else if (inwards(var19, var13, var31) && inwards(var20, var14, var32)) {
- return true;
- } else {
- boolean var33 = var13 * var19 <= 0;
- boolean var34 = var14 * var20 <= 0;
- if (var13 == 0 && var19 == 0 && var34) {
- return true;
- } else if (var14 == 0 && var20 == 0 && var33) {
- return true;
- } else {
- double[] var35 = new double[4];
- double[] var36 = new double[4];
- if (!var34) {
- fillEqn(var35, var14 < 0 ? var3 : var3 + var7, var11, var23, var27, var17);
- int var50 = solveCubic(var35, var36);
- var50 = evalCubic(var36, var50, true, true, (double[])null, var9, var21, var25, var15);
- return var50 == 2 && getTag(var36[0], var1, var1 + var5) * getTag(var36[1], var1, var1 + var5) <= 0;
- } else if (!var33) {
- fillEqn(var35, var13 < 0 ? var1 : var1 + var5, var9, var21, var25, var15);
- int var48 = solveCubic(var35, var36);
- var48 = evalCubic(var36, var48, true, true, (double[])null, var11, var23, var27, var17);
- return var48 == 2 && getTag(var36[0], var3, var3 + var7) * getTag(var36[1], var3, var3 + var7) <= 0;
- } else {
- double var37 = var15 - var9;
- double var39 = var17 - var11;
- double var41 = var17 * var9 - var15 * var11;
- int var43;
- if (var14 == 0) {
- var43 = var13;
- } else {
- var43 = getTag((var41 + var37 * (var14 < 0 ? var3 : var3 + var7)) / var39, var1, var1 + var5);
- }
-
- int var44;
- if (var20 == 0) {
- var44 = var19;
- } else {
- var44 = getTag((var41 + var37 * (var20 < 0 ? var3 : var3 + var7)) / var39, var1, var1 + var5);
- }
-
- if (var43 * var44 <= 0) {
- return true;
- } else {
- var43 = var43 * var13 <= 0 ? var14 : var20;
- fillEqn(var35, var44 < 0 ? var1 : var1 + var5, var9, var21, var25, var15);
- int var45 = solveCubic(var35, var36);
- var45 = evalCubic(var36, var45, true, true, (double[])null, var11, var23, var27, var17);
- int[] var46 = new int[var45 + 1];
-
- for(int var47 = 0; var47 < var45; ++var47) {
- var46[var47] = getTag(var36[var47], var3, var3 + var7);
- }
-
- var46[var45] = var43;
- Arrays.sort(var46);
- return var45 >= 1 && var46[0] * var46[1] <= 0 || var45 >= 3 && var46[2] * var46[3] <= 0;
- }
- }
- }
- }
- }
- }
- } else {
- return false;
- }
- }
-
- public boolean intersects(Rectangle2D var1) {
- return this.intersects(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
- }
-
- public boolean contains(double var1, double var3, double var5, double var7) {
- if (this.contains(var1, var3) && this.contains(var1 + var5, var3) && this.contains(var1 + var5, var3 + var7) && this.contains(var1, var3 + var7)) {
- Rectangle2D.Double var9 = new Rectangle2D.Double(var1, var3, var5, var7);
- return !((Rectangle2D)var9).intersectsLine(this.getX1(), this.getY1(), this.getX2(), this.getY2());
- } else {
- return false;
- }
- }
-
- public boolean contains(Rectangle2D var1) {
- return this.contains(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
- }
-
- public Rectangle getBounds() {
- return this.getBounds2D().getBounds();
- }
-
- public PathIterator getPathIterator(AffineTransform var1) {
- return new CubicIterator(this, var1);
- }
-
- public PathIterator getPathIterator(AffineTransform var1, double var2) {
- return new FlatteningPathIterator(this.getPathIterator(var1), var2);
- }
-
- public Object clone() {
- try {
- return super.clone();
- } catch (CloneNotSupportedException var2) {
- throw new InternalError();
- }
- }
-
- public abstract Rectangle2D getBounds2D();
- }
-