Vi prøver igjen med litt knask for fysikklærarar med sans for klassiske fysikkproblem. Her er 3 skråplan utan friksjon (Her er trekanten 250m x 250m, men det er ikkje viktig). Velg knekkpunkt med museklikk. Finn knekkpunkt som gir maksimal tidsdifferans, og knekkpunkt når A og B brukar like lang tid ved å prøve ut simuleringa. Utfordring: Finn analytisk uttrykk for det samme! Send svar til redaktøren.
Web-programmet ditt kan ikkje vise simuleringa!

Har du julenøtter etter julestria? Store nøtter, eller småknask! Send inn til redaktøren.

Er du interessert i JAVA-programmering? Her er kjeldkoden utan komentarer:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;


public class Skraaplan extends Applet
    implements Runnable,MouseListener
{
    int hgde=400;
    int breidde=400;
    int x0=50;
    int y0=50;
    int x3=350;
    int y3=350;
    int x2=150;
    int y2=250;
    double vx=0;
    double vy=0;
    double ux=0;
    double uy=0;
    double s03=Math.sqrt((y3-y0)*(y3-y0)+(x3-x0)*(x3-x0));
    double sin03=(double)(y3-y0)/s03;
    double cos03=(double)(x3-x0)/s03;
    double s02=Math.sqrt((y2-y0)*(y2-y0)+(x2-x0)*(x2-x0));
    double sin02=(double)(y2-y0)/s02;
    double cos02=(double)(x2-x0)/s02;
    double s23=Math.sqrt((y3-y2)*(y3-y2)+(x3-x2)*(x3-x2));
    double sin23=(double)(y3-y2)/s23;
    double cos23=(double)(x3-x2)/s23;
    double a03=9.81*sin03;
    double a02=9.81*sin02;
    double a23=9.81*sin23;
    double s1=0;
    double s2=0;
    double s3=0;
    int xa=x0;
    int ya=y0;
    int xb=x0;
    int yb=y0;
    double t=0.0;
    double t2=0.0;
    double va=0.0;
    double ta=0;
    double tb=0;
    double tdiff=0;
    double x2rel=(double)(int)((double)(x2-x0)*100/(x3-x0))/100;
    double y2rel=(double)(int)((double)(y3-y2)*100/(y3-y0))/100;
    Thread mintraad;
   
   
    public void mouseClicked(MouseEvent e)
    {
        return;
    }
    public void mouseEntered(MouseEvent e)
    {
        return;
    }
    public void mouseExited(MouseEvent e)
    {
        return;
    }
    private void nullstill2()
    {
        vx=0;
        vy=0;
        ux=0;
        uy=0;
        s02=Math.sqrt((y2-y0)*(y2-y0)+(x2-x0)*(x2-x0));
        sin02=(double)(y2-y0)/s02;
        cos02=(double)(x2-x0)/s02;
        s23=Math.sqrt((y3-y2)*(y3-y2)+(x3-x2)*(x3-x2));
        sin23=(double)(y3-y2)/s23;
        cos23=(double)(x3-x2)/s23;
        a02=9.81*sin02;
        a23=9.81*sin23;
        s1=0;
        s2=0;
        s3=0;
        t=0.0;
        xb=x0;
        yb=x0;
        t2=0;
        va=0.0;
        xa=x0;
        ya=y0;
    }
    private void nullstill3()
    {
        s03=Math.sqrt((y3-y0)*(y3-y0)+(x3-x0)*(x3-x0));
        sin03=(double)(y3-y0)/s03;
        cos03=(double)(x3-x0)/s03;
        a03=9.81*sin03;
       
    }
           
    public void mousePressed(MouseEvent e)
    {
       
        return;
    }
    public void mouseReleased(MouseEvent e)
    {
        x2=e.getX();
        y2=e.getY();
        nullstill2();
        nullstill3();
        x2rel=(double)(int)((double)(x2-x0)*100/(x3-x0))/100;
        y2rel=(double)(int)((double)(y3-y2)*100/(y3-y0))/100;
        repaint();
        return;
    }
    public void init()
    {
        addMouseListener(this);
        nullstill2();
        nullstill3();
               
    }
    Image OffScreenImage;
    public void update(Graphics g)
    {
        if (OffScreenImage==null)
            OffScreenImage=createImage(hgde,breidde);
        Graphics offScreenGraphics=OffScreenImage.getGraphics();
        offScreenGraphics.setColor(getBackground());
        offScreenGraphics.fillRect(0,0,hgde,breidde);
        offScreenGraphics.setColor(getForeground());
        paint(offScreenGraphics);
        g.drawImage(OffScreenImage,0,0,this);
        offScreenGraphics.dispose();
    }
   
    public void paint(Graphics g)
    {
        g.drawLine(x0,y0,x0,y3);
        g.drawLine(x0,y3,x3,y3);
        g.drawLine(x3,y3,x0,y0);
        g.drawLine(x0,y0,x2,y2);
        g.drawLine(x2,y2,x3,y3);
        g.drawString("Velg knekkpunkt med museklikk",50,15);
        g.drawString("("+x2rel+","+y2rel+")",x2-25,y2+25);
        g.drawString("A",xa,ya);
        g.drawString("B",xb,yb);
        if (tdiff!=0) g.drawString("Diff="+tdiff+"sek",x3-50,y3+30);
        g.drawString("2000, L.O.Tveita",breidde-100,hgde);
    }
   
    public void start()
    {
        if (mintraad==null)
        {
            mintraad=new Thread(this);
            mintraad.start();
        }
    }
    public void stop()
    {
        if (mintraad!=null)
        {
            mintraad.stop();
            mintraad=null;
        }
    }
               
    public void run()
    {
        while(true)
            {
                try
                {
                   
                    Thread.sleep(50);
                    if((xa<x3)&&(xb<x3)){
                        t=t+0.05;
                        s1=0.5*a03*t*t;
                        if(s1<s03){
                            xa=x0+(int)(s1*cos03);
                            ya=y0+(int)(s1*sin03);
                            ta=t;
                        }
                        s2=0.5*a02*t*t;
                        s3=va*(t-t2)+0.5*a23*(t-t2)*(t-t2);
                        if(s2<=s02){
                            t2=t;
                            xb=x0+(int)(s2*cos02);
                            yb=y0+(int)(s2*sin02);
                            va=a02*t;
                            tb=t;
                        }
                        else if(s3<s23){
                            xb=x2+(int)(s3*cos23);
                            yb=y2+(int)(s3*sin23);
                            tb=t;
                        }
                        tdiff=((double)(int)((ta-tb)*100))/100;
                        repaint();
                    }
                    else stop();   
                }
                catch(InterruptedException e)
                {
                    stop();
                }
        }
                           
    }
}