예제 #1
0
  /**
   * Reimplementación del método mouseReleased de Behavior.
   *
   * @param e MouseEvent
   * @throws BehaviorException Excepción lanzada cuando el Behavior.
   */
  public void mouseReleased(MouseEvent e) throws BehaviorException {
    super.mouseReleased(e);
    dragged = false;
    if (getLayoutControl().getFirstPoint() == null) return;
    Point2D p1;
    Point2D p2;
    Point pScreen = getLayoutControl().getLastPoint();

    AffineTransform at = getLayoutControl().getAT();

    p1 = FLayoutUtilities.toSheetPoint(getLayoutControl().getFirstPoint(), at);
    p2 = FLayoutUtilities.toSheetPoint(pScreen, at);

    if (e.getButton() == MouseEvent.BUTTON1) {
      //	Fijamos el nuevo extent
      Rectangle2D.Double r = new Rectangle2D.Double();
      r.setFrameFromDiagonal(p1, p2);

      Rectangle2D rectPixel = new Rectangle();
      rectPixel.setFrameFromDiagonal(getLayoutControl().getFirstPoint(), pScreen);

      RectangleEvent event = new RectangleEvent(r, e, rectPixel);
      listener.rectangle(event);
    }
  }
예제 #2
0
  /**
   * Le méthode <code>createShape</code> crée la forme qui sert à visualiser le contour de la zone
   * convexe.
   */
  public void createShape(Rectangle2D allocation) {
    if (boundaryPath0 != null) return;

    if (boundary == null) boundary = convexPolygonalZone.getBoundary();

    if (DEBUG)
      debug(
          "this = "
              + toString()
              + "\n\tboundary = "
              + boundary.toString()
              + "\n\tallocation="
              + allocation.toString());

    if (boundaryPath0 == null) boundaryPath0 = new GeneralPath();
    boundaryPath0.reset();
    if (boundary.subdivisionPoints.size() != 0) {
      // la frontière n'est pas une droite, mais comprend au moins un
      // point de sousdivision.
      boundaryPath1 = null;
      allocationIntersectionPath1 = null;

      PicPoint firstPointInInfinity = null;
      PicPoint secondPointInInfinity = null;
      PicPoint anglePoint = null;
      int i;
      if (boundary.isClosed()) {
        // pas de points à l'infini
        allocationIntersectionPath0 = null;
        allocationIntersectionPath1 = null;

        bounds.setFrameFromDiagonal(
            boundary.subdivisionPoints.get(0), boundary.subdivisionPoints.get(1));
        i = 0;
      } else {
        PointsInInfinity pointsInInfinity = new PointsInInfinity(allocation);
        firstPointInInfinity = pointsInInfinity.get(boundary.halfPlanes.getFirst(), +1);
        boundaryPath0.moveTo(firstPointInInfinity.getX(), firstPointInInfinity.getY());
        secondPointInInfinity = pointsInInfinity.get(boundary.halfPlanes.getLast(), -1);
        anglePoint = pointsInInfinity.getAnglePoint();
        bounds.setFrameFromDiagonal(firstPointInInfinity, secondPointInInfinity);
        i = 1;
      }
      for (PicPoint pt : boundary.subdivisionPoints) {
        if (i == 0) {
          boundaryPath0.moveTo(pt.getX(), pt.getY());
        } else {
          boundaryPath0.lineTo(pt.getX(), pt.getY());
          if (i > 1) bounds.add(pt);
        }
        ++i;
      }
      if (!boundary.isClosed()) {
        boundaryPath0.lineTo(secondPointInInfinity.getX(), secondPointInInfinity.getY());
        if (allocationIntersectionPath0 == null) allocationIntersectionPath0 = new GeneralPath();
        allocationIntersectionPath1 = null;
        allocationIntersectionPath0.reset();
        allocationIntersectionPath0.moveTo(
            firstPointInInfinity.getX(), firstPointInInfinity.getY());
        if (anglePoint != null)
          allocationIntersectionPath0.lineTo(anglePoint.getX(), anglePoint.getY());
        allocationIntersectionPath0.lineTo(
            secondPointInInfinity.getX(), secondPointInInfinity.getY());
      } else boundaryPath0.closePath();
      if (DEBUG) debug("boundaryPath0 = " + boundaryPath0.toString());
    } else if (boundary.halfPlanes.size() > 0) {
      // ici on n'a pas de point de sous-division, donc la zone convexe
      // est soit une bande, soit un demi-plan.
      PointsInInfinity pointsInInfinity0 = new PointsInInfinity(allocation);
      PicPoint firstPointInInfinity0 = pointsInInfinity0.get(boundary.halfPlanes.getFirst(), +1);
      PicPoint secondPointInInfinity0 = pointsInInfinity0.get(boundary.halfPlanes.getFirst(), -1);
      if (boundaryPath0 == null) boundaryPath0 = new GeneralPath();
      boundaryPath0.reset();
      boundaryPath0.moveTo(firstPointInInfinity0.getX(), firstPointInInfinity0.getY());
      boundaryPath0.lineTo(secondPointInInfinity0.getX(), secondPointInInfinity0.getY());

      if (boundary.halfPlanes.size() > 1) {
        // la zone convexe est une bande
        if (boundaryPath1 == null) boundaryPath1 = new GeneralPath();
        boundaryPath1.reset();
        boundaryPath1.moveTo(firstPointInInfinity0.getX(), firstPointInInfinity0.getY());
        PointsInInfinity pointsInInfinity1 = new PointsInInfinity(pointsInInfinity0);

        // Astuce : on prend le complémentaire de l'autre demi-plan de
        // sorte que les points d'angle tournent dans le même sens.
        ConvexPolygonalZone.HalfPlane complementLastHp =
            boundary.halfPlanes.getLast().dirCInverse();

        PicPoint firstPointInInfinity1 = pointsInInfinity1.get(complementLastHp, +1);
        PicPoint secondPointInInfinity1 = pointsInInfinity1.get(complementLastHp, -1);

        /*
         first0  first1	   (0) := boundaryPath0
          x	  (1) x	       (1) := allocationIntersectionPath0
          |		  |	   	   (2) := boundaryPath1
         	   (0)|>   	  |>   	   (3) :=  allocationIntersectionPath1
          |		  |(2)
          x	 (3)  x
        second0   second1

         */
        if (boundaryPath1 == null) boundaryPath1 = new GeneralPath();
        boundaryPath1.reset();
        // on fait trace de `second' vers `first' parce que on a pris
        // le demi plan complémentaire, donc l'ordre est inversé si on
        // veut continuer à tourner dans le même sens.
        boundaryPath1.moveTo(secondPointInInfinity1.getX(), secondPointInInfinity1.getY());
        boundaryPath1.lineTo(firstPointInInfinity1.getX(), firstPointInInfinity1.getY());

        if (allocationIntersectionPath0 == null) allocationIntersectionPath0 = new GeneralPath();
        allocationIntersectionPath0.reset();
        allocationIntersectionPath0.moveTo(
            firstPointInInfinity0.getX(), firstPointInInfinity0.getY());

        if (allocationIntersectionPath1 == null) allocationIntersectionPath1 = new GeneralPath();
        allocationIntersectionPath1.reset();
        // idem, ici il faut partir de `second' et non de `first'
        // toujours pourn la même raison qu'on a pris le demi-plan
        // complémentaire.
        allocationIntersectionPath1.moveTo(
            secondPointInInfinity1.getX(), secondPointInInfinity1.getY());

        PicPoint anglePoint0, anglePoint1;

        anglePoint1 = pointsInInfinity1.getAnglePoint();
        while ((anglePoint0 = pointsInInfinity0.getAnglePoint()) != null) {
          if (anglePoint1 != null && anglePoint0.equals(anglePoint1)) break;
          allocationIntersectionPath0.lineTo(anglePoint0.getX(), anglePoint0.getY());
        }
        allocationIntersectionPath0.lineTo(
            firstPointInInfinity1.getX(), firstPointInInfinity1.getY());

        if (anglePoint1 != null && anglePoint0 != null) {
          for (; ; ) {
            anglePoint0 = pointsInInfinity0.getAnglePoint();
            anglePoint1 = pointsInInfinity1.getAnglePoint();
            if (anglePoint1 == null) break;
            if (anglePoint0 == null) break;
            if (!anglePoint0.equals(anglePoint1)) break;
          }
          while (anglePoint0 != null) {
            allocationIntersectionPath1.lineTo(anglePoint0.getX(), anglePoint0.getY());
            anglePoint0 = pointsInInfinity0.getAnglePoint();
          }
        }

        allocationIntersectionPath1.lineTo(
            secondPointInInfinity0.getX(), secondPointInInfinity0.getY());
      } else {
        // la zone convexe est un demi-plan
        boundaryPath1 = null;
        allocationIntersectionPath1 = null;
        if (allocationIntersectionPath0 == null) allocationIntersectionPath0 = new GeneralPath();
        allocationIntersectionPath0.moveTo(
            firstPointInInfinity0.getX(), firstPointInInfinity0.getY());
        PicPoint anglePoint;
        while ((anglePoint = pointsInInfinity0.getAnglePoint()) != null) {
          allocationIntersectionPath0.lineTo(anglePoint.getX(), anglePoint.getY());
        }
        allocationIntersectionPath0.lineTo(
            secondPointInInfinity0.getX(), secondPointInInfinity0.getY());
      }
    }
  }