rotation - Spinning an image around like spinning a coin in Java -


how spin image around coin spin if spun 1 on table in java?

exactly this gif.

i have tried shearing using affinetransform. it's not giving me output want though.

as can see 2 images, shearing kind of distorts image making larger rather rotating image.

caveat: you're not ever going same result displayed, can fake it

basically, example simple scales x-axis -1 1 , again...

enter image description here

import java.awt.borderlayout; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.affinetransform; import java.awt.image.bufferedimage; import java.io.file; import java.io.ioexception; import java.util.logging.level; import java.util.logging.logger; import javax.imageio.imageio; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.timer; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class sheartest {      public static void main(string[] args) {         new sheartest();     }      public sheartest() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                 }                  jframe frame = new jframe("testing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                 frame.add(new testpane());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class testpane extends jpanel {          private bufferedimage img;          private float xscale = 1f;         private float xdelta = 0.05f;          public testpane() {              try {                 img = imageio.read(new file("c:\\hold\\thumbnails\\megatokyo.jpg"));             } catch (ioexception ex) {                 ex.printstacktrace();             }              final timer timer = new timer(40, new actionlistener() {                 @override                 public void actionperformed(actionevent e) {                     xscale += xdelta;                     if (xscale > 1) {                         xdelta *= -1;                     } else if (xscale < -1) {                         xdelta *= -1;                     }                     repaint();                 }             });             timer.start();         }          @override         public dimension getpreferredsize() {             return img == null ? new dimension(200, 200) : new dimension(img.getwidth(), img.getheight());         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             if (img != null) {                 graphics2d g2d = (graphics2d) g.create();                  int x = (int)((getwidth() - (img.getwidth() * xscale)) / 2);                 int y = (getheight() - img.getheight()) / 2;                  affinetransform @ = new affinetransform();                 at.translate(x, y);                 at.scale(xscale, 1);                  g2d.settransform(at);                 g2d.drawimage(img, 0, 0, this);                  g2d.dispose();             }         }     } }