home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / awt / geom / CubicCurve2D.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  7.1 KB  |  522 lines

  1. package java.awt.geom;
  2.  
  3. import java.awt.Rectangle;
  4. import java.awt.Shape;
  5. import java.util.Arrays;
  6.  
  7. public abstract class CubicCurve2D implements Shape, Cloneable {
  8.    private static final int BELOW = -2;
  9.    private static final int LOWEDGE = -1;
  10.    private static final int INSIDE = 0;
  11.    private static final int HIGHEDGE = 1;
  12.    private static final int ABOVE = 2;
  13.  
  14.    protected CubicCurve2D() {
  15.    }
  16.  
  17.    public abstract double getX1();
  18.  
  19.    public abstract double getY1();
  20.  
  21.    public abstract Point2D getP1();
  22.  
  23.    public abstract double getCtrlX1();
  24.  
  25.    public abstract double getCtrlY1();
  26.  
  27.    public abstract Point2D getCtrlP1();
  28.  
  29.    public abstract double getCtrlX2();
  30.  
  31.    public abstract double getCtrlY2();
  32.  
  33.    public abstract Point2D getCtrlP2();
  34.  
  35.    public abstract double getX2();
  36.  
  37.    public abstract double getY2();
  38.  
  39.    public abstract Point2D getP2();
  40.  
  41.    public abstract void setCurve(double var1, double var3, double var5, double var7, double var9, double var11, double var13, double var15);
  42.  
  43.    public void setCurve(double[] var1, int var2) {
  44.       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]);
  45.    }
  46.  
  47.    public void setCurve(Point2D var1, Point2D var2, Point2D var3, Point2D var4) {
  48.       this.setCurve(var1.getX(), var1.getY(), var2.getX(), var2.getY(), var3.getX(), var3.getY(), var4.getX(), var4.getY());
  49.    }
  50.  
  51.    public void setCurve(Point2D[] var1, int var2) {
  52.       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());
  53.    }
  54.  
  55.    public void setCurve(CubicCurve2D var1) {
  56.       this.setCurve(var1.getX1(), var1.getY1(), var1.getCtrlX1(), var1.getCtrlY1(), var1.getCtrlX2(), var1.getCtrlY2(), var1.getX2(), var1.getY2());
  57.    }
  58.  
  59.    public static double getFlatnessSq(double var0, double var2, double var4, double var6, double var8, double var10, double var12, double var14) {
  60.       return Math.max(Line2D.ptSegDistSq(var0, var2, var12, var14, var4, var6), Line2D.ptSegDistSq(var0, var2, var12, var14, var8, var10));
  61.    }
  62.  
  63.    public static double getFlatness(double var0, double var2, double var4, double var6, double var8, double var10, double var12, double var14) {
  64.       return Math.sqrt(getFlatnessSq(var0, var2, var4, var6, var8, var10, var12, var14));
  65.    }
  66.  
  67.    public static double getFlatnessSq(double[] var0, int var1) {
  68.       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]);
  69.    }
  70.  
  71.    public static double getFlatness(double[] var0, int var1) {
  72.       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]);
  73.    }
  74.  
  75.    public double getFlatnessSq() {
  76.       return getFlatnessSq(this.getX1(), this.getY1(), this.getCtrlX1(), this.getCtrlY1(), this.getCtrlX2(), this.getCtrlY2(), this.getX2(), this.getY2());
  77.    }
  78.  
  79.    public double getFlatness() {
  80.       return getFlatness(this.getX1(), this.getY1(), this.getCtrlX1(), this.getCtrlY1(), this.getCtrlX2(), this.getCtrlY2(), this.getX2(), this.getY2());
  81.    }
  82.  
  83.    public void subdivide(CubicCurve2D var1, CubicCurve2D var2) {
  84.       subdivide(this, var1, var2);
  85.    }
  86.  
  87.    public static void subdivide(CubicCurve2D var0, CubicCurve2D var1, CubicCurve2D var2) {
  88.       double var3 = var0.getX1();
  89.       double var5 = var0.getY1();
  90.       double var7 = var0.getCtrlX1();
  91.       double var9 = var0.getCtrlY1();
  92.       double var11 = var0.getCtrlX2();
  93.       double var13 = var0.getCtrlY2();
  94.       double var15 = var0.getX2();
  95.       double var17 = var0.getY2();
  96.       double var19 = (var7 + var11) / (double)2.0F;
  97.       double var21 = (var9 + var13) / (double)2.0F;
  98.       var7 = (var3 + var7) / (double)2.0F;
  99.       var9 = (var5 + var9) / (double)2.0F;
  100.       var11 = (var15 + var11) / (double)2.0F;
  101.       var13 = (var17 + var13) / (double)2.0F;
  102.       double var23 = (var7 + var19) / (double)2.0F;
  103.       double var25 = (var9 + var21) / (double)2.0F;
  104.       double var27 = (var11 + var19) / (double)2.0F;
  105.       double var29 = (var13 + var21) / (double)2.0F;
  106.       var19 = (var23 + var27) / (double)2.0F;
  107.       var21 = (var25 + var29) / (double)2.0F;
  108.       if (var1 != null) {
  109.          var1.setCurve(var3, var5, var7, var9, var23, var25, var19, var21);
  110.       }
  111.  
  112.       if (var2 != null) {
  113.          var2.setCurve(var19, var21, var27, var29, var11, var13, var15, var17);
  114.       }
  115.  
  116.    }
  117.  
  118.    public static void subdivide(double[] var0, int var1, double[] var2, int var3, double[] var4, int var5) {
  119.       double var6 = var0[var1 + 0];
  120.       double var8 = var0[var1 + 1];
  121.       double var10 = var0[var1 + 2];
  122.       double var12 = var0[var1 + 3];
  123.       double var14 = var0[var1 + 4];
  124.       double var16 = var0[var1 + 5];
  125.       double var18 = var0[var1 + 6];
  126.       double var20 = var0[var1 + 7];
  127.       if (var2 != null) {
  128.          var2[var3 + 0] = var6;
  129.          var2[var3 + 1] = var8;
  130.       }
  131.  
  132.       if (var4 != null) {
  133.          var4[var5 + 6] = var18;
  134.          var4[var5 + 7] = var20;
  135.       }
  136.  
  137.       var6 = (var6 + var10) / (double)2.0F;
  138.       var8 = (var8 + var12) / (double)2.0F;
  139.       var18 = (var18 + var14) / (double)2.0F;
  140.       var20 = (var20 + var16) / (double)2.0F;
  141.       double var22 = (var10 + var14) / (double)2.0F;
  142.       double var24 = (var12 + var16) / (double)2.0F;
  143.       var10 = (var6 + var22) / (double)2.0F;
  144.       var12 = (var8 + var24) / (double)2.0F;
  145.       var14 = (var18 + var22) / (double)2.0F;
  146.       var16 = (var20 + var24) / (double)2.0F;
  147.       var22 = (var10 + var14) / (double)2.0F;
  148.       var24 = (var12 + var16) / (double)2.0F;
  149.       if (var2 != null) {
  150.          var2[var3 + 2] = var6;
  151.          var2[var3 + 3] = var8;
  152.          var2[var3 + 4] = var10;
  153.          var2[var3 + 5] = var12;
  154.          var2[var3 + 6] = var22;
  155.          var2[var3 + 7] = var24;
  156.       }
  157.  
  158.       if (var4 != null) {
  159.          var4[var5 + 0] = var22;
  160.          var4[var5 + 1] = var24;
  161.          var4[var5 + 2] = var14;
  162.          var4[var5 + 3] = var16;
  163.          var4[var5 + 4] = var18;
  164.          var4[var5 + 5] = var20;
  165.       }
  166.  
  167.    }
  168.  
  169.    public static int solveCubic(double[] var0) {
  170.       return solveCubic(var0, var0);
  171.    }
  172.  
  173.    public static int solveCubic(double[] var0, double[] var1) {
  174.       double var2 = var0[3];
  175.       if (var2 == (double)0.0F) {
  176.          return QuadCurve2D.solveQuadratic(var0, var1);
  177.       } else {
  178.          double var4 = var0[2] / var2;
  179.          double var6 = var0[1] / var2;
  180.          double var8 = var0[0] / var2;
  181.          int var10 = 0;
  182.          double var11 = (var4 * var4 - (double)3.0F * var6) / (double)9.0F;
  183.          double var13 = ((double)2.0F * var4 * var4 * var4 - (double)9.0F * var4 * var6 + (double)27.0F * var8) / (double)54.0F;
  184.          double var15 = var13 * var13;
  185.          double var17 = var11 * var11 * var11;
  186.          var4 /= (double)3.0F;
  187.          if (var15 < var17) {
  188.             double var19 = Math.acos(var13 / Math.sqrt(var17));
  189.             var11 = (double)-2.0F * Math.sqrt(var11);
  190.             if (var1 == var0) {
  191.                var0 = new double[4];
  192.                System.arraycopy(var1, 0, var0, 0, 4);
  193.             }
  194.  
  195.             var1[var10++] = var11 * Math.cos(var19 / (double)3.0F) - var4;
  196.             var1[var10++] = var11 * Math.cos((var19 + (Math.PI * 2D)) / (double)3.0F) - var4;
  197.             var1[var10++] = var11 * Math.cos((var19 - (Math.PI * 2D)) / (double)3.0F) - var4;
  198.             fixRoots(var1, var0);
  199.          } else {
  200.             boolean var31 = var13 < (double)0.0F;
  201.             double var20 = Math.sqrt(var15 - var17);
  202.             if (var31) {
  203.                var13 = -var13;
  204.             }
  205.  
  206.             double var22 = Math.pow(var13 + var20, 0.3333333333333333);
  207.             if (!var31) {
  208.                var22 = -var22;
  209.             }
  210.  
  211.             double var24 = var22 == (double)0.0F ? (double)0.0F : var11 / var22;
  212.             var1[var10++] = var22 + var24 - var4;
  213.          }
  214.  
  215.          return var10;
  216.       }
  217.    }
  218.  
  219.    private static void fixRoots(double[] var0, double[] var1) {
  220.       for(int var4 = 0; var4 < 3; ++var4) {
  221.          double var5 = var0[var4];
  222.          if (Math.abs(var5) < 1.0E-5) {
  223.             var0[var4] = findZero(var5, (double)0.0F, var1);
  224.          } else if (Math.abs(var5 - (double)1.0F) < 1.0E-5) {
  225.             var0[var4] = findZero(var5, (double)1.0F, var1);
  226.          }
  227.       }
  228.  
  229.    }
  230.  
  231.    private static double solveEqn(double[] var0, int var1, double var2) {
  232.       double var4 = var0[var1];
  233.  
  234.       while(true) {
  235.          --var1;
  236.          if (var1 < 0) {
  237.             return var4;
  238.          }
  239.  
  240.          var4 = var4 * var2 + var0[var1];
  241.       }
  242.    }
  243.  
  244.    private static double findZero(double var0, double var2, double[] var4) {
  245.       double[] var5 = new double[]{var4[1], (double)2.0F * var4[2], (double)3.0F * var4[3]};
  246.       double var8 = (double)0.0F;
  247.       double var10 = var0;
  248.  
  249.       while(true) {
  250.          double var6 = solveEqn(var5, 2, var0);
  251.          if (var6 == (double)0.0F) {
  252.             return var0;
  253.          }
  254.  
  255.          double var12 = solveEqn(var4, 3, var0);
  256.          if (var12 == (double)0.0F) {
  257.             return var0;
  258.          }
  259.  
  260.          double var14 = -(var12 / var6);
  261.          if (var8 == (double)0.0F) {
  262.             var8 = var14;
  263.          }
  264.  
  265.          if (var0 < var2) {
  266.             if (var14 < (double)0.0F) {
  267.                return var0;
  268.             }
  269.          } else {
  270.             if (!(var0 > var2)) {
  271.                return var14 > (double)0.0F ? var2 + java.lang.Double.MIN_VALUE : var2 - java.lang.Double.MIN_VALUE;
  272.             }
  273.  
  274.             if (var14 > (double)0.0F) {
  275.                return var0;
  276.             }
  277.          }
  278.  
  279.          double var16 = var0 + var14;
  280.          if (var0 == var16) {
  281.             return var0;
  282.          }
  283.  
  284.          if (var14 * var8 < (double)0.0F) {
  285.             int var18 = var10 < var0 ? getTag(var2, var10, var0) : getTag(var2, var0, var10);
  286.             if (var18 != 0) {
  287.                return (var10 + var0) / (double)2.0F;
  288.             }
  289.  
  290.             var0 = var2;
  291.          } else {
  292.             var0 = var16;
  293.          }
  294.       }
  295.    }
  296.  
  297.    public boolean contains(double var1, double var3) {
  298.       int var5 = 0;
  299.       double var6 = this.getX1();
  300.       double var8 = this.getY1();
  301.       double var10 = this.getX2();
  302.       double var12 = this.getY2();
  303.       double var14 = var12 - var8;
  304.       if ((var14 > (double)0.0F && var3 >= var8 && var3 <= var12 || var14 < (double)0.0F && var3 <= var8 && var3 >= var12) && var1 < var6 + (var3 - var8) * (var10 - var6) / var14) {
  305.          ++var5;
  306.       }
  307.  
  308.       double var16 = this.getCtrlX1();
  309.       double var18 = this.getCtrlY1();
  310.       double var20 = this.getCtrlX2();
  311.       double var22 = this.getCtrlY2();
  312.       boolean var24 = (var12 - var8) * (var18 - var8) >= (double)0.0F;
  313.       boolean var25 = (var8 - var12) * (var22 - var12) >= (double)0.0F;
  314.       double[] var26 = new double[4];
  315.       double[] var27 = new double[4];
  316.       fillEqn(var26, var3, var8, var18, var22, var12);
  317.       int var28 = solveCubic(var26, var27);
  318.       var28 = evalCubic(var27, var28, var24, var25, var26, var6, var16, var20, var10);
  319.  
  320.       while(true) {
  321.          --var28;
  322.          if (var28 < 0) {
  323.             return (var5 & 1) == 1;
  324.          }
  325.  
  326.          if (var1 < var27[var28]) {
  327.             ++var5;
  328.          }
  329.       }
  330.    }
  331.  
  332.    public boolean contains(Point2D var1) {
  333.       return this.contains(var1.getX(), var1.getY());
  334.    }
  335.  
  336.    private static void fillEqn(double[] var0, double var1, double var3, double var5, double var7, double var9) {
  337.       var0[0] = var3 - var1;
  338.       var0[1] = (var5 - var3) * (double)3.0F;
  339.       var0[2] = (var7 - var5 - var5 + var3) * (double)3.0F;
  340.       var0[3] = var9 + (var5 - var7) * (double)3.0F - var3;
  341.    }
  342.  
  343.    private static int evalCubic(double[] var0, int var1, boolean var2, boolean var3, double[] var4, double var5, double var7, double var9, double var11) {
  344.       int var13 = 0;
  345.  
  346.       for(int var14 = 0; var14 < var1; ++var14) {
  347.          double var15 = var0[var14];
  348.          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)) {
  349.             double var17 = (double)1.0F - var15;
  350.             var0[var13++] = var5 * var17 * var17 * var17 + (double)3.0F * var7 * var15 * var17 * var17 + (double)3.0F * var9 * var15 * var15 * var17 + var11 * var15 * var15 * var15;
  351.          }
  352.       }
  353.  
  354.       return var13;
  355.    }
  356.  
  357.    private static int getTag(double var0, double var2, double var4) {
  358.       if (var0 <= var2) {
  359.          return var0 < var2 ? -2 : -1;
  360.       } else if (var0 >= var4) {
  361.          return var0 > var4 ? 2 : 1;
  362.       } else {
  363.          return 0;
  364.       }
  365.    }
  366.  
  367.    private static boolean inwards(int var0, int var1, int var2) {
  368.       switch (var0) {
  369.          case -2:
  370.          case 2:
  371.          default:
  372.             return false;
  373.          case -1:
  374.             return var1 >= 0 || var2 >= 0;
  375.          case 0:
  376.             return true;
  377.          case 1:
  378.             return var1 <= 0 || var2 <= 0;
  379.       }
  380.    }
  381.  
  382.    public boolean intersects(double var1, double var3, double var5, double var7) {
  383.       if (!(var5 < (double)0.0F) && !(var7 < (double)0.0F)) {
  384.          double var9 = this.getX1();
  385.          double var11 = this.getY1();
  386.          int var13 = getTag(var9, var1, var1 + var5);
  387.          int var14 = getTag(var11, var3, var3 + var7);
  388.          if (var13 == 0 && var14 == 0) {
  389.             return true;
  390.          } else {
  391.             double var15 = this.getX2();
  392.             double var17 = this.getY2();
  393.             int var19 = getTag(var15, var1, var1 + var5);
  394.             int var20 = getTag(var17, var3, var3 + var7);
  395.             if (var19 == 0 && var20 == 0) {
  396.                return true;
  397.             } else {
  398.                double var21 = this.getCtrlX1();
  399.                double var23 = this.getCtrlY1();
  400.                double var25 = this.getCtrlX2();
  401.                double var27 = this.getCtrlY2();
  402.                int var29 = getTag(var21, var1, var1 + var5);
  403.                int var30 = getTag(var23, var3, var3 + var7);
  404.                int var31 = getTag(var25, var1, var1 + var5);
  405.                int var32 = getTag(var27, var3, var3 + var7);
  406.                if (var13 < 0 && var19 < 0 && var29 < 0 && var31 < 0) {
  407.                   return false;
  408.                } else if (var14 < 0 && var20 < 0 && var30 < 0 && var32 < 0) {
  409.                   return false;
  410.                } else if (var13 > 0 && var19 > 0 && var29 > 0 && var31 > 0) {
  411.                   return false;
  412.                } else if (var14 > 0 && var20 > 0 && var30 > 0 && var32 > 0) {
  413.                   return false;
  414.                } else if (inwards(var13, var19, var29) && inwards(var14, var20, var30)) {
  415.                   return true;
  416.                } else if (inwards(var19, var13, var31) && inwards(var20, var14, var32)) {
  417.                   return true;
  418.                } else {
  419.                   boolean var33 = var13 * var19 <= 0;
  420.                   boolean var34 = var14 * var20 <= 0;
  421.                   if (var13 == 0 && var19 == 0 && var34) {
  422.                      return true;
  423.                   } else if (var14 == 0 && var20 == 0 && var33) {
  424.                      return true;
  425.                   } else {
  426.                      double[] var35 = new double[4];
  427.                      double[] var36 = new double[4];
  428.                      if (!var34) {
  429.                         fillEqn(var35, var14 < 0 ? var3 : var3 + var7, var11, var23, var27, var17);
  430.                         int var50 = solveCubic(var35, var36);
  431.                         var50 = evalCubic(var36, var50, true, true, (double[])null, var9, var21, var25, var15);
  432.                         return var50 == 2 && getTag(var36[0], var1, var1 + var5) * getTag(var36[1], var1, var1 + var5) <= 0;
  433.                      } else if (!var33) {
  434.                         fillEqn(var35, var13 < 0 ? var1 : var1 + var5, var9, var21, var25, var15);
  435.                         int var48 = solveCubic(var35, var36);
  436.                         var48 = evalCubic(var36, var48, true, true, (double[])null, var11, var23, var27, var17);
  437.                         return var48 == 2 && getTag(var36[0], var3, var3 + var7) * getTag(var36[1], var3, var3 + var7) <= 0;
  438.                      } else {
  439.                         double var37 = var15 - var9;
  440.                         double var39 = var17 - var11;
  441.                         double var41 = var17 * var9 - var15 * var11;
  442.                         int var43;
  443.                         if (var14 == 0) {
  444.                            var43 = var13;
  445.                         } else {
  446.                            var43 = getTag((var41 + var37 * (var14 < 0 ? var3 : var3 + var7)) / var39, var1, var1 + var5);
  447.                         }
  448.  
  449.                         int var44;
  450.                         if (var20 == 0) {
  451.                            var44 = var19;
  452.                         } else {
  453.                            var44 = getTag((var41 + var37 * (var20 < 0 ? var3 : var3 + var7)) / var39, var1, var1 + var5);
  454.                         }
  455.  
  456.                         if (var43 * var44 <= 0) {
  457.                            return true;
  458.                         } else {
  459.                            var43 = var43 * var13 <= 0 ? var14 : var20;
  460.                            fillEqn(var35, var44 < 0 ? var1 : var1 + var5, var9, var21, var25, var15);
  461.                            int var45 = solveCubic(var35, var36);
  462.                            var45 = evalCubic(var36, var45, true, true, (double[])null, var11, var23, var27, var17);
  463.                            int[] var46 = new int[var45 + 1];
  464.  
  465.                            for(int var47 = 0; var47 < var45; ++var47) {
  466.                               var46[var47] = getTag(var36[var47], var3, var3 + var7);
  467.                            }
  468.  
  469.                            var46[var45] = var43;
  470.                            Arrays.sort(var46);
  471.                            return var45 >= 1 && var46[0] * var46[1] <= 0 || var45 >= 3 && var46[2] * var46[3] <= 0;
  472.                         }
  473.                      }
  474.                   }
  475.                }
  476.             }
  477.          }
  478.       } else {
  479.          return false;
  480.       }
  481.    }
  482.  
  483.    public boolean intersects(Rectangle2D var1) {
  484.       return this.intersects(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
  485.    }
  486.  
  487.    public boolean contains(double var1, double var3, double var5, double var7) {
  488.       if (this.contains(var1, var3) && this.contains(var1 + var5, var3) && this.contains(var1 + var5, var3 + var7) && this.contains(var1, var3 + var7)) {
  489.          Rectangle2D.Double var9 = new Rectangle2D.Double(var1, var3, var5, var7);
  490.          return !((Rectangle2D)var9).intersectsLine(this.getX1(), this.getY1(), this.getX2(), this.getY2());
  491.       } else {
  492.          return false;
  493.       }
  494.    }
  495.  
  496.    public boolean contains(Rectangle2D var1) {
  497.       return this.contains(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
  498.    }
  499.  
  500.    public Rectangle getBounds() {
  501.       return this.getBounds2D().getBounds();
  502.    }
  503.  
  504.    public PathIterator getPathIterator(AffineTransform var1) {
  505.       return new CubicIterator(this, var1);
  506.    }
  507.  
  508.    public PathIterator getPathIterator(AffineTransform var1, double var2) {
  509.       return new FlatteningPathIterator(this.getPathIterator(var1), var2);
  510.    }
  511.  
  512.    public Object clone() {
  513.       try {
  514.          return super.clone();
  515.       } catch (CloneNotSupportedException var2) {
  516.          throw new InternalError();
  517.       }
  518.    }
  519.  
  520.    public abstract Rectangle2D getBounds2D();
  521. }
  522.