/* * @(#)KaleidoscopeTransition2D.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.Point2D; import java.awt.geom.Rectangle2D; import java.util.Vector; /** This resembles looking through a kaleidoscope. Here is a playback sample: * <p><img src="https://javagraphics.java.net/resources/transition/KaleidoscopeTransition2D/Kaleidoscope.gif" alt="KaleidoscopeTransition2D Demo"> */ public class KaleidoscopeTransition2D extends Transition2D { @Override public Transition2DInstruction[] getInstructions(float progress, Dimension size) { Vector<Rectangle2D> v1 = new Vector<Rectangle2D>(); Vector<Transition2DInstruction> v2 = new Vector<Transition2DInstruction>(); float factor = .2f; float ySize = (size.height)*factor; float xSize = (size.width)*factor; for(float y = 0; y<size.height; y+=ySize) { for(float x = 0; x<size.width; x+=xSize) { v1.add(new Rectangle2D.Float(x,y,xSize,ySize)); } } progress = 1-progress; Point2D p1, p2; v2.add( new ImageInstruction(false) ); float dx = 10; //(float)(0*FastMath.cos(2*(1-progress)*Math.PI)); float dy = 10; //(float)(0*FastMath.sin(2*(1-progress)*Math.PI)); for(int a = 0; a<v1.size(); a++) { try { Rectangle2D r = v1.get(a); p1 = new Point2D.Double(r.getCenterX(),r.getCenterY()); AffineTransform transform = new AffineTransform(); transform.setToRotation(-2*Math.PI*(1-Math.sqrt(progress)),size.width/2+dx,size.height/2+dy); transform.translate(size.width/2, size.height/2); transform.scale(progress*progress, progress*progress); transform.translate(-size.width/2, -size.height/2); p2 = new Point2D.Double(); transform.transform(p1,p2); transform.setToTranslation(p2.getX()-p1.getX(),p2.getY()-p1.getY()); v2.add( new ImageInstruction(false,progress,transform.createInverse(),r) ); transform.setToRotation(-2*Math.PI*(1-Math.sqrt(progress)),size.width/2+dx,size.height/2+dy); p2 = new Point2D.Double(); transform.transform(p1,p2); transform.setToTranslation(p2.getX()-p1.getX(),p2.getY()-p1.getY()); v2.add( new ImageInstruction(true,progress*progress,transform.createInverse(),r) ); } catch(Exception e) { } } return v2.toArray(new Transition2DInstruction[v2.size()]); } @Override public String toString() { return "Kaleidoscope"; } }