/*
* @(#)CollapseTransition2D.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 java.awt.Dimension;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.Vector;
/** In this transition the original image is split into 6 horizontal strips,
* and they collapse downward to reveal the next image underneath. Here is a playback sample:
* <p><img src="https://javagraphics.java.net/resources/transition/CollapseTransition2D/Collapse.gif" alt="CollapseTransition2D Demo">
*
*/
public class CollapseTransition2D extends Transition2D {
@Override
public Transition2DInstruction[] getInstructions(float progress,
Dimension size) {
progress = (float)Math.pow(progress,2);
float stripHeight = size.height/6;
Vector<Rectangle2D> v = new Vector<Rectangle2D>();
for(int y = 0; y<size.height; y+=stripHeight) {
v.add(new Rectangle2D.Float(0,y,size.width,stripHeight));
}
ImageInstruction[] instr = new ImageInstruction[v.size()+1];
instr[0] = new ImageInstruction(false);
for(int a = 0; a<v.size(); a++) {
Rectangle2D r = v.get(a);
AffineTransform transform = new AffineTransform();
float angleProgress = (float)Math.pow(progress, .6);
float xProgress = 1.0f/(1.0f+progress);
float k = (angleProgress)*(a)/(v.size());
float theta = (float)(Math.PI*k/2+(progress)*Math.PI/2);
if(theta>Math.PI/2) theta = (float)(Math.PI/2);
float k2;
theta = theta/(1+progress);
k2 = 1*progress;
if(a%2==0) {
transform.rotate(theta,-size.width*(1-xProgress*xProgress*xProgress)/2,size.height*k2);
} else {
transform.rotate(-theta,size.width+(1-xProgress*xProgress*xProgress)*size.width/2,size.height*k2);
}
transform.translate(0,progress*progress*size.height*1.5);
instr[a+1] = new ImageInstruction(true,transform,transform.createTransformedShape(r));
}
return instr;
}
@Override
public String toString() {
return "Collapse";
}
}