001/** 002 * Copyright (c) 2011, The University of Southampton and the individual contributors. 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without modification, 006 * are permitted provided that the following conditions are met: 007 * 008 * * Redistributions of source code must retain the above copyright notice, 009 * this list of conditions and the following disclaimer. 010 * 011 * * Redistributions in binary form must reproduce the above copyright notice, 012 * this list of conditions and the following disclaimer in the documentation 013 * and/or other materials provided with the distribution. 014 * 015 * * Neither the name of the University of Southampton nor the names of its 016 * contributors may be used to endorse or promote products derived from this 017 * software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package org.openimaj.demos.image; 031 032import javax.swing.JFrame; 033 034import org.openimaj.demos.Demo; 035import org.openimaj.image.DisplayUtilities; 036import org.openimaj.image.MBFImage; 037import org.openimaj.image.colour.ColourSpace; 038import org.openimaj.image.colour.RGBColour; 039import org.openimaj.math.geometry.shape.Ellipse; 040import org.openimaj.math.geometry.transforms.TransformUtilities; 041 042import Jama.Matrix; 043 044/** 045 * Demonstrates affine transforms for shapes. 046 * 047 * @author Sina Samangooei (ss@ecs.soton.ac.uk) 048 * 049 * @created 15 Feb 2012 050 */ 051@Demo( 052 author = "Sina Samangooei", 053 description = "Demonstrates affine transforms for shapes.", 054 keywords = { "shape", "affine", "transform" }, 055 title = "Affine Shape Transforms", 056 icon = "/org/openimaj/demos/icons/image/affine-icon.png" 057) 058public class TestShapeTransforms { 059 private static Runnable displayUpdater; 060 private static JFrame frame; 061 private static double rotation = Math.PI*2/4; 062 private static Ellipse ellipse; 063 private static MBFImage image; 064 065 /** 066 * Default main 067 * @param args Command-line arguments 068 */ 069 public static void main(String args[]){ 070 ellipse = new Ellipse(400,400,100,50,0); 071 image = new MBFImage(800,800,ColourSpace.RGB); 072 frame = DisplayUtilities.display(image); 073 displayUpdater = new Runnable(){ 074 @Override 075 public void run() { 076 while(true){ 077 DisplayUtilities.display(image,frame); 078 update(); 079 try { 080 Thread.sleep(1000/30); 081 } catch (InterruptedException e) { 082 } 083 } 084 } 085 086 }; 087 Thread t = new Thread(displayUpdater); 088 t.start(); 089 } 090 091 private static void update() { 092 rotation += Math.PI/30; 093// int dx = 100; 094// int dy = 100; 095// float x = (float) (Math.cos(rotation) * dx + Math.sin(rotation) * dy); 096// float y = (float) (-Math.sin(rotation) * dx + Math.cos(rotation) * dy); 097 Matrix rotMat = TransformUtilities.rotationMatrixAboutPoint(rotation, ellipse.calculateCentroid().getX(), ellipse.calculateCentroid().getY()); 098// Matrix transMat = TransformUtilities.translateMatrix(x, y); 099 Matrix scaleMat = TransformUtilities.scaleMatrix(Math.abs(0.5 * Math.cos(rotation)) + 1, Math.abs(0.5 * Math.sin(rotation))+ 1); 100 Matrix scaledTrans = scaleMat.times(TransformUtilities.translateMatrix(-ellipse.calculateCentroid().getX(), -ellipse.calculateCentroid().getY())); 101 scaledTrans = TransformUtilities.translateMatrix(ellipse.calculateCentroid().getX(), ellipse.calculateCentroid().getY()).times(scaledTrans); 102 Matrix transform = Matrix.identity(3, 3); 103 transform = rotMat.times(transform); 104// transform = transMat.times(transform); 105// transform = scaledTrans.times(transform); 106 image.fill(RGBColour.BLACK); 107 image.createRenderer().drawShapeFilled(ellipse.transformAffine(transform), RGBColour.RED); 108 } 109 110}