import java.applet.Applet; import java.awt.*; import java.awt.event.*; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.behaviors.keyboard.*; import javax.media.j3d.*; import javax.vecmath.*; public class Asukoht3a extends Applet { float x, y, z, uusx, uusy, uusz, nurk=0f, sammx, sammz, samm=-0.5f, nurgavahe=0.05f; //samm on negatiivne, kuna silmad on z-teljel miinuse poole. Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); SimpleUniverse u = new SimpleUniverse(c); TransformGroup tg=u.getViewingPlatform().getViewPlatformTransform(); Canvas tasapind=new Plaan(); Klahvikuular k=new Klahvikuular(); public Asukoht3a() { setLayout(new BorderLayout()); setLayout(new GridLayout(2, 1)); add(tasapind); add(c); BranchGroup juur = new BranchGroup(); for(int i=1; i<1000; i++){ Transform3D t3=new Transform3D(); t3.setTranslation(new Vector3f((float)(60*Math.random()-30), (float)(60*Math.random()-30), (float)(60*Math.random()-30))); TransformGroup tg=new TransformGroup(t3); tg.addChild(new ColorCube(0.3)); juur.addChild(tg); } juur.addChild(new ColorCube(2)); //suur kuup keskele c.addKeyListener(k); Background taust=new Background(new Color3f(new Color(200, 200, 255))); //sinine taust taust.setApplicationBounds(new BoundingSphere(new Point3d(), 1000)); juur.addChild(taust); u.addBranchGraph(juur); tasapind.addFocusListener(new FocusListener(){ public void focusGained(FocusEvent e){c.requestFocus();} public void focusLost(FocusEvent e){} }); //hoolitksetakse, et klahvidele reageeriv ruumilõuend saaks fookusesse. } double umarda(double arv, double koht){ return Math.round(arv*Math.pow(10, koht))/Math.pow(10, koht); } public static void main(String[] args) { Frame f=new Frame("Kuubid taevas"); f.add(new Asukoht3a()); f.setSize(400, 600); f.setVisible(true); } class Klahvikuular implements KeyListener{ public Klahvikuular(){ arvutaSamm(); } void arvutaSamm(){ sammz=(float)(Math.cos(nurk)*samm); sammx=(float)(Math.sin(nurk)*samm); } public void keyPressed(KeyEvent e){ int klahv=e.getKeyCode(); if(klahv==KeyEvent.VK_RIGHT){ //keerab paremale nurk-=nurgavahe; arvutaSamm(); } if(klahv==KeyEvent.VK_LEFT){ nurk+=nurgavahe; arvutaSamm(); } if(klahv==KeyEvent.VK_UP){ //edasi uusx+=sammx; uusz+=sammz; } if(klahv==KeyEvent.VK_DOWN){ uusx-=sammx; uusz-=sammz; } if(klahv==KeyEvent.VK_PAGE_UP)uusy=y-samm; //üles if(klahv==KeyEvent.VK_PAGE_DOWN)uusy=y+samm; prooviAstuda(); } void prooviAstuda(){ if(kasAsukohtSobib()){ omista(); liiguta(); tasapind.repaint(); } else { piiksu(); } } /** * Meetodi abil määratakse, kas uude arvutatud asukohta tohib kasutaja liikuda. */ boolean kasAsukohtSobib(){ if(uusy<10) return true; else return false; } void omista(){ x=uusx; y=uusy; z=uusz; } void liiguta(){ Transform3D t1=new Transform3D(); Transform3D t2=new Transform3D(); t1.set(new Vector3d(x, y, z)); t2.rotY(nurk); t1.mul(t2); tg.setTransform(t1); } void piiksu(){ Toolkit.getDefaultToolkit().beep(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } class Plaan extends Canvas{ public void paint(Graphics g){ g.setColor(new Color(230, 230, 230)); g.fillRect(0, 0, getWidth(), getHeight()); int keskx=getWidth()/2; int kesky=getHeight()/2; int varv=100+(int)(10*y); //vastavalt kõrgusele arvutatakse värv if(varv<10)varv=10; if(varv>240)varv=240; g.setColor(new Color(varv, 0, 0)); g.fillOval(keskx+(int)(2*x)-5, kesky+(int)(2*z)-5, 10, 10); g.setColor(Color.black); g.drawString("x="+(int)x+" y="+(int)y+" z="+(int)z+" : nurk="+umarda(nurk, 2)+ " sammx="+umarda(sammx, 2)+" sammz="+umarda(sammz, 2) , 10, 30); //koordinaate kirjeldav tekst g.drawLine( keskx+(int)(2*x), kesky+(int)(2*z), keskx+(int)(2*x+50*sammx), kesky+(int)(2*z+50*sammz) ); g.drawOval(keskx-5, kesky-5, 10, 10); } public void update(Graphics g){paint(g);} } }