Hi,

I am trying to rotate SVGImage, I do not need a resizehandle since i am rotating through the code by calling rotateUp() and rotateDown() methods. Below is what i came up with but could not get it to work.

Also is there a repaint method which i can call? Or i should go about by declaring a new event with LastChangedHint+1.

public class SVGImageRot extends SVGImage {

boolean rotate = false;

boolean clockwise = true;

int currentRotateAngle = 0;

public static final int ROTATE_ANGLE_OFFSET = 5;

public void paint(Graphics2D g, JGoView view) {

super.paint(g, view);

if (getImage() != null && rotate) {

System.out.println(“rotate is true”);

Rectangle rect = getBoundingRect();

AffineTransform xform = new AffineTransform();

xform.rotate(Math.toRadians(currentRotateAngle), rect.width/2, rect.height/2);

g.drawImage(getImage(), xform, this);

rotate = false;

}

}

/**

* This method changes the rotation angle depending

* upon the selected rotation direction and repaints

* the ImagePanel

*/

public void rotate()

{

if(clockwise)

{

//if clockwise then increment the rotation angle

//by the offset till the angle is 360

//then again set to 0

currentRotateAngle += ROTATE_ANGLE_OFFSET;

//mod takes care of setting the angle to 0 if it is 360

currentRotateAngle %= 360;

}

else

{

//if anti-clockwise then decrement the rotation angle

//by the offset till the angle is equal to 0

//then again set to 360

currentRotateAngle -= ROTATE_ANGLE_OFFSET;

if(currentRotateAngle <= 0)

{

currentRotateAngle = 360;

}

}

//repaint the image panel

rotate=true;

update();

}

public void rotateUp(){

setClockwise(true);

rotate();

}

public void rotateDown(){

setClockwise(false);

rotate();

}

public void setClockwise(boolean clockwise) {

this.clockwise = clockwise;

}

public boolean isClockwise() {

return clockwise;

}

}

thanks

Arun

# Rotate SVG Image

Try replacing your paint method with something like the following:

super.paint(g, view);

if (getImage() != null) {

Rectangle rect = getBoundingRect();

AffineTransform xform = new AffineTransform();

xform.translate(rect.x, rect.y);

xform.rotate(Math.toRadians(currentRotateAngle), rect.width/2, rect.height/2);

g.drawImage(getImage(), xform, this);

}

}

Thank you, I got it working if the image is a perfect square for any angle. I think that the super.paint(g, view) paints the image normally and i get another image overlapped with the angled rotation, which i can comment out the g.drawImage in the super class.

I am trying to get this to work even if the image is not a perfect square. I am rotating the image based on the center and calculating the varying bounding box co-ordinates and the dimension and setting it. I am facing two problems.

1. when i drag the image, the mouse pointer and the image position co-ordination is not correct.

2. when i rotate, the image size keeps increasing and i get an out of memory exception.

Can anyone look at my code and point me in the right direction. I am sure the formula i used to calculate is right, but during the rotation i may be missing out something that is causing this.

private void setTransform() {

//get image height and width

Image image = getImage();

int iw = image.getHeight(null);

int ih = image.getHeight(null);

//get the x, y of the image

Point p = getLocation();

int ix = p.x;

int iy = p.y;

//based on ix,iy and iw&ih calculate the center x, y

int cx = ix + iw/2;

int cy = ix + ih/2;

//declare the new bounding rectangle w&h

int bw,bh;

double radians = Math.toRadians(currentRotateAngle);

//first, calculate the width and height of the bounding rectangle.

if(currentRotateAngle == 0.0 || currentRotateAngle == 180.0) {

bw=iw;

bh=ih;

}

// if 90 or 270 (quarter or 3-quarter rotations) the width becomes

// the height, and vice versa

else if(currentRotateAngle == 90.0 || currentRotateAngle == 270.0) {

bw=ih;

bh=iw;

}

// for any other rotation, we need to do some trigonometry

else {

bw = (int)Math.ceil(Math.abs(Math.cos(radians) * iw) + Math.abs(Math.cos(radians) * ih));

bh = (int)Math.ceil(Math.abs(Math.sin(radians) * iw) + Math.abs(Math.sin(radians) * ih));

}

//second, compute the XY(bx, by) of the new bounding rect

int bx = cx - bw/2;

int by = cy - bh/2;

setBoundingRect(bx, by, bw, bh);

xform.translate(cx, cy);

xform.rotate(Math.toRadians(currentRotateAngle), iw/2.0, ih/2.0);

System.out.println("Image wxh = "+iw+“x”+ih);

System.out.println(“Image Center x , y = “+cx+”,”+cy);

System.out.println("Bounding wxh = "+bw+“x”+bh);

System.out.println(“Bounding Rect x, y = “+bx+”,”+by);

System.out.println("current angle = "+currentRotateAngle);

}

public void paint(Graphics2D g, JGoView view) {

super.paint(g, view);

if (getImage() != null) {

setTransform();

g.drawImage(getImage(), xform, this);

}

}

I think you might find instructive the implementations of RotImage.java and RotText.java in the Demo1 example.