Example #1
0
 public void scale(PicPoint pt, double dx, double dy) {
   for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) {
     hp.getOrg().scale(pt, dx, dy);
     hp.getDir().scale(dx, dy);
   }
 }
Example #2
0
 public void scale(double x, double y, double dx, double dy) {
   for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) {
     hp.getOrg().scale(x, y, dx, dy);
     hp.getDir().scale(dx, dy);
   }
 }
Example #3
0
 public void shear(PicPoint pt, double shx, double shy) {
   for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) {
     hp.getOrg().shear(pt, shx, shy);
     hp.getDir().scale(shx, shy);
   }
 }
Example #4
0
 public void rotate(PicPoint org, double angle) {
   for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) {
     hp.getOrg().rotate(org, angle);
     hp.getDir().rotate(angle);
   }
 }
Example #5
0
    /**
     * Renvoie le point le plus loin de l'origine d'une demi-droite coupant le rectangle
     * d'allocation passé à la construction de <code>this</code>. La demi-droite est déterminée
     * comme l'une des demi-bordure d'un <code>ConvexPolygonalZone.HalfPlane</code> selon selon
     * l'argument <code>direction</code>.
     *
     * @param hp une valeur <code>ConvexPolygonalZone.HalfPlane</code> déterminant l'une ou l'autre
     *     des demi-droite frontière du demi-plan de part et d'autre de son point d'origine.
     * @param direction une valeur <code>double</code> égale à +1 ou -1, selectionnant la bonne des
     *     deux demi-droites.
     * @return une valeur <code>PicPoint</code>
     */
    PicPoint get(ConvexPolygonalZone.HalfPlane hp, double direction) {
      double nx, ny, ux, uy, ox, oy;
      nx = hp.getDir().getX();
      ny = hp.getDir().getY();
      ux = direction * ny;
      uy = direction * -nx;
      ox = hp.getOrg().getX();
      oy = hp.getOrg().getY();
      // on cherche le point d'intersection entre la bordure de la zone
      // convexe et la bordure du PECanvas sous la forme de
      // o + lambda * u, avec o = (ox, oy) et u = (ux, uy)
      double lambdaX, lambdaY, lambda;
      int xMap = 0;
      int yMap = 0;
      int shiftLeft = 2 * anglePointNb++;
      if (ux != 0.0) {
        lambdaX = (x0 - ox) / ux;

        lambda = (x1 - ox) / ux;
        if (lambda > lambdaX) {
          // la bordure verticale de *droite* du PECanvas est celle
          // qui est du bon côté
          lambdaX = lambda;
          xMap = 3;
        } else
          // la bordure verticale de *gauche* du PECanvas est celle
          // qui est du bon côté
          xMap = 1;

      } else {
        lambdaX = Double.POSITIVE_INFINITY;
        xMap = 2;
      }

      if (uy != 0.0) {
        lambdaY = (y0 - oy) / uy;

        lambda = (y1 - oy) / uy;
        if (lambda > lambdaY) {
          // la bordure verticale du *haut* du PECanvas est celle
          // qui est du bon côté
          lambdaY = lambda;
          yMap = 3;
        } else
          // la bordure verticale du *bas* du PECanvas est celle
          // qui est du bon côté
          yMap = 1;

      } else {
        lambdaY = Double.POSITIVE_INFINITY;
        yMap = 2;
      }

      if (lambdaY > lambdaX) {
        // la bordure de zone convexe coupe une bordure *verticale* de
        // PECanvas en premier
        lambda = lambdaX;
        if (ny * (yMap - 2) < 0) yMap = 4 - yMap;
      } else {
        // la bordure de zone convexe coupe une bordure *horizontale*
        // de PECanvas en premier
        lambda = lambdaY;
        if (nx * (xMap - 2) < 0) xMap = 4 - xMap;
      }

      this.xMap |= xMap << shiftLeft;
      this.yMap |= yMap << shiftLeft;

      return new PicPoint(ox + lambda * ux, oy + lambda * uy);
    }