public boolean checkContainsPolygon(
      RectangularShape myShape, float[][] arrPointer, int numberPointer, float pX, float pY) {

    float myShapeX = myShape.getX();
    float myShapeY = myShape.getY();
    float arrPoiterTemp[][] = new float[2][numberPointer + 1];

    for (int j = 0; j <= 1; j++) {
      for (int i = 0; i < numberPointer; i++) {
        if (j == 0) {
          arrPoiterTemp[j][i] = arrPointer[j][i] + myShapeX;
        }
        if (j == 1) {
          arrPoiterTemp[j][i] = arrPointer[j][i] + myShapeY;
        }
      }
    }

    boolean c = false;
    int i, j = 0;
    for (i = 0, j = numberPointer - 1; i < numberPointer; j = i++) {
      if (((arrPoiterTemp[1][i] > pY) != (arrPoiterTemp[1][j] > pY))
          && (pX
              < (arrPoiterTemp[0][j] - arrPoiterTemp[0][i])
                      * (pY - arrPoiterTemp[1][i])
                      / (arrPoiterTemp[1][j] - arrPoiterTemp[1][i])
                  + arrPoiterTemp[0][i])) c = !c;
    }

    return c;
  }
  /**
   * Method check Touch Point Contains A Rectangle
   *
   * @myShap: A Sprite Or AnimatedSprite on Scene
   * @x1: Axis coordinates 1 as compared to myShape
   * @x2: Axis coordinates 2 as compared to myShape
   * @y1: Axis coordinates 2 as compared to myShape
   * @y2: Axis coordinates 2 as compared to myShape
   * @pX, pY: Point Touch
   */
  public boolean checkContains(
      RectangularShape myShape, int x1, int y1, int x2, int y2, int pX, int pY) {
    boolean c = false;
    if (myShape != null) {
      int myShapeX = (int) myShape.getX();
      int myShapeY = (int) myShape.getY();

      int polyX[] = new int[] {myShapeX + x1, myShapeX + x1, myShapeX + x2, myShapeX + x2};
      int polyY[] = new int[] {myShapeY + y1, myShapeY + y2, myShapeY + y2, myShapeY + y1};

      int i, j = 0;
      for (i = 0, j = 3; i < 4; j = i++) {
        if (((polyY[i] > pY) != (polyY[j] > pY))
            && (pX < (polyX[j] - polyX[i]) * (pY - polyY[i]) / (polyY[j] - polyY[i]) + polyX[i]))
          c = !c;
      }
    }
    return c;
  }
  private void setItem(
      final ItemType pType, final int pRow, final int pCol, RectangularShape pItem) {

    if (pItem != null)
      if (pItem.getParent() != null)
        throw new IllegalArgumentException("pItem already has a parent!");

    switch (pType) {
      case CAPTION:
        if (mCaption != null) {
          if (mCaption instanceof IMenuItem) mMenuItems.remove(mCaption);
          else detachChild(this.mCaption);
          mCaption = null;
        }
        break;
      case HEADER:
        if (mHeader[pCol] != null) {
          if (mHeader[pCol] instanceof IMenuItem) mMenuItems.remove(mHeader[pCol]);
          else detachChild(mHeader[pCol]);
          mHeader[pCol] = null;
        }
        break;
      case CELL:
        if (mCell[pRow][pCol] != null) {
          if (mCell[pRow][pCol] instanceof IMenuItem) mMenuItems.remove(mCell[pRow][pCol]);
          else detachChild(mCell[pRow][pCol]);
          mCell[pRow][pCol] = null;
        }
        break;
      case FOOTER:
        if (mFooter[pCol] != null) {
          if (mFooter[pCol] instanceof IMenuItem) mMenuItems.remove(mFooter[pCol]);
          else detachChild(mFooter[pCol]);
          mFooter[pCol] = null;
        }
        break;
    }

    if (pItem != null) {
      final GridPanelOptions opt = mOptions;

      final float paddingLeft = opt.getPanelPadding().getLeft();
      final float paddingTop = opt.getPanelPadding().getTop();

      final Margin cellMargin = opt.getCellMargin();
      final float marginLeft = cellMargin.getLeft();
      final float marginTop = cellMargin.getTop();

      final float captionHeight =
          opt.isHasCaption() ? opt.getCaptionMargin().calcOuterHeight(opt.getCaptionHeight()) : 0f;
      final float headerHeight =
          opt.isHasHeader() ? opt.getHeaderMargin().calcOuterHeight(opt.getHeaderHeight()) : 0f;

      final float colWidth = opt.getColWidth();
      final float rowHeight = opt.getRowHeight();

      final float x = paddingLeft + marginLeft + (cellMargin.calcOuterWidth(colWidth)) * pCol;
      float y = paddingTop;

      if (pType == ItemType.HEADER) y += captionHeight;
      if (pType == ItemType.CELL)
        y +=
            captionHeight
                + headerHeight
                + marginTop
                + (cellMargin.calcOuterHeight(rowHeight)) * pRow;
      if (pType == ItemType.FOOTER)
        y +=
            captionHeight
                + headerHeight
                + cellMargin.calcOuterHeight(rowHeight) * opt.getRowCount()
                + opt.getFooterMargin().getTop();

      pItem.setPosition(x, y);

      // TODO scale util
      if (pType == ItemType.CAPTION)
        if (pItem.getHeight() > opt.getCaptionHeight()) {
          pItem.setScale(opt.getCaptionHeight() / pItem.getHeight());
        }
      if (pType == ItemType.HEADER)
        if (pItem.getWidth() != colWidth || pItem.getHeight() != opt.getHeaderHeight()) {
          final float xScaleFactor = colWidth / pItem.getWidth();
          final float yScaleFactor = opt.getHeaderHeight() / pItem.getHeight();

          final float scaleFactor = Math.max(xScaleFactor, yScaleFactor);
          pItem.setScale(scaleFactor);
        }
      if (pType == ItemType.CELL)
        if (pItem.getWidth() != colWidth || pItem.getHeight() != rowHeight) {
          final float xScaleFactor = colWidth / pItem.getWidth();
          final float yScaleFactor = rowHeight / pItem.getHeight();

          final float scaleFactor = Math.max(xScaleFactor, yScaleFactor);
          pItem.setScale(scaleFactor);
        }
      if (pType == ItemType.FOOTER)
        if (pItem.getWidth() != colWidth || pItem.getHeight() != opt.getFooterHeight()) {
          final float xScaleFactor = colWidth / pItem.getWidth();
          final float yScaleFactor = opt.getFooterHeight() / pItem.getHeight();

          final float scaleFactor = Math.max(xScaleFactor, yScaleFactor);
          pItem.setScale(scaleFactor);
        }

      // TODO check skew effect
      final float angle = this.getRotation();
      this.setRotation(0);

      if (pItem instanceof IMenuItem) this.addMenuItem((IMenuItem) pItem);
      else this.attachChild(pItem);

      this.setRotation(angle);

      switch (pType) {
        case CAPTION:
          this.mCaption = pItem;
          break;
        case HEADER:
          this.mHeader[pCol] = pItem;
          break;
        case CELL:
          this.mCell[pRow][pCol] = pItem;
          break;
        case FOOTER:
          this.mFooter[pCol] = pItem;
          break;
      }
    }
  }