Exemplo n.º 1
0
  /**
   * Gets a Rectangle from {@link #getBox()} and returns the Point where a line from the center of
   * the Rectangle to the Point <i>reference</i> intersects the Rectangle.
   *
   * @param reference The reference point
   * @return The anchor location
   */
  public Point getLocation(Point reference) {
    Rectangle r = Rectangle.SINGLETON;
    r.setBounds(getBox());
    r.translate(-1, -1);
    r.resize(1, 1);

    getOwner().translateToAbsolute(r);
    float centerX = r.x + 0.5f * r.width;
    float centerY = r.y + 0.5f * r.height;

    if (r.isEmpty() || (reference.x == (int) centerX && reference.y == (int) centerY))
      return new Point((int) centerX, (int) centerY); // This avoids divide-by-zero

    float dx = reference.x - centerX;
    float dy = reference.y - centerY;

    // r.width, r.height, dx, and dy are guaranteed to be non-zero.
    float scale = 0.5f / Math.max(Math.abs(dx) / r.width, Math.abs(dy) / r.height);

    dx *= scale;
    dy *= scale;
    centerX += dx;
    centerY += dy;

    return new Point(Math.round(centerX), Math.round(centerY));
  }