home *** CD-ROM | disk | FTP | other *** search
Java Source | 1999-04-04 | 3.3 KB | 130 lines |
- /*
- * @(#)Rotate.java 1.0 1999/04/03
- *
- * Copyright (c) 1999, David Griffiths. All Rights Reserved.
- *
- * This software is the proprietary information of David Griffiths.
- * This source code may not be published or redistributed without the
- * express permission of the author.
- *
- * THE AUTHOR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
- * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE FOR ANY DAMAGES
- * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
- * THIS SOFTWARE OR ITS DERIVATIVES.
- *
- */
-
- import java.awt.Graphics;
- import java.awt.Image;
- import java.awt.Color;
- import java.lang.Math;
- import java.awt.*;
-
- public class Rotate extends java.applet.Applet implements Runnable {
- Image origImg, backImg;
- int w1, h1;
- Thread thrRotate;
-
- public void start () {
- if (thrRotate == null) {
- thrRotate = new Thread (this);
- thrRotate.start ();
- }
- }
-
- public void stop () {
- if (thrRotate != null) {
- thrRotate.stop ();
- thrRotate = null;
- }
- }
-
- public void run () {
- loadImage ();
- Image rotateImg = createImage (w1 << 1, h1 << 1);
- Graphics rotateG = rotateImg.getGraphics();
- rotateG.setColor(Color.white);
- backImg = createImage (w1 << 1, h1 << 1);
- Graphics backG = backImg.getGraphics();
- int angle = 0;
- while (thrRotate != null) {
- rotateG.fillRect(0, 0, w1 << 1, h1 << 1);
- rotateG.drawImage(origImg, 0, 0, this);
- rotateImage (rotateG, (double)angle * Math.PI / 180.0);
- if ((angle += 5) > 90)
- angle = 0;
- backG.drawImage(rotateImg, 0, 0, this);
- try {
- Thread.sleep (50);
- }
- catch (InterruptedException e) {}
- repaint ();
- }
- }
-
- public void loadImage () {
- MediaTracker tracker = new MediaTracker(this);
- String nextImage = getParameter ("image");
- origImg = getImage (getDocumentBase(), nextImage);
-
- tracker.addImage(origImg, 0);
-
- try {
- tracker.waitForID(0);
- }
- catch(InterruptedException e) {}
-
- w1 = origImg.getWidth (this);
- h1 = origImg.getHeight (this);
- }
-
- private final static double QUART = (Math.PI / 2.0);
- private final static double OCT = (Math.PI / 4.0);
-
- public void rotateImage (Graphics g, double angle) {
- if (angle > OCT) {
- skewY (g, 1);
- skewX (g, 1);
- skewY (g, 1);
- angle -= QUART;
- }
-
- skewX(g, Math.tan (angle / 2.0));
- skewY(g, Math.sin (angle));
- skewX(g, Math.tan (angle / 2.0));
- }
-
- public void skewX (Graphics g, double skewing) {
- double l;
- for (int i = 0; i < (h1<<1); i++) {
- l = ((double)i * -skewing)
- + ((double)h1 * skewing);
- g.copyArea (0, i, ((w1 * 3) >> 1), 1, (int)l, 0);
- g.drawLine ((int)l, i, 0, i);
- g.drawLine ((int)l + ((w1 * 3) >> 1),
- i, (w1 * 3) >> 1, i);
- }
- }
-
- public void skewY (Graphics g, double skewing) {
- double l;
- for (int i = 0; i < ((w1 * 3) >> 1); i++) {
- l = ((double)i * skewing);
- g.copyArea (i, 0, 1, h1<<1, 0, (int)l);
- g.drawLine (i, (int)l, i, 0);
- g.drawLine (i, (int)l + (h1<<1), i, h1<<1);
- }
- }
-
- public void update (Graphics g) {
- paint (g);
- }
-
- public void paint (Graphics g) {
- if (backImg != null)
- g.drawImage (backImg, 0, 0, this);
- }
- }
-