⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 affinetransform.java

📁 this gcc-g++-3.3.1.tar.gz is a source file of gcc, you can learn more about gcc through this codes f
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
  /**   * Returns a shearing transform (points are shifted in the x direction based   * on a factor of their y coordinate, and in the y direction as a factor of   * their x coordinate):   * <pre>   * [  1  shx 0 ]   * [ shy  1  0 ]   * [  0   0  1 ]   * </pre>   *   * @param shx the x shearing factor   * @param shy the y shearing factor   * @return the shearing transform   */  public static AffineTransform getShearInstance(double shx, double shy)  {    AffineTransform t = new AffineTransform();    t.setToShear(shx, shy);    return t;  }  /**   * Returns the type of this transform. The result is always valid, although   * it may not be the simplest interpretation (in other words, there are   * sequences of transforms which reduce to something simpler, which this   * does not always detect). The result is either TYPE_GENERAL_TRANSFORM,   * or a bit-wise combination of TYPE_TRANSLATION, the mutually exclusive   * TYPE_*_ROTATIONs, and the mutually exclusive TYPE_*_SCALEs.   *   * @see #TYPE_IDENTITY   * @see #TYPE_TRANSLATION   * @see #TYPE_UNIFORM_SCALE   * @see #TYPE_GENERAL_SCALE   * @see #TYPE_QUADRANT_ROTATION   * @see #TYPE_GENERAL_ROTATION   * @see #TYPE_GENERAL_TRANSFORM   */  public int getType()  {    return type;  }  /**   * Return the determinant of this transform matrix. If the determinant is   * non-zero, the transform is invertible; otherwise operations which require   * an inverse throw a NoninvertibleTransformException. A result very near   * zero, due to rounding errors, may indicate that inversion results do not   * carry enough precision to be meaningful.   *   * <p>If this is a uniform scale transformation, the determinant also   * represents the squared value of the scale. Otherwise, it carries little   * additional meaning. The determinant is calculated as:   * <pre>   * | m00 m01 m02 |   * | m10 m11 m12 | = m00 * m11 - m01 * m10   * |  0   0   1  |   * </pre>   *   * @return the determinant   * @see #createInverse()   */  public double getDeterminant()  {    return m00 * m11 - m01 * m10;  }  /**   * Return the matrix of values used in this transform. If the matrix has   * fewer than 6 entries, only the scale and shear factors are returned;   * otherwise the translation factors are copied as well. The resulting   * values are:   * <pre>   * [ d[0] d[2] (d[4]) ]   * [ d[1] d[3] (d[5]) ]   * [  0     0    1    ]   * </pre>   *   * @param d the matrix to store the results into; with 4 (6) entries   * @throws NullPointerException if d is null   * @throws ArrayIndexOutOfBoundsException if d is too small   */  public void getMatrix(double[] d)  {    d[0] = m00;    d[1] = m10;    d[2] = m01;    d[3] = m11;    if (d.length >= 6)      {        d[4] = m02;        d[5] = m12;      }  }  /**   * Returns the X coordinate scaling factor of the matrix.   *   * @return m00   * @see #getMatrix(double[])   */  public double getScaleX()  {    return m00;  }  /**   * Returns the Y coordinate scaling factor of the matrix.   *   * @return m11   * @see #getMatrix(double[])   */  public double getScaleY()  {    return m11;  }  /**   * Returns the X coordinate shearing factor of the matrix.   *   * @return m01   * @see #getMatrix(double[])   */  public double getShearX()  {    return m01;  }  /**   * Returns the Y coordinate shearing factor of the matrix.   *   * @return m10   * @see #getMatrix(double[])   */  public double getShearY()  {    return m10;  }  /**   * Returns the X coordinate translation factor of the matrix.   *   * @return m02   * @see #getMatrix(double[])   */  public double getTranslateX()  {    return m02;  }  /**   * Returns the Y coordinate translation factor of the matrix.   *   * @return m12   * @see #getMatrix(double[])   */  public double getTranslateY()  {    return m12;  }  /**   * Concatenate a translation onto this transform. This is equivalent, but   * more efficient than   * <code>concatenate(AffineTransform.getTranslateInstance(tx, ty))</code>.   *   * @param tx the x translation distance   * @param ty the y translation distance   * @see #getTranslateInstance(double, double)   * @see #concatenate(AffineTransform)   */  public void translate(double tx, double ty)  {    m02 += tx * m00 + ty * m01;    m12 += tx * m10 + ty * m11;    updateType();  }  /**   * Concatenate a rotation onto this transform. This is equivalent, but   * more efficient than   * <code>concatenate(AffineTransform.getRotateInstance(theta))</code>.   *   * @param theta the rotation angle   * @see #getRotateInstance(double)   * @see #concatenate(AffineTransform)   */  public void rotate(double theta)  {    double c = Math.cos(theta);    double s = Math.sin(theta);    double n00 = m00 *  c + m01 * s;    double n01 = m00 * -s + m01 * c;    double n10 = m10 *  c + m11 * s;    double n11 = m10 * -s + m11 * c;    m00 = n00;    m01 = n01;    m10 = n10;    m11 = n11;    updateType();  }  /**   * Concatenate a rotation about a point onto this transform. This is   * equivalent, but more efficient than   * <code>concatenate(AffineTransform.getRotateInstance(theta, x, y))</code>.   *   * @param theta the rotation angle   * @param x the x coordinate of the pivot point   * @param y the y coordinate of the pivot point   * @see #getRotateInstance(double, double, double)   * @see #concatenate(AffineTransform)   */  public void rotate(double theta, double x, double y)  {    translate(x, y);    rotate(theta);    translate(-x, -y);  }  /**   * Concatenate a scale onto this transform. This is equivalent, but more   * efficient than   * <code>concatenate(AffineTransform.getScaleInstance(sx, sy))</code>.   *   * @param sx the x scaling factor   * @param sy the y scaling factor   * @see #getScaleInstance(double, double)   * @see #concatenate(AffineTransform)   */  public void scale(double sx, double sy)  {    m00 *= sx;    m01 *= sy;    m10 *= sx;    m11 *= sy;    updateType();  }  /**   * Concatenate a shearing onto this transform. This is equivalent, but more   * efficient than   * <code>concatenate(AffineTransform.getShearInstance(sx, sy))</code>.   *   * @param shx the x shearing factor   * @param shy the y shearing factor   * @see #getShearInstance(double, double)   * @see #concatenate(AffineTransform)   */  public void shear(double shx, double shy)  {    double n00 = m00 + shx * m01;    double n01 = shx * m00 + m01;    double n10 = m10 * shy + m11;    double n11 = shx * m10 + m11;    m00 = n00;    m01 = n01;    m10 = n10;    m11 = n11;    updateType();  }  /**   * Reset this transform to the identity (no transformation):   * <pre>   * [ 1 0 0 ]   * [ 0 1 0 ]   * [ 0 0 1 ]   * </pre>   */  public void setToIdentity()  {    m00 = m11 = 1;    m01 = m02 = m10 = m12 = 0;    type = TYPE_IDENTITY;  }  /**   * Set this transform to a translation:   * <pre>   * [ 1 0 tx ]   * [ 0 1 ty ]   * [ 0 0 1  ]   * </pre>   *   * @param tx the x translation distance   * @param ty the y translation distance   */  public void setToTranslation(double tx, double ty)  {    m00 = m11 = 1;    m01 = m10 = 0;    m02 = tx;    m12 = ty;    type = (tx == 0 && ty == 0) ? TYPE_UNIFORM_SCALE : TYPE_TRANSLATION;  }  /**   * Set this transform to a rotation. A positive angle (in radians) rotates   * the positive x-axis to the positive y-axis:   * <pre>   * [ cos(theta) -sin(theta) 0 ]   * [ sin(theta)  cos(theta) 0 ]   * [     0           0      1 ]   * </pre>   *   * @param theta the rotation angle   */  public void setToRotation(double theta)  {    double c = Math.cos(theta);    double s = Math.sin(theta);    m00 = c;    m01 = -s;    m02 = 0;    m10 = s;    m11 = c;    m12 = 0;    type = (c == 1 ? TYPE_IDENTITY            : c == 0 || c == -1 ? TYPE_QUADRANT_ROTATION            : TYPE_GENERAL_ROTATION);  }  /**   * Set this transform to a rotation about a point. A positive angle (in   * radians) rotates the positive x-axis to the positive y-axis. This is the   * same as calling:   * <pre>   * tx.setToTranslation(x, y);   * tx.rotate(theta);   * tx.translate(-x, -y);   * </pre>   *   * <p>The resulting matrix is:    * <pre>   * [ cos(theta) -sin(theta) x-x*cos+y*sin ]   * [ sin(theta)  cos(theta) y-x*sin-y*cos ]   * [     0           0            1       ]   * </pre>   *   * @param theta the rotation angle   * @param x the x coordinate of the pivot point   * @param y the y coordinate of the pivot point   */  public void setToRotation(double theta, double x, double y)  {    double c = Math.cos(theta);    double s = Math.sin(theta);    m00 = c;    m01 = -s;    m02 = x - x * c + y * s;    m10 = s;    m11 = c;    m12 = y - x * s - y * c;    updateType();  }  /**   * Set this transform to a scale:   * <pre>   * [ sx 0  0 ]   * [ 0  sy 0 ]   * [ 0  0  1 ]   * </pre>   *   * @param sx the x scaling factor   * @param sy the y scaling factor   */  public void setToScale(double sx, double sy)  {    m00 = sx;    m01 = m02 = m10 = m12 = 0;    m11 = sy;    type = (sx != sy ? TYPE_GENERAL_SCALE            : sx == 1 ? TYPE_IDENTITY : TYPE_UNIFORM_SCALE);  }  /**   * Set this transform to a shear (points are shifted in the x direction based   * on a factor of their y coordinate, and in the y direction as a factor of   * their x coordinate):   * <pre>   * [  1  shx 0 ]   * [ shy  1  0 ]   * [  0   0  1 ]   * </pre>   *   * @param shx the x shearing factor   * @param shy the y shearing factor   */  public void setToShear(double shx, double shy)  {    m00 = m11 = 1;    m01 = shx;    m10 = shy;    m02 = m12 = 0;    updateType();  }  /**   * Set this transform to a copy of the given one.   *   * @param tx the transform to copy   * @throws NullPointerException if tx is null   */  public void setTransform(AffineTransform tx)  {    m00 = tx.m00;    m01 = tx.m01;    m02 = tx.m02;    m10 = tx.m10;    m11 = tx.m11;    m12 = tx.m12;    type = tx.type;  }  /**   * Set this transform to the given values:   * <pre>   * [ m00 m01 m02 ]   * [ m10 m11 m12 ]   * [  0   0   1  ]   * </pre>   *   * @param m00 the x scaling component   * @param m10 the y shearing component   * @param m01 the x shearing component   * @param m11 the y scaling component   * @param m02 the x translation component   * @param m12 the y translation component   */  public void setTransform(double m00, double m10, double m01,                           double m11, double m02, double m12)  {    this.m00 = m00;    this.m10 = m10;    this.m01 = m01;    this.m11 = m11;    this.m02 = m02;    this.m12 = m12;    updateType();  }  /**   * Set this transform to the result of performing the original version of   * this followed by tx. This is commonly used when chaining transformations   * from one space to another. In matrix form:   * <pre>   * [ this ] = [ this ] x [ tx ]   * </pre>   *   * @param tx the transform to concatenate   * @throws NullPointerException if tx is null   * @see #preConcatenate(AffineTransform)   */  public void concatenate(AffineTransform tx)  {    double n00 = m00 * tx.m00 + m01 * tx.m10;    double n01 = m00 * tx.m01 + m01 * tx.m11;    double n02 = m00 * tx.m02 + m01 * tx.m12 + m02;    double n10 = m10 * tx.m00 + m11 * tx.m10;    double n11 = m10 * tx.m01 + m11 * tx.m11;    double n12 = m10 * tx.m02 + m11 * tx.m12 + m12;    m00 = n00;    m01 = n01;    m02 = n02;    m10 = n10;    m11 = n11;    m12 = n12;    updateType();  }  /**   * Set this transform to the result of performing tx followed by the   * original version of this. This is less common than normal concatenation,   * but can still be used to chain transformations from one space to another.   * In matrix form:   * <pre>   * [ this ] = [ tx ] x [ this ]   * </pre>   *   * @param tx the transform to concatenate   * @throws NullPointerException if tx is null   * @see #concatenate(AffineTransform)   */  public void preConcatenate(AffineTransform tx)  {    double n00 = tx.m00 * m00 + tx.m01 * m10;    double n01 = tx.m00 * m01 + tx.m01 * m11;    double n02 = tx.m00 * m02 + tx.m01 * m12 + tx.m02;    double n10 = tx.m10 * m00 + tx.m11 * m10;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -