/*
* @(#)WeaveTransition2D.java
*
* $Date: 2014-06-06 20:04:49 +0200 (P, 06 jún. 2014) $
*
* Copyright (c) 2011 by Jeremy Wood.
* All rights reserved.
*
* The copyright of this software is owned by Jeremy Wood.
* You may not use, copy or modify this software, except in
* accordance with the license agreement you entered into with
* Jeremy Wood. For details see accompanying license terms.
*
* This software is probably, but not necessarily, discussed here:
* https://javagraphics.java.net/
*
* That site should also contain the most recent official version
* of this software. (See the SVN repository for more details.)
*/
package com.bric.image.transition;
import net.jafama.FastMath;
import java.awt.Dimension;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.Vector;
/** This paints the incoming frame in thin horizontal strips that slide
* into place. Here is a playback sample:
* <p><img src="https://javagraphics.java.net/resources/transition/WeaveTransition2D/Weave.gif" alt="WeaveTransition2D Demo">
*
*/
public class WeaveTransition2D extends Transition2D {
/** Creates a new weave transition */
public WeaveTransition2D() {
}
@Override
public Transition2DInstruction[] getInstructions(float progress,
Dimension size) {
float stripHeight = 5;
progress = (float)(-1.6666666666666186*progress*progress+2.6666666666666203*progress);
float progress2 = (float)Math.pow(1-progress,3)*.5f+(1-progress)*.5f;
if(progress>1)
progress2 = (float)Math.pow(1-progress,2);
float dip = -(2*progress-1)*(2*progress-1)+1;
Vector<Rectangle2D> v = new Vector<Rectangle2D>();
for(int y = size.height; y>-stripHeight; y-=stripHeight) {
v.add(new Rectangle2D.Float(0,y,size.width,stripHeight));
}
Transition2DInstruction[] instr = new Transition2DInstruction[v.size()+1];
instr[0] = new ImageInstruction(true);
for(int a = 0; a<v.size(); a++) {
Rectangle2D r = v.get(a);
AffineTransform transform = new AffineTransform();
float dx = (float) (FastMath.sin(.5 * Math.PI * (1 - progress)) * size.width);
float k = (progress2)*(1000*dip)*(a)/(v.size());
dx = dx+k;
if(a%2==0) {
transform.translate(dx,0);
} else {
transform.translate(-dx,0);
}
instr[a+1] = new ImageInstruction(false,transform,transform.createTransformedShape(r));
}
return instr;
}
@Override
public String toString() {
return "Weave";
}
}