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 / QuadCurve2D.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  5.3 KB  |  380 lines

  1. package java.awt.geom;
  2.  
  3. import java.awt.Rectangle;
  4. import java.awt.Shape;
  5.  
  6. public abstract class QuadCurve2D implements Shape, Cloneable {
  7.    private static final int BELOW = -2;
  8.    private static final int LOWEDGE = -1;
  9.    private static final int INSIDE = 0;
  10.    private static final int HIGHEDGE = 1;
  11.    private static final int ABOVE = 2;
  12.  
  13.    protected QuadCurve2D() {
  14.    }
  15.  
  16.    public abstract double getX1();
  17.  
  18.    public abstract double getY1();
  19.  
  20.    public abstract Point2D getP1();
  21.  
  22.    public abstract double getCtrlX();
  23.  
  24.    public abstract double getCtrlY();
  25.  
  26.    public abstract Point2D getCtrlPt();
  27.  
  28.    public abstract double getX2();
  29.  
  30.    public abstract double getY2();
  31.  
  32.    public abstract Point2D getP2();
  33.  
  34.    public abstract void setCurve(double var1, double var3, double var5, double var7, double var9, double var11);
  35.  
  36.    public void setCurve(double[] var1, int var2) {
  37.       this.setCurve(var1[var2 + 0], var1[var2 + 1], var1[var2 + 2], var1[var2 + 3], var1[var2 + 4], var1[var2 + 5]);
  38.    }
  39.  
  40.    public void setCurve(Point2D var1, Point2D var2, Point2D var3) {
  41.       this.setCurve(var1.getX(), var1.getY(), var2.getX(), var2.getY(), var3.getX(), var3.getY());
  42.    }
  43.  
  44.    public void setCurve(Point2D[] var1, int var2) {
  45.       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());
  46.    }
  47.  
  48.    public void setCurve(QuadCurve2D var1) {
  49.       this.setCurve(var1.getX1(), var1.getY1(), var1.getCtrlX(), var1.getCtrlY(), var1.getX2(), var1.getY2());
  50.    }
  51.  
  52.    public static double getFlatnessSq(double var0, double var2, double var4, double var6, double var8, double var10) {
  53.       return Line2D.ptSegDistSq(var0, var2, var8, var10, var4, var6);
  54.    }
  55.  
  56.    public static double getFlatness(double var0, double var2, double var4, double var6, double var8, double var10) {
  57.       return Line2D.ptSegDist(var0, var2, var8, var10, var4, var6);
  58.    }
  59.  
  60.    public static double getFlatnessSq(double[] var0, int var1) {
  61.       return Line2D.ptSegDistSq(var0[var1 + 0], var0[var1 + 1], var0[var1 + 4], var0[var1 + 5], var0[var1 + 2], var0[var1 + 3]);
  62.    }
  63.  
  64.    public static double getFlatness(double[] var0, int var1) {
  65.       return Line2D.ptSegDist(var0[var1 + 0], var0[var1 + 1], var0[var1 + 4], var0[var1 + 5], var0[var1 + 2], var0[var1 + 3]);
  66.    }
  67.  
  68.    public double getFlatnessSq() {
  69.       return Line2D.ptSegDistSq(this.getX1(), this.getY1(), this.getX2(), this.getY2(), this.getCtrlX(), this.getCtrlY());
  70.    }
  71.  
  72.    public double getFlatness() {
  73.       return Line2D.ptSegDist(this.getX1(), this.getY1(), this.getX2(), this.getY2(), this.getCtrlX(), this.getCtrlY());
  74.    }
  75.  
  76.    public void subdivide(QuadCurve2D var1, QuadCurve2D var2) {
  77.       subdivide(this, var1, var2);
  78.    }
  79.  
  80.    public static void subdivide(QuadCurve2D var0, QuadCurve2D var1, QuadCurve2D var2) {
  81.       double var3 = var0.getX1();
  82.       double var5 = var0.getY1();
  83.       double var7 = var0.getCtrlX();
  84.       double var9 = var0.getCtrlY();
  85.       double var11 = var0.getX2();
  86.       double var13 = var0.getY2();
  87.       double var15 = (var3 + var7) / (double)2.0F;
  88.       double var17 = (var5 + var9) / (double)2.0F;
  89.       double var19 = (var11 + var7) / (double)2.0F;
  90.       double var21 = (var13 + var9) / (double)2.0F;
  91.       var7 = (var15 + var19) / (double)2.0F;
  92.       var9 = (var17 + var21) / (double)2.0F;
  93.       if (var1 != null) {
  94.          var1.setCurve(var3, var5, var15, var17, var7, var9);
  95.       }
  96.  
  97.       if (var2 != null) {
  98.          var2.setCurve(var7, var9, var19, var21, var11, var13);
  99.       }
  100.  
  101.    }
  102.  
  103.    public static void subdivide(double[] var0, int var1, double[] var2, int var3, double[] var4, int var5) {
  104.       double var6 = var0[var1 + 0];
  105.       double var8 = var0[var1 + 1];
  106.       double var10 = var0[var1 + 2];
  107.       double var12 = var0[var1 + 3];
  108.       double var14 = var0[var1 + 4];
  109.       double var16 = var0[var1 + 5];
  110.       if (var2 != null) {
  111.          var2[var3 + 0] = var6;
  112.          var2[var3 + 1] = var8;
  113.       }
  114.  
  115.       if (var4 != null) {
  116.          var4[var5 + 4] = var14;
  117.          var4[var5 + 5] = var16;
  118.       }
  119.  
  120.       var6 = (var6 + var10) / (double)2.0F;
  121.       var8 = (var8 + var12) / (double)2.0F;
  122.       var14 = (var14 + var10) / (double)2.0F;
  123.       var16 = (var16 + var12) / (double)2.0F;
  124.       var10 = (var6 + var14) / (double)2.0F;
  125.       var12 = (var8 + var16) / (double)2.0F;
  126.       if (var2 != null) {
  127.          var2[var3 + 2] = var6;
  128.          var2[var3 + 3] = var8;
  129.          var2[var3 + 4] = var10;
  130.          var2[var3 + 5] = var12;
  131.       }
  132.  
  133.       if (var4 != null) {
  134.          var4[var5 + 0] = var10;
  135.          var4[var5 + 1] = var12;
  136.          var4[var5 + 2] = var14;
  137.          var4[var5 + 3] = var16;
  138.       }
  139.  
  140.    }
  141.  
  142.    public static int solveQuadratic(double[] var0) {
  143.       return solveQuadratic(var0, var0);
  144.    }
  145.  
  146.    public static int solveQuadratic(double[] var0, double[] var1) {
  147.       double var2 = var0[2];
  148.       double var4 = var0[1];
  149.       double var6 = var0[0];
  150.       int var8 = 0;
  151.       if (var2 == (double)0.0F) {
  152.          if (var4 == (double)0.0F) {
  153.             return -1;
  154.          }
  155.  
  156.          var1[var8++] = -var6 / var4;
  157.       } else {
  158.          double var9 = var4 * var4 - (double)4.0F * var2 * var6;
  159.          if (var9 < (double)0.0F) {
  160.             return 0;
  161.          }
  162.  
  163.          var9 = Math.sqrt(var9);
  164.          if (var4 < (double)0.0F) {
  165.             var9 = -var9;
  166.          }
  167.  
  168.          double var11 = (var4 + var9) / (double)-2.0F;
  169.          var1[var8++] = var11 / var2;
  170.          if (var11 != (double)0.0F) {
  171.             var1[var8++] = var6 / var11;
  172.          }
  173.       }
  174.  
  175.       return var8;
  176.    }
  177.  
  178.    public boolean contains(double var1, double var3) {
  179.       int var5 = 0;
  180.       double var6 = this.getX1();
  181.       double var8 = this.getY1();
  182.       double var10 = this.getX2();
  183.       double var12 = this.getY2();
  184.       double var14 = var12 - var8;
  185.       if ((var14 > (double)0.0F && var3 >= var8 && var3 <= var12 || var14 < (double)0.0F && var3 <= var8 && var3 >= var12) && var1 <= var6 + (var3 - var8) * (var10 - var6) / var14) {
  186.          ++var5;
  187.       }
  188.  
  189.       double var16 = this.getCtrlX();
  190.       double var18 = this.getCtrlY();
  191.       boolean var20 = (var12 - var8) * (var18 - var8) >= (double)0.0F;
  192.       boolean var21 = (var8 - var12) * (var18 - var12) >= (double)0.0F;
  193.       double[] var22 = new double[3];
  194.       double[] var23 = new double[3];
  195.       fillEqn(var22, var3, var8, var18, var12);
  196.       int var24 = solveQuadratic(var22, var23);
  197.       var24 = evalQuadratic(var23, var24, var20, var21, var22, var6, var16, var10);
  198.  
  199.       while(true) {
  200.          --var24;
  201.          if (var24 < 0) {
  202.             return (var5 & 1) == 1;
  203.          }
  204.  
  205.          if (var1 < var23[var24]) {
  206.             ++var5;
  207.          }
  208.       }
  209.    }
  210.  
  211.    public boolean contains(Point2D var1) {
  212.       return this.contains(var1.getX(), var1.getY());
  213.    }
  214.  
  215.    private static void fillEqn(double[] var0, double var1, double var3, double var5, double var7) {
  216.       var0[0] = var3 - var1;
  217.       var0[1] = var5 + var5 - var3 - var3;
  218.       var0[2] = var3 - var5 - var5 + var7;
  219.    }
  220.  
  221.    private static int evalQuadratic(double[] var0, int var1, boolean var2, boolean var3, double[] var4, double var5, double var7, double var9) {
  222.       int var11 = 0;
  223.  
  224.       for(int var12 = 0; var12 < var1; ++var12) {
  225.          double var13 = var0[var12];
  226.          if ((var2 ? var13 >= (double)0.0F : var13 > (double)0.0F) && (var3 ? var13 <= (double)1.0F : var13 < (double)1.0F) && (var4 == null || var4[1] + (double)2.0F * var4[2] * var13 != (double)0.0F)) {
  227.             double var15 = (double)1.0F - var13;
  228.             var0[var11++] = var5 * var15 * var15 + (double)2.0F * var7 * var13 * var15 + var9 * var13 * var13;
  229.          }
  230.       }
  231.  
  232.       return var11;
  233.    }
  234.  
  235.    private static int getTag(double var0, double var2, double var4) {
  236.       if (var0 <= var2) {
  237.          return var0 < var2 ? -2 : -1;
  238.       } else if (var0 >= var4) {
  239.          return var0 > var4 ? 2 : 1;
  240.       } else {
  241.          return 0;
  242.       }
  243.    }
  244.  
  245.    private static boolean inwards(int var0, int var1, int var2) {
  246.       switch (var0) {
  247.          case -2:
  248.          case 2:
  249.          default:
  250.             return false;
  251.          case -1:
  252.             return var1 >= 0 || var2 >= 0;
  253.          case 0:
  254.             return true;
  255.          case 1:
  256.             return var1 <= 0 || var2 <= 0;
  257.       }
  258.    }
  259.  
  260.    public boolean intersects(double var1, double var3, double var5, double var7) {
  261.       if (!(var5 < (double)0.0F) && !(var7 < (double)0.0F)) {
  262.          double var9 = this.getX1();
  263.          double var11 = this.getY1();
  264.          int var13 = getTag(var9, var1, var1 + var5);
  265.          int var14 = getTag(var11, var3, var3 + var7);
  266.          if (var13 == 0 && var14 == 0) {
  267.             return true;
  268.          } else {
  269.             double var15 = this.getX2();
  270.             double var17 = this.getY2();
  271.             int var19 = getTag(var15, var1, var1 + var5);
  272.             int var20 = getTag(var17, var3, var3 + var7);
  273.             if (var19 == 0 && var20 == 0) {
  274.                return true;
  275.             } else {
  276.                double var21 = this.getCtrlX();
  277.                double var23 = this.getCtrlY();
  278.                int var25 = getTag(var21, var1, var1 + var5);
  279.                int var26 = getTag(var23, var3, var3 + var7);
  280.                if (var13 < 0 && var19 < 0 && var25 < 0) {
  281.                   return false;
  282.                } else if (var14 < 0 && var20 < 0 && var26 < 0) {
  283.                   return false;
  284.                } else if (var13 > 0 && var19 > 0 && var25 > 0) {
  285.                   return false;
  286.                } else if (var14 > 0 && var20 > 0 && var26 > 0) {
  287.                   return false;
  288.                } else if (inwards(var13, var19, var25) && inwards(var14, var20, var26)) {
  289.                   return true;
  290.                } else if (inwards(var19, var13, var25) && inwards(var20, var14, var26)) {
  291.                   return true;
  292.                } else {
  293.                   boolean var27 = var13 * var19 <= 0;
  294.                   boolean var28 = var14 * var20 <= 0;
  295.                   if (var13 == 0 && var19 == 0 && var28) {
  296.                      return true;
  297.                   } else if (var14 == 0 && var20 == 0 && var27) {
  298.                      return true;
  299.                   } else {
  300.                      double[] var29 = new double[3];
  301.                      double[] var30 = new double[3];
  302.                      if (!var28) {
  303.                         fillEqn(var29, var14 < 0 ? var3 : var3 + var7, var11, var23, var17);
  304.                         return solveQuadratic(var29, var30) == 2 && evalQuadratic(var30, 2, true, true, (double[])null, var9, var21, var15) == 2 && getTag(var30[0], var1, var1 + var5) * getTag(var30[1], var1, var1 + var5) <= 0;
  305.                      } else if (!var27) {
  306.                         fillEqn(var29, var13 < 0 ? var1 : var1 + var5, var9, var21, var15);
  307.                         return solveQuadratic(var29, var30) == 2 && evalQuadratic(var30, 2, true, true, (double[])null, var11, var23, var17) == 2 && getTag(var30[0], var3, var3 + var7) * getTag(var30[1], var3, var3 + var7) <= 0;
  308.                      } else {
  309.                         double var31 = var15 - var9;
  310.                         double var33 = var17 - var11;
  311.                         double var35 = var17 * var9 - var15 * var11;
  312.                         int var37;
  313.                         if (var14 == 0) {
  314.                            var37 = var13;
  315.                         } else {
  316.                            var37 = getTag((var35 + var31 * (var14 < 0 ? var3 : var3 + var7)) / var33, var1, var1 + var5);
  317.                         }
  318.  
  319.                         int var38;
  320.                         if (var20 == 0) {
  321.                            var38 = var19;
  322.                         } else {
  323.                            var38 = getTag((var35 + var31 * (var20 < 0 ? var3 : var3 + var7)) / var33, var1, var1 + var5);
  324.                         }
  325.  
  326.                         if (var37 * var38 <= 0) {
  327.                            return true;
  328.                         } else {
  329.                            var37 = var37 * var13 <= 0 ? var14 : var20;
  330.                            fillEqn(var29, var38 < 0 ? var1 : var1 + var5, var9, var21, var15);
  331.                            int var39 = solveQuadratic(var29, var30);
  332.                            evalQuadratic(var30, var39, true, true, (double[])null, var11, var23, var17);
  333.                            var38 = getTag(var30[0], var3, var3 + var7);
  334.                            return var37 * var38 <= 0;
  335.                         }
  336.                      }
  337.                   }
  338.                }
  339.             }
  340.          }
  341.       } else {
  342.          return false;
  343.       }
  344.    }
  345.  
  346.    public boolean intersects(Rectangle2D var1) {
  347.       return this.intersects(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
  348.    }
  349.  
  350.    public boolean contains(double var1, double var3, double var5, double var7) {
  351.       return this.contains(var1, var3) && this.contains(var1 + var5, var3) && this.contains(var1 + var5, var3 + var7) && this.contains(var1, var3 + var7);
  352.    }
  353.  
  354.    public boolean contains(Rectangle2D var1) {
  355.       return this.contains(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
  356.    }
  357.  
  358.    public Rectangle getBounds() {
  359.       return this.getBounds2D().getBounds();
  360.    }
  361.  
  362.    public PathIterator getPathIterator(AffineTransform var1) {
  363.       return new QuadIterator(this, var1);
  364.    }
  365.  
  366.    public PathIterator getPathIterator(AffineTransform var1, double var2) {
  367.       return new FlatteningPathIterator(this.getPathIterator(var1), var2);
  368.    }
  369.  
  370.    public Object clone() {
  371.       try {
  372.          return super.clone();
  373.       } catch (CloneNotSupportedException var2) {
  374.          throw new InternalError();
  375.       }
  376.    }
  377.  
  378.    public abstract Rectangle2D getBounds2D();
  379. }
  380.