/*Rotation Applet von Thomas Elste (www.elste.org)*/ import java.awt.*; import java.applet.*; import java.net.*; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.awt.event.*; import java.lang.*; import java.io.*; import java.lang.String; public class Rot extends Applet implements MouseMotionListener,MouseListener { //------------Bildobjekte----------------- private Image tNadel; private Image tNadelRot; private Image offscreen; //-----------Sonstige--------------------- private Graphics bufferGraphics; private MediaTracker mt; private URL base; int image_h,image_w,i_x,i_y; //----------Lookuptabellen für die Rotation------------ private double sin_lookup[]; private double cos_lookup[]; private int currentAngle; //------------Konstanten------------------ final int apWidth=800; final int apHeight=600; /**************************************************************************************************** init Methode alle Initialisierungsfunktionen des Applets *****************************************************************************************************/ public void init() { resize(apWidth,apHeight); currentAngle=0; //-----------Lookup Tabellen ausrechnen sin_lookup=new double[360]; for (int i=0;i<360;i++) sin_lookup[i]=Math.sin(Math.toRadians(i)); cos_lookup=new double[360]; for (int i=0;i<360;i++) cos_lookup[i]=Math.cos(Math.toRadians(i)); //-----------neuer Medientracker mt = new MediaTracker(this); //-----------Appletbasisadresse ermitteln try { base = getDocumentBase(); } catch (Exception e) {} //-----------Bildobjekte fürs Doublebuffering initialisieren offscreen = createImage(apWidth,apHeight); bufferGraphics = offscreen.getGraphics(); addMouseMotionListener(this); addMouseListener(this); String bild=new String(" "); try { bild=getParameter("Bild"); } catch (NumberFormatException e) { } //-----------Bilder und Grafiken laden tNadel=getImage(base,bild); tNadelRot=tNadel; //-----------Laden überwachen mt.addImage(tNadel,1); try { mt.waitForAll(); } catch (InterruptedException e) {} image_h=tNadel.getWidth(this)/2; image_w=tNadel.getHeight(this)/2; //System.out.println(image_h+" "+image_w); tNadelRot=irotate(tNadel,image_w,image_h,currentAngle); repaint(); } public void start() { } public void stop() { } public void destroy() { } /**************************************************************************************************** paint Methode enthält alle Zeichenfunktionen des Applets *****************************************************************************************************/ public void paint(Graphics g) { int l,tw,th; //--------------Puffer leeren-------------------- bufferGraphics.clearRect(0,0,apWidth,apHeight); bufferGraphics.drawImage(tNadelRot,i_x,i_y,this); g.drawImage(offscreen,0,0,this); } public void update(Graphics g) { paint(g); } /**************************************************************************************************** mouseMoved Methode Mausbewegung, hier: verändert Cursor, wenn im aktiven Bereich (z.B. Lampen) *****************************************************************************************************/ public void mouseMoved(MouseEvent me) { i_x=me.getX(); i_y=me.getY(); repaint(); } public void mouseDragged(MouseEvent me) { currentAngle++; if(currentAngle>359) currentAngle=0; tNadelRot=irotate(tNadel,image_w,image_h,currentAngle); repaint(); } public void mouseEntered (MouseEvent me) { } public void mousePressed (MouseEvent me) { } public void mouseClicked (MouseEvent me) { } public void mouseReleased (MouseEvent me) { } public void mouseExited (MouseEvent me) { } /**************************************************************************************************** irotate Methode dreht ein Image Objekt um den Winkel angle und den Punkt i_wi_mid, i_he_mid *****************************************************************************************************/ public Image irotate(Image isource, double i_wi_mid, double i_he_mid, int angle) { int i_wi=isource.getWidth(this); int i_he=isource.getHeight(this); int area = i_wi * i_he; int source[] = new int[area]; try { PixelGrabber pg = new PixelGrabber(isource, 0, 0, i_wi, i_he, source, 0, i_wi); pg.grabPixels(); } catch(InterruptedException e) { } int target_2d[][]=new int[i_he+1][i_wi+1]; int source_2d[][]=new int[i_he+1][i_wi+1]; int i_alt=0,j_alt=0; dim1todim2(source,source_2d,i_wi,i_he); for(int i=0;ii_he-1) i_alt=i_he-1; if(j_alt>i_wi-1) j_alt=i_wi-1; target_2d[i][j]=source_2d[i_alt][j_alt]; } } dim2todim1(target_2d,source,i_wi,i_he); return(createImage(new MemoryImageSource(i_wi, i_he, source, 0, i_wi))); } /**************************************************************************************************** dim1todim2 Methode wandelt ein 1 dimensionales Array in eine 2 dimensionale Matrix um (row major) *****************************************************************************************************/ public void dim1todim2(int dim1[],int dim2[][],int w_x,int w_y) { for(int i=0;i