247 lines
8.1 KiB
Java
247 lines
8.1 KiB
Java
/*
|
|
* 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<min) {
|
|
x=min;
|
|
increment=positiveincrement;
|
|
} else {
|
|
x+=Math.signum(increment)*positiveincrement;
|
|
}
|
|
}
|
|
} else {
|
|
x+=Negative?-increment:increment;
|
|
}
|
|
E.setExpression(""+x, E.getConstruction());
|
|
// E.setSlider(false);
|
|
ZC.dovalidate();
|
|
ZC.repaint();
|
|
}
|
|
} catch (Exception ex) {
|
|
}
|
|
}
|
|
TH=null;
|
|
}
|
|
};
|
|
TH.setPriority(Thread.MIN_PRIORITY);
|
|
TH.start();
|
|
}
|
|
}
|