/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package eric.animations; import rene.zirkel.ZirkelCanvas; import rene.zirkel.objects.ConstructionObject; import rene.zirkel.objects.ExpressionObject; import rene.zirkel.objects.PointObject; import rene.zirkel.objects.PrimitiveCircleObject; import rene.zirkel.objects.SegmentObject; /** * * @author erichake */ public class Animation { private ZirkelCanvas ZC; private ConstructionObject O=null; private String ObjectName; private AnimationPanel PANEL; private boolean Negative=false; private Thread TH=null; private boolean thread_alive=true; private double min, max, positiveincrement, parts=100;//For slider Expressions public Animation(ZirkelCanvas zc, AnimationPanel panel, ConstructionObject o) { ZC=zc; O=o; PANEL=panel; ObjectName=O.getName(); } public Animation(ZirkelCanvas zc, AnimationPanel panel, String objectname) { ZC=zc; ObjectName=objectname; PANEL=panel; } public boolean getNegative() { return Negative; } public void setNegative(boolean neg) { Negative=neg; } public String getObjectName() { return ObjectName; } public ConstructionObject getObject() { if (O==null) { O=ZC.getConstruction().find(ObjectName); } return O; } public void killThread() { thread_alive=false; } public void run() { if (TH!=null) { return; } O=getObject(); if (O==null) { return; } if (O instanceof PointObject) { runPoint(); } else if (O instanceof ExpressionObject) { runExpression(); } } public void runPoint() { TH=new Thread() { public void run() { boolean back=false; double x=0; final ZirkelCanvas canvas=ZC; PointObject P=(PointObject) O; double x0=P.getX(); double y0=P.getY(); if (P.getBound() instanceof SegmentObject) { SegmentObject s=(SegmentObject) P.getBound(); x=Math.sqrt((x0-s.getP1().getX())*(x0-s.getP1().getX())+(y0-s.getP1().getY())*(y0-s.getP1().getY())); }else if (P.getBound() instanceof PrimitiveCircleObject) { PrimitiveCircleObject c=(PrimitiveCircleObject) P.getBound(); x=Math.acos((x0-c.getX())/c.getR())*Math.signum(y0-c.getY()); } if (P.getBound()==null) { return; } if (!(P.getBound() instanceof SegmentObject)&&!(P.getBound() instanceof PrimitiveCircleObject)) { return; } long time=System.currentTimeMillis(); while ((!PANEL.isStopped())&&(thread_alive)) { try { final long t=System.currentTimeMillis(); double d=PANEL.getDelay(); int h=(int) (t-time); if (h<0) { h=0; } if (h>d) { h=(int) d; } Thread.sleep((int) (d-h)); time=System.currentTimeMillis(); } catch (final Exception ex) { } if (P.getBound() instanceof SegmentObject) { final SegmentObject s=(SegmentObject) P.getBound(); synchronized (canvas) { if (back) { O.move(s.getP1().getX()+(s.getLength()-x) *s.getDX(), s.getP1().getY() +(s.getLength()-x)*s.getDY()); } else { O.move(s.getP1().getX()+x*s.getDX(), s.getP1().getY() +x*s.getDY()); } ZC.dovalidate(); ZC.repaint(); x+=ZC.dx(2); if (x>s.getLength()) { back=!back; x=0; } } } else if (P.getBound() instanceof PrimitiveCircleObject) { final PrimitiveCircleObject c=(PrimitiveCircleObject) P.getBound(); synchronized (canvas) { O.move(c.getP1().getX()+Math.cos(x) *c.getR(), c.getP1().getY() +Math.sin(x)*c.getR()); ZC.dovalidate(); ZC.repaint(); if (Negative) { x-=ZC.dx(2)/c.getR(); } else { x+=ZC.dx(2)/c.getR(); } } } } TH=null; } }; TH.setPriority(Thread.MIN_PRIORITY); TH.start(); } public void initSlidersParameters(ExpressionObject E) { min=E.getMinValue(); max=E.getMaxValue(); positiveincrement=(max-min)/parts; } public void runExpression() { TH=new Thread() { public void run() { final ZirkelCanvas canvas=ZC; ExpressionObject E=(ExpressionObject) O; double x; try { x = E.getValue(); } catch (Exception ex) { x=0; } double increment=1; long time=System.currentTimeMillis(); while ((!PANEL.isStopped())&&(thread_alive)) { try { final long t=System.currentTimeMillis(); double d=PANEL.getDelay(); int h=(int) (t-time); if (h<0) { h=0; } if (h>d) { h=(int) d; } Thread.sleep((int) (d-h)); time=System.currentTimeMillis(); } catch (final Exception ex) { } try { synchronized (canvas) { if (E.isSlider()) { initSlidersParameters(E); if (Negative) { if (x>max) { x=min; } else { x+=positiveincrement; } } else { if (x>max) { x=max; increment=-positiveincrement; } else if (x