import java.awt.*; import java.applet.Applet; import java.awt.event.*; /* Ekraanil liigub ring põrgates servadest. Lisaks sellele liigutab kasutaja klahvidega diagonaalis kaldu asuvat joont. Ring põrkab ka küljega vastu joont sattudes. */ public class P6rgatajaX extends PuhverApplet implements Runnable, KeyListener{ Thread t; Dimension sz; Ring o = new Ring(100, 100, 30, 5*Math.random(), 5*Math.random() ); L6ik j = new L6ik(100, 200, 250, 50); public P6rgatajaX(){ init(); } public void init(){ addKeyListener(this); requestFocus(); t = new Thread(this); t.start(); } public boolean isFocusTraversable(){ return true; } public void keyPressed(KeyEvent e){ int kood=e.getKeyCode(); if(kood==KeyEvent.VK_LEFT) j.translate(-1,0); if(kood==KeyEvent.VK_RIGHT) j.translate(1,0); if(kood==KeyEvent.VK_UP) j.translate(0,-1); if(kood==KeyEvent.VK_DOWN) j.translate(0,1); //repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} public void nextStep(){ //siin arvutakse uus olukord. int vasak = 0, ylal = 0, parem = sz.width, all = sz.height; // kuhu läheb ring omatahtsi o.step(); // kas põrge servadest if (o.x + o.r > parem) o.v.x = -Math.abs(o.v.x); if (o.y + o.r > all) o.v.y = -Math.abs(o.v.y); if (o.left() < vasak) o.v.x = Math.abs(o.v.x); if (o.top() < ylal) o.v.y = Math.abs(o.v.y); // kas põrge joonega: //kas lõigu sihile lähedal if (j.punktiKaugus(o) < o.r) { double oa = o.kaugus(j.a); double ob = o.kaugus(j.b); double ab = j.a.kaugus(j.b); //kas lõigu kohal if (oa < ab && ob < ab) { Punkt oproj = j.proj(o); Punkt v = oproj .plus (o.v); Punkt p = j.proj(v) .minus (v); o.v.add(p .plus (p)); } else // kas lõigu otste ligidal if (oa < o.r) { // a ligidal L6ik l = new L6ik(o, j.a); Punkt p = l.proj(o.plus(o.v)).minus(o); o.v.sub(p .plus (p)); } else if (ob < o.r) { // b ligidal L6ik l = new L6ik(o, j.b); Punkt p = l.proj(o.plus(o.v)).minus(o); o.v.sub(p .plus (p)); } } } public void koostaPilt(Graphics g){ g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.black); g.drawOval(o.left(), o.top(), 2*o.r(), 2*o.r()); g.drawLine(j.a.x(), j.a.y(), j.b.x(), j.b.y()); } public void run(){ t.setPriority(Thread.NORM_PRIORITY-2); while(true){ sz = getSize(); nextStep(); repaint(); Thread.yield(); try{Thread.sleep(50);}catch(Exception e){} } } public static void main(String argumendid[]){ Frame f = new Frame("Põrgataja"); f.add(new P6rgatajaX()); f.setSize(220, 220); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.out.println("Programmi ots"); System.exit(0); } }); } } class Ring extends Punkt{ Punkt v; //kiirus e. nihe double r = 0; //radius public Ring(int x, int y, int r, double dx, double dy){ super(x, y); this.r = r; v = new Punkt(dx, dy); } public void step(){ //arvutab uued koordinaadid x += v.x; y += v.y; } public int r(){ return (int)r; } public int left(){ return (int)(x-r); } public int top(){ return (int)(y-r); } } class L6ik { Punkt a, b; protected double A, B, C, A2pB2, yldv; public L6ik(double x1, double y1, double x2, double y2){ a = new Punkt(x1, y1); b = new Punkt(x2, y2); } public L6ik(Punkt p1, Punkt p2){ a = new Punkt(p1.x, p1.y); b = new Punkt(p2.x, p2.y); } public void translate(double dx, double dy){ Punkt p = new Punkt(dx, dy); a.add(p); b.add(p); } public void arvutaABC(Punkt c){ A = b.y - a.y; B = a.x - b.x; C = a.y * (b.x - a.x) - a.x * (b.y - a.y); A2pB2 = A*A + B*B; yldv = (A * c.x + B * c.y + C); } public double punktiKaugus(Punkt c){ //punkti kaugus sirgest arvutaABC(c); return Math.abs(yldv /(Math.sqrt( A2pB2 ))); } public Punkt proj(Punkt c){ //punkti projektsioon sirgel Punkt d = new Punkt(); arvutaABC(c); d.x = c.x - (A / A2pB2) * yldv; d.y = c.y - (B / A2pB2) * yldv; return d; } } class Punkt { double x, y; public Punkt(){ this(0, 0); } public Punkt(double x, double y){ this.x = x; this.y = y; } public Punkt plus(Punkt p){ return new Punkt(x + p.x, y + p.y); } public Punkt minus(Punkt p){ return new Punkt(x - p.x, y - p.y); } public double kaugus(Punkt c){ //punkti kaugus teisest. Punkt d = minus(c); return Math.sqrt(d.x * d.x + d.y * d.y); } public void add(Punkt p){ x += p.x; y += p.y; } public void sub(Punkt p){ x -= p.x; y -= p.y; } public int x(){ return (int)x; } public int y(){ return (int)y; } }