home *** CD-ROM | disk | FTP | other *** search
/ com!online 2002 May / comcd0502.iso / homepage / javaspecial / 03_01 / kubik / Kubik.java < prev    next >
Encoding:
Java Source  |  1999-08-19  |  7.4 KB  |  334 lines

  1. import java.applet.*;
  2. import java.awt.*;
  3. import java.util.*;
  4.  
  5. /**
  6.  * This applet displays arbitrary text as rotating 3D letters.
  7.  * <P>
  8.  * Example HTML code:
  9.  * <APPLET code="Kubik.class" width=333 height=111>
  10.  * <PARAM name="text" value="Okinawa">
  11.  * <PARAM name="foreground" value="FF0000">
  12.  * <PARAM name="screen distance" value="100">
  13.  * <PARAM name="camera distance" value="200">
  14.  * </APPLET>
  15.  * <P>
  16.  * author: Michael Kraus<BR>
  17.  * version: 1.2<BR>
  18.  * date: 1999/5/17<BR>
  19.  * environment: JDK 1.0.2<BR>
  20.  * email: <A href="michael.kraus@informatik.uni-muenchen.de">michael.kraus@informatik.uni-muenchen.de</A><BR>
  21.  * homepage: <A href="www.informatik.uni-muenchen.de/~_michael.kraus/kubik.html">www.informatik.uni-muenchen.de/~_michael.kraus/kubik.html</A>
  22.  */
  23.  
  24. public class Kubik extends Applet implements Runnable
  25. {
  26.     private Thread thread;
  27.     ParameterUtilities parameterUtilities;
  28.  
  29.     private FixedCamera camera;
  30.     private Vector wireframeVector;
  31.  
  32.     private Dimension appletDimension;
  33.  
  34.     private Color foreground;
  35.     private Color background;
  36.  
  37.     private int dxangle;
  38.     private int dyangle;
  39.     private int dzangle;
  40.  
  41.     private int delay;
  42.  
  43.     private int prev_x;
  44.     private int prev_y;
  45.  
  46.     private int getAngleParameter(String name,int xdefault)
  47.     {
  48.         int angle;
  49.         String parameter=getParameter(name);
  50.  
  51.         if(parameter==null)
  52.             angle=xdefault;
  53.         else if(parameter.equalsIgnoreCase("RANDOM"))
  54.             angle=(int)(Math.random()*360);
  55.         else
  56.             angle=Integer.parseInt(parameter,10);
  57.  
  58.         return angle*FastMath.TWOPI/360;
  59.     }
  60.  
  61.     public void init()
  62.     {
  63.         int n;
  64.         char character;
  65.         Wireframe letter;
  66.  
  67.         int xpos;
  68.         int ypos;
  69.         int zpos;
  70.  
  71.         int z0pos;
  72.         int dzpos;
  73.         int maxxpos;
  74.  
  75.         int x0angle;
  76.         int y0angle;
  77.         int z0angle;
  78.  
  79.         int dx0angle;
  80.         int dy0angle;
  81.         int dz0angle;
  82.  
  83.         int width;
  84.         int lastwidth;
  85.  
  86.         String text;
  87.         int size;
  88.  
  89.         int cameradistance;
  90.         int screendistance;
  91.  
  92.         appletDimension=size();
  93.         parameterUtilities=new ParameterUtilities(this);
  94.  
  95.         if((text=getParameter("text"))!=null)
  96.         {
  97.             text=text.toUpperCase();
  98.         }
  99.         else
  100.         {
  101.             text="KUBIK";
  102.         }
  103.         
  104.  
  105.         wireframeVector=new Vector(size=text.length());
  106.  
  107.         xpos=0;
  108.         ypos=0;
  109.  
  110.         maxxpos=0;
  111.         lastwidth=0;
  112.  
  113.         z0pos=parameterUtilities.getIntegerParameter("zpos",0);
  114.         dzpos=parameterUtilities.getIntegerParameter("dzpos",0);
  115.         zpos=z0pos;
  116.  
  117.         x0angle=getAngleParameter("x0",0);
  118.         y0angle=getAngleParameter("y0",0);
  119.         z0angle=getAngleParameter("z0",0);
  120.  
  121.         dx0angle=getAngleParameter("dx0",15);
  122.         dy0angle=getAngleParameter("dy0",45);
  123.         dz0angle=getAngleParameter("dz0",0);
  124.  
  125.         for(n=0;n<size;n++)
  126.         {
  127.             character=text.charAt(n);
  128.  
  129.             if(character==' ')
  130.             {
  131.                 xpos+=(lastwidth+KubikFont.SPACEWIDTH)/2+KubikFont.SPACEWIDTH;
  132.                 lastwidth=KubikFont.SPACEWIDTH;
  133.                 zpos+=dzpos;
  134.             }
  135.             else if(character=='|')
  136.             {
  137.                 maxxpos=Math.max(maxxpos,xpos+lastwidth/2-KubikFont.SPACEWIDTH);
  138.  
  139.                 xpos=0;
  140.                 ypos+=KubikFont.LINEHEIGHT;
  141.                 zpos=z0pos;
  142.  
  143.                 lastwidth=0;
  144.             }
  145.             else
  146.             {
  147.                 width=KubikFont.getWidth(character);
  148.                 xpos+=(lastwidth+width)/2;
  149.                 lastwidth=width;
  150.  
  151.                 wireframeVector.addElement(new Wireframe(KubikFont.getLocal(character),KubikFont.getSurface(text.charAt(n)),xpos,ypos,zpos,x0angle,y0angle,z0angle));
  152.  
  153.                 xpos+=KubikFont.SPACEWIDTH;
  154.                 zpos+=dzpos;
  155.  
  156.                 x0angle+=dx0angle;
  157.                 y0angle+=dy0angle;
  158.                 z0angle+=dz0angle;
  159.             }
  160.         }
  161.  
  162.         maxxpos=Math.max(maxxpos,xpos+lastwidth/2-KubikFont.SPACEWIDTH);
  163.  
  164.         cameradistance=parameterUtilities.getIntegerParameter("camera distance",10000);
  165.         screendistance=parameterUtilities.getIntegerParameter("screen distance",5000);
  166.  
  167.         camera=new FixedCamera(maxxpos/2,ypos/2,-cameradistance,appletDimension.width,appletDimension.height,screendistance);
  168.  
  169.         setForeground(foreground=parameterUtilities.getColorParameter("foreground",Color.green));
  170.         setBackground(background=parameterUtilities.getColorParameter("background",Color.black));
  171.  
  172.         dxangle=getAngleParameter("dx",-2);
  173.         dyangle=getAngleParameter("dy",-10);
  174.         dzangle=getAngleParameter("dz",0);
  175.  
  176.         delay=10*parameterUtilities.getIntegerParameter("delay",10);
  177.  
  178.         for(n=0;n<wireframeVector.size();n++)
  179.         {
  180.             camera.addWireframe((Wireframe)wireframeVector.elementAt(n));
  181.         }
  182.     }
  183.  
  184.     public void run()
  185.     {
  186.         while(true)
  187.         {
  188.             for(int n=0;n<wireframeVector.size();n++)
  189.             {
  190.                 ((Wireframe)wireframeVector.elementAt(n)).rotate(dxangle,dyangle,dzangle);
  191.             }
  192.  
  193.             repaint();
  194.  
  195.             try
  196.             {
  197.                 thread.sleep(delay);
  198.             }
  199.             catch(InterruptedException exception)
  200.             {
  201.             }
  202.         }
  203.     }
  204.  
  205.     public void update(Graphics graphics)
  206.     {
  207.         int n;
  208.         Image dbuf;
  209.         Graphics dbufgraphics;
  210.  
  211.         dbuf=createImage(appletDimension.width,appletDimension.height);
  212.         dbufgraphics=dbuf.getGraphics();
  213.  
  214.         dbufgraphics.setColor(background);
  215.         dbufgraphics.fillRect(0,0,appletDimension.width,appletDimension.height);
  216.  
  217.         dbufgraphics.setColor(foreground);
  218.  
  219.         camera.draw(dbufgraphics);
  220.  
  221.         graphics.drawImage(dbuf,0,0,null);
  222.     }
  223.  
  224.     public void paint(Graphics graphics)
  225.     {
  226.         update(graphics);
  227.     }
  228.  
  229.     public String[][] getParameterInfo()
  230.     {
  231.         String parameterinfo[][]=
  232.         {
  233.             {"text","String","Only 'A' through 'Z' and blanks supported. Use '|' as newline."},
  234.             {"foreground","24 bit RGB (hex. int)/RANDOM/DARK RANDOM/LIGHT RANDOM","default: green"},
  235.             {"background","24 bit RGB (hex. int)/RANDOM/DARK RANDOM/LIGHT RANDOM","default: black"},
  236.             {"camera distance","pixels (int)","default: 10000"},
  237.             {"screen distance","pixels (int)","default: 5000"},
  238.             {"dx","degrees (int)","default: -2"},
  239.             {"dy","degrees (int)","default: -10"},
  240.             {"dz","degrees (int)","default: 0"},
  241.             {"delay","1/100 seconds (int)","default: 10"},
  242.             {"zpos","pixels (int)","default: 0"},
  243.             {"dzpos","pixels (int)","default: 0"},
  244.             {"x0","degrees (int)","default: 0"},
  245.             {"y0","degrees (int)","default: 0"},
  246.             {"z0","degrees (int)","default: 0"},
  247.             {"dx0","degrees (int)","default: 15"},
  248.             {"dy0","degrees (int)","default: 45"},
  249.             {"dz0","degrees (int)","default: 0"}
  250.         };
  251.  
  252.         return parameterinfo;
  253.     }
  254.  
  255.     public String getAppletInfo()
  256.     {
  257.         return
  258.             "Kubik\n"+
  259.             "\n"+
  260.             "author: Michael Kraus\n"+
  261.             "version: 1.2\n"+
  262.             "date: January 1998\n"+
  263.             "environment: JDK 1.0.2\n"+
  264.             "email: michael.kraus@informatik.uni-muenchen.de\n"+
  265.             "homepage: www.informatik.uni-muenchen.de/~michael.kraus\n";
  266.     }
  267.  
  268.     public void start()
  269.     {
  270.         if(thread==null)
  271.         {
  272.             thread=new Thread(this);
  273.             thread.start();
  274.         }
  275.     }
  276.  
  277.     public void stop()
  278.     {
  279.         if(thread!=null)
  280.         {
  281.             thread.stop();
  282.             thread=null;
  283.         }
  284.     }
  285.  
  286.     public boolean mouseEnter(Event event,int x,int y)
  287.     {
  288.         stop();
  289.  
  290.         prev_x=x;
  291.         prev_y=y;
  292.  
  293.         return true;
  294.     }
  295.  
  296.     public boolean mouseExit(Event event,int x,int y)
  297.     {
  298.         start();
  299.  
  300.         return true;
  301.     }
  302.  
  303.     public boolean mouseMove(Event event,int x,int y)
  304.     {
  305.         for(int n=0;n<wireframeVector.size();n++)
  306.         {
  307.             ((Wireframe)wireframeVector.elementAt(n)).rotate((y-prev_y)*FastMath.TWOPI/appletDimension.height,(x-prev_x)*FastMath.TWOPI/appletDimension.width,0);
  308.         }
  309.  
  310.         repaint();
  311.  
  312.         prev_x=x;
  313.         prev_y=y;
  314.  
  315.         return true;
  316.     }
  317.  
  318.     public boolean mouseDrag(Event event,int x,int y)
  319.     {
  320.         for(int n=0;n<wireframeVector.size();n++)
  321.         {
  322.             ((Wireframe)wireframeVector.elementAt(n)).rotate(0,0,(y-prev_y)*FastMath.TWOPI/appletDimension.height+(x-prev_x)*FastMath.TWOPI/appletDimension.width);
  323.         }
  324.  
  325.         repaint();
  326.  
  327.         prev_x=x;
  328.         prev_y=y;
  329.  
  330.         return true;
  331.     }
  332. }
  333.  
  334.