/*
* @(#)SpiralTransition2D.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.BasicStroke;
import java.awt.Dimension;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import com.bric.geom.RectangularTransform;
import com.bric.geom.ShapeStringUtils;
import com.bric.geom.ShapeUtils;
/** In this transition a wobbling spiral grows to fill the entire
* frame; inside the shape is the incoming image. Here are playback samples:
* <p><table summary="Sample Animations of SpiralTransition2D" cellspacing="50" border="0"><tr>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/SpiralTransition2D/SpiralSprawl.gif" alt="Spiral Sprawl">
* <p>Spiral Sprawl
* </td>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/SpiralTransition2D/Spiral.gif" alt="Spiral">
* <p>Spiral
* </td>
* </tr></table>
*
*/
public class SpiralTransition2D extends Transition2D {
/** This public static method is used by the
* {@link com.bric.image.transition.Transition2DDemoHelper}
* class to create sample animations of this transition.
* @return the transitions that should be used to demonstrate this
* transition.
*/
public static Transition[] getDemoTransitions() {
return new Transition[] {
new SpiralTransition2D(false),
new SpiralTransition2D(true)
};
}
Shape spiral;
boolean sprawl = true;
Rectangle2D shapeBounds;
/** Creates a new spiral transition.
*
* @param sprawl whether the spiral rotates as the transition progresses
*
*/
public SpiralTransition2D(boolean sprawl) {
spiral = ShapeStringUtils.createGeneralPath("m 32.574 32.527 c 21.77 23.645 42.863 21.455 42.537 32.494 c 42.212 43.533 34.209 45.303 27.629 42.58 c 21.049 39.857 17.374 35.943 18.708 27.331 c 20.043 18.72 27.036 7.229 39.603 12.433 c 52.17 17.636 56.668 23.651 53.935 37.469 c 51.202 51.287 43.916 57.222 28.139 53.074 c 12.361 48.927 0.062 39.761 7.31 20.954 c 14.558 2.147 23.188 -2.412 40.942 0.083 c 58.696 2.579 69.57 20.663 64.804 38.565 c 60.038 56.468 53.063 66.173 28.941 64.198 c 4.82 62.224 -7.552 41.196 -6.927 32.645 c -6.303 24.094 -1.187 8.315 6.772 -1.593 z");
this.sprawl = sprawl;
shapeBounds = new Rectangle2D.Float(0,0,60,60);
}
@Override
public String toString() {
if(sprawl)
return "Spiral Sprawl";
return "Spiral";
}
public Shape getShape(float progress) {
if(sprawl) {
double theta = (1-progress)*3*Math.PI;
AffineTransform rotate = AffineTransform.getRotateInstance(theta,30,30);
return rotate.createTransformedShape(spiral);
}
return spiral;
}
@Override
public Transition2DInstruction[] getInstructions(float progress,Dimension size) {
Shape subShape = ShapeUtils.traceShape(getShape(progress),progress);
BasicStroke stroke = new BasicStroke(16.23f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
subShape = stroke.createStrokedShape(subShape);
Rectangle2D bigRect = new Rectangle2D.Float(0,0,size.width,size.height);
AffineTransform t = RectangularTransform.create(shapeBounds,bigRect);
subShape = t.createTransformedShape(subShape);
return new Transition2DInstruction[] {
new ImageInstruction(true),
new ImageInstruction(false,null,subShape)
};
}
}