svn-gvsig-desktop / import / ext3D / branches / ext3D_v1.1 / libAnimation / src / com / iver / cit / gvsig / animation / test / Interpolator2D.java @ 15414
History | View | Annotate | Download (2.13 KB)
1 |
package com.iver.cit.gvsig.animation.test; |
---|---|
2 |
|
3 |
import java.awt.geom.Rectangle2D; |
4 |
import java.util.List; |
5 |
|
6 |
import com.iver.cit.gvsig.animation.keyframe.IInterpolator; |
7 |
import com.iver.cit.gvsig.animation.keyframe.IKeyFrame; |
8 |
import com.iver.cit.gvsig.fmap.ViewPort; |
9 |
import com.iver.cit.gvsig.project.documents.view.gui.View; |
10 |
|
11 |
public class Interpolator2D implements IInterpolator { |
12 |
|
13 |
public View view; |
14 |
|
15 |
public IKeyFrame interpolate(List kfList, int index, double time) { |
16 |
KeyFrame2D KF = new KeyFrame2D();
|
17 |
|
18 |
if (kfList == null) |
19 |
return null; |
20 |
|
21 |
if (this.view == null) |
22 |
return null; |
23 |
|
24 |
switch (kfList.size()) {
|
25 |
// this case when there are only has 2 keyframes
|
26 |
case 2: |
27 |
// getting the keyframes
|
28 |
KeyFrame2D kf1 = (KeyFrame2D) kfList.get(0);
|
29 |
KeyFrame2D kf2 = (KeyFrame2D) kfList.get(1);
|
30 |
|
31 |
if (index == 1) { |
32 |
KeyFrame2D kaux = kf1; |
33 |
kf1 = kf2; |
34 |
kf2 = kaux; |
35 |
} |
36 |
|
37 |
ViewPort vp1 = (ViewPort) kf1.getAnimatedObject(); |
38 |
ViewPort vp2 = (ViewPort) kf2.getAnimatedObject(); |
39 |
|
40 |
ViewPort vp = view.getMapControl().getViewPort(); |
41 |
|
42 |
double left = linearInterpolate(vp1.getExtent().getMinX(), vp2
|
43 |
.getExtent().getMinX(), kf1.getTime(), kf2.getTime(), time); |
44 |
double top = linearInterpolate(vp1.getExtent().getMinX(), vp2
|
45 |
.getExtent().getMinX(), kf1.getTime(), kf2.getTime(), time); |
46 |
double right = linearInterpolate(vp1.getExtent().getMinX(), vp2
|
47 |
.getExtent().getMinX(), kf1.getTime(), kf2.getTime(), time); |
48 |
double bottom = linearInterpolate(vp1.getExtent().getMinX(), vp2
|
49 |
.getExtent().getMinX(), kf1.getTime(), kf2.getTime(), time); |
50 |
|
51 |
Rectangle2D newExtent = new Rectangle2D.Double(left, top, right |
52 |
- left, bottom - top); |
53 |
|
54 |
vp.setExtent(newExtent); |
55 |
break;
|
56 |
|
57 |
} |
58 |
|
59 |
return KF;
|
60 |
} |
61 |
|
62 |
private double linearInterpolate(double minX, double minX2, double timePos, |
63 |
double timePos2, double time) { |
64 |
// P1 + (P2-P1)*((t-t1)/(t2-t1))
|
65 |
return (minX + (minX2 - minX)
|
66 |
* ((time - timePos) / (timePos2 - timePos))); |
67 |
} |
68 |
|
69 |
public Object getAnimatedObject() { |
70 |
|
71 |
return this.view; |
72 |
} |
73 |
|
74 |
public void setAnimatedObject(Object ani) { |
75 |
this.view = (View) ani; |
76 |
|
77 |
} |
78 |
} |