/**
   * Is the given sprite visible in the given area.
   *
   * @param sprite The sprite to check.
   * @param X1 The min abscissa of the area.
   * @param Y1 The min ordinate of the area.
   * @param X2 The max abscissa of the area.
   * @param Y2 The max ordinate of the area.
   * @return True if the node lies in the given area.
   */
  protected boolean isSpriteIn(GraphicSprite sprite, double X1, double Y1, double X2, double Y2) {
    if (sprite.isAttachedToNode() && nodeInvisible.contains(sprite.getNodeAttachment().getId())) {
      return false;
    } else if (sprite.isAttachedToEdge() && !isEdgeVisible(sprite.getEdgeAttachment())) {
      return false;
    } else {
      Values size = sprite.getStyle().getSize();
      double w2 = metrics.lengthToPx(size, 0) / 2;
      double h2 = size.size() > 1 ? metrics.lengthToPx(size, 1) / 2 : w2;
      Point2D.Double src = spritePositionPx(sprite); // new Point2D.Double(
      // sprite.getX(),
      // sprite.getY() );

      // Tx.transform( src, src );

      double x1 = src.x - w2;
      double x2 = src.x + w2;
      double y1 = src.y - h2;
      double y2 = src.y + h2;

      if (x2 < X1) return false;
      if (y2 < Y1) return false;
      if (x1 > X2) return false;
      if (y1 > Y2) return false;

      return true;
    }
  }
  /**
   * Check if a sprite contains the given point (x,y).
   *
   * @param elt The sprite.
   * @param x The point abscissa.
   * @param y The point ordinate.
   * @return True if (x,y) is in the given element.
   */
  protected boolean spriteContains(GraphicElement elt, double x, double y) {
    Values size = elt.getStyle().getSize();
    double w2 = metrics.lengthToPx(size, 0) / 2;
    double h2 = size.size() > 1 ? metrics.lengthToPx(size, 1) / 2 : w2;
    Point2D.Double dst = spritePositionPx((GraphicSprite) elt); // new
    // Point2D.Double(
    // elt.getX(),
    // elt.getY()
    // );
    // Point2D.Double dst = new Point2D.Double();

    // Tx.transform( src, dst );
    dst.x -= metrics.viewport[0];
    dst.y -= metrics.viewport[1];

    double x1 = dst.x - w2;
    double x2 = dst.x + w2;
    double y1 = dst.y - h2;
    double y2 = dst.y + h2;

    if (x < x1) return false;
    if (y < y1) return false;
    if (x > x2) return false;
    if (y > y2) return false;

    return true;
  }
  /**
   * Is the given node visible in the given area.
   *
   * @param node The node to check.
   * @param X1 The min abscissa of the area.
   * @param Y1 The min ordinate of the area.
   * @param X2 The max abscissa of the area.
   * @param Y2 The max ordinate of the area.
   * @return True if the node lies in the given area.
   */
  protected boolean isNodeIn(GraphicNode node, double X1, double Y1, double X2, double Y2) {
    Values size = node.getStyle().getSize();
    double w2 = metrics.lengthToPx(size, 0) / 2;
    double h2 = size.size() > 1 ? metrics.lengthToPx(size, 1) / 2 : w2;
    Point2D.Double src = new Point2D.Double(node.getX(), node.getY());
    boolean vis = true;

    Tx.transform(src, src);

    double x1 = src.x - w2;
    double x2 = src.x + w2;
    double y1 = src.y - h2;
    double y2 = src.y + h2;

    if (x2 < X1) vis = false;
    else if (y2 < Y1) vis = false;
    else if (x1 > X2) vis = false;
    else if (y1 > Y2) vis = false;

    return vis;
  }