0 Replies Latest reply: Feb 12, 2013 6:45 AM by 990282 RSS

    custom shape rotation issue

    990282
      I am trying to rotate a custom shape around its center, but can not get the result as expected.

      what i want is

      shape should be rotated around its center without moving itself.

      what my solution is currently doing is rotating
      a whole shape around its center , by every rotation its changing its position.

      I have multiple shapes so i have created a class to encapsulate a shape with its transform in following class

      view plaincopy to clipboardprint?
      Note: Text content in the code blocks is automatically word-wrapped

      public abstract class Shoe implements Shape, ShoeShape { 

      // variable declaration

      /**
      *
      */
      public Shoe() { 
      position = new Point();
      lastPosition = new Point();
      }




      public void draw(Graphics2D g2, AffineTransform transform, boolean firstTime) { 

      AffineTransform af = firstTime ? getInitTransform()
      : getCompositeTransform();

      if (af != null) { 


      Shape s = af.createTransformedShape(this);

      if (getFillColor() != null) { 
      g2.setColor(getFillColor());
      g2.fill(s);
      } else { 
      g2.draw(s);
      }
      }

      }



      }




      public AffineTransform getCompositeTransform() { 
      AffineTransform af = new AffineTransform();
      af.setToIdentity();
      af.translate(position.getX(), position.getY());
      Point2D centerP = calculateShapeCenter();
      af.rotate(orientation, centerP.getX(), centerP.getY());
      return af;
      }







      public void onMouseDrag(MouseEvent me, Rectangle2D canvasBoundary,
      int selectionOperation) { 

      // shape operation can be either resize , rotate , translate ,
      switch (selectionOperation) { 
      case MmgShoeViewer.SHAPE_OPERATION_MOVE:
      // MOVEMENT
      break;
      case MmgShoeViewer.SHAPE_OPERATION_ROTATE:

      Point2D origin = calculateShapeCenter();
      Point2D.Double starting = new Point2D.Double(me.getX(), me.getY());
      currentAngle = RotationHelper.getAngle(origin, starting);
      rotationAngle = currentAngle - startingAngle;
      rotate(rotationAngle);
      break;
      case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
      break;
      default:
      System.out.println(" invalid select operation");
      }
      }



      public void onMousePress(MouseEvent me, Rectangle2D canvasBoundary,
      int selectionOperation) { 

      // shape operation can be either resize , rotate , translate ,
      switch (selectionOperation) { 
      case MmgShoeViewer.SHAPE_OPERATION_MOVE:
      break;
      case MmgShoeViewer.SHAPE_OPERATION_ROTATE:
      Point2D origin = calculateShapeCenter();
      Point2D.Double starting = new Point2D.Double(me.getX(), me.getY());
      startingAngle = RotationHelper.getAngle(origin, starting);
      setShapeOperation(selectionOperation);
      break;
      case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
      break;
      default:
      System.out.println(" invalid select operation");
      }
      }

      public void onMouseRelease(MouseEvent me, Rectangle2D canvasBoundary,
      int selectionOperation) { 

      // shape operation can be either resize , rotate , translate ,
      switch (selectionOperation) { 
      case MmgShoeViewer.SHAPE_OPERATION_MOVE:
      break;
      case MmgShoeViewer.SHAPE_OPERATION_ROTATE:
      // FIXME rotation angle computation
      setShapeOperation(-1);
      break;
      case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
      break;
      default:
      System.out.println(" invalid select operation");
      }
      }

      public void rotate(double angle) { 
      orientation = (float) angle;
      }


      public void translate(double deltaX, double deltaY) { 

      position.setLocation(deltaX, deltaY);
      lastPosition.setLocation(deltaX, deltaY);
      }







      // another getter and setter




      I am calculating angle of rotation using following method

      public static double getAngle(Point2D origin, Point2D other) {

      double dy = other.getY() - origin.getY();
      double dx = other.getX() - origin.getX();
      double angle;

      if (dx == 0) {// special case
      angle = dy >= 0 ? Math.PI / 2 : -Math.PI / 2;
      } else {
      angle = Math.atan(dy / dx);
      if (dx < 0) // hemisphere correction
      angle += Math.PI;
      }
      // all between 0 and 2PI
      if (angle < 0) // between -PI/2 and 0
      angle += 2 * Math.PI;
      return angle;
      }

      in mouse press event of the canvas mouse listener

      selectedShape.onMousePress(me, canvasBoundary, shoeViewer
      .getShapeOperation());

      i am just calling selected shape's onMousePress method

      and in my mouse drag method of the canvas mouse listener , i am just calling the selected shape's onMouseDrag method which updates the rotation angle as you can see from the very first class

      selectedShape.onMouseDrag(me, canvasBoundary, shoeViewer
      .getShapeOperation());

      and you can see the draw method of the individual shape , to draw the shape according to current transform , i am calling from paintComponent like

      Iterator<Shoe> shoeIter = shoeShapeMap.values().iterator();

      while (shoeIter.hasNext()) {

      Shoe shoe = shoeIter.next();
      shoe.draw(g2, firstTime);

      }

      where shoeShapeMap contains all of the custom shapes currently on the canvas.

      is i am doing mistake in calculating angle or determining anchor point ? my current solution rotates shape 360 degree by checking all the conditions[90 degree etc.] as you can see in the above mentioned method.

      i want the shape should be rotated around its center without resizing its positions ? in the word it is difficult to explain , so please suggest me any better way to show here what i want to accomplish ?

      i think i have mentioned all the things related to this issue. if you have any doubts please feel free to ask me.

      Thank You
      Mihir Parekh