예제 #1
0
  public void translate(double dx, double dy) {
    for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) hp.getOrg().translate(dx, dy);

    if (allocationIntersectionPath0 == null) {
      // ici la zone convexe ne coupe pas le bord du PECanvas donc on
      // translate son contour tout bêtement. Il se peut que le résultat
      // se mette à couper le PECanvas, dans ce cas le tireté à la
      // coupure ne sera pas affiché.
      if (boundaryPath0 != null) {
        AffineTransform at;
        boundaryPath0.transform(at = new AffineTransform(1.0, 0.0, 0.0, 1.0, dx, dy));
        if (boundaryPath1 != null) boundaryPath1.transform(at);
      }
    } else {
      // ici la zone convexe coupe le bord du PECanvas donc on recalcule
      // brutalement les formes constituant sa vue.
      boundaryPath0 = null;
    }
    // toutefois on essaie de conserver le calcul de la frontière
    if (boundary != null) for (PicPoint pt : boundary.subdivisionPoints) pt.translate(dx, dy);
  }
예제 #2
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);
   }
 }
예제 #3
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);
   }
 }
예제 #4
0
 public void rotate(PicPoint org, double angle) {
   for (ConvexPolygonalZone.HalfPlane hp : convexPolygonalZone) {
     hp.getOrg().rotate(org, angle);
     hp.getDir().rotate(angle);
   }
 }
예제 #5
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);
   }
 }
예제 #6
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);
    }